| | |
| | | |
| | | @GetMapping("/idempotency/token") |
| | | @ApiOperation("获取一次性防重复提交 Token") |
| | | public Result<Object> getIdempotencyToken(@RequestParam(required = false) Long userId) { |
| | | public Result<Object> getIdempotencyToken(@RequestParam(required = false) String userId) { |
| | | try { |
| | | String token = tokenService.generateToken(userId); |
| | | return Result.success("token生成",token); |
| | |
| | | @ApiParam("附件地址") @RequestParam @NotBlank String fileUrl, |
| | | @ApiParam("存储桶名称") @RequestParam String bucketName, |
| | | @ApiParam("对象名称") @RequestParam String objectName, |
| | | @ApiParam("上传用户ID") @RequestParam @NotNull Long uploadUserId, |
| | | @ApiParam("上传用户ID") @RequestParam @NotNull String uploadUserId, |
| | | @ApiParam("上传用户名") @RequestParam @NotBlank String uploadUserName, |
| | | @ApiParam("附件类型") @RequestParam String attachmentType, |
| | | @ApiParam("附件描述") @RequestParam String description) { |
| | |
| | | @ApiOperation("添加订单评价") |
| | | public Result<Boolean> addOrderEvaluation( |
| | | @ApiParam("订单ID") @RequestParam @NotBlank String orderId, |
| | | @ApiParam("评价人ID") @RequestParam @NotNull Long evaluatorId, |
| | | @ApiParam("评价人ID") @RequestParam @NotNull String evaluatorId, |
| | | @ApiParam("评价人姓名") @RequestParam @NotBlank String evaluatorName, |
| | | @ApiParam("评价人类型") @RequestParam @NotBlank String evaluatorType, |
| | | @ApiParam("评价内容") @RequestParam @NotBlank String content, |
| | |
| | | |
| | | @ApiModelProperty("审批人ID") |
| | | @NotNull(message = "审批人ID不能为空") |
| | | private Long approverId; |
| | | private String approverId; |
| | | |
| | | @ApiModelProperty("审批人姓名") |
| | | @NotBlank(message = "审批人姓名不能为空") |
| | |
| | | |
| | | @ApiModelProperty("审批人ID") |
| | | @TableField("approver_id") |
| | | private Long approverId; |
| | | private String approverId; |
| | | |
| | | @ApiModelProperty("审批人姓名") |
| | | @TableField("approver_name") |
| | |
| | | |
| | | @ApiModelProperty("上传用户ID") |
| | | @TableField("upload_user_id") |
| | | private Long uploadUserId; |
| | | private String uploadUserId; |
| | | |
| | | @ApiModelProperty("上传用户名") |
| | | @TableField("upload_user_name") |
| | |
| | | |
| | | @ApiModelProperty("评价人ID") |
| | | @TableField("evaluator_id") |
| | | private Long evaluatorId; |
| | | private String evaluatorId; |
| | | |
| | | @ApiModelProperty("评价人姓名") |
| | | @TableField("evaluator_name") |
| | |
| | | */ |
| | | Long uploadOrderAttachment(String orderId, String fileName, String originalName, |
| | | String fileType, Long fileSize, String fileUrl, |
| | | String bucketName, String objectName, Long uploadUserId, |
| | | String bucketName, String objectName, String uploadUserId, |
| | | String uploadUserName, String attachmentType, String description); |
| | | |
| | | /** |
| | | * 添加订单评价 |
| | | */ |
| | | boolean addOrderEvaluation(String orderId, Long evaluatorId, String evaluatorName, |
| | | boolean addOrderEvaluation(String orderId, String evaluatorId, String evaluatorName, |
| | | String evaluatorType, String content, Integer rating, |
| | | Integer serviceRating, Integer qualityRating, Integer deliveryRating, |
| | | Boolean isAnonymous); |
| | |
| | | * @param userId 可选的用户ID,仅用于追踪 |
| | | * @return token 字符串 |
| | | */ |
| | | String generateToken(Long userId); |
| | | String generateToken(String userId); |
| | | |
| | | /** |
| | | * 校验并消费 Token(一次性)。成功返回 true,失败/不存在/过期返回 false。 |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long uploadOrderAttachment(String orderId, String fileName, String originalName, |
| | | String fileType, Long fileSize, String fileUrl, |
| | | String bucketName, String objectName, Long uploadUserId, |
| | | String bucketName, String objectName, String uploadUserId, |
| | | String uploadUserName, String attachmentType, String description) { |
| | | // 参数校验 |
| | | if (!StringUtils.hasText(orderId)) { |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean addOrderEvaluation(String orderId, Long evaluatorId, String evaluatorName, |
| | | public boolean addOrderEvaluation(String orderId, String evaluatorId, String evaluatorName, |
| | | String evaluatorType, String content, Integer rating, |
| | | Integer serviceRating, Integer qualityRating, Integer deliveryRating, |
| | | Boolean isAnonymous) { |
| | |
| | | try { |
| | | // 1. 删除订单附件(包括MinIO文件和数据库记录) |
| | | log.info("开始删除订单附件,订单ID: {}", orderId); |
| | | List<OrderAttachment> attachments = orderAttachmentMapper.selectByOrderId(orderId); |
| | | for (OrderAttachment attachment : attachments) { |
| | | try { |
| | | // 删除MinIO中的文件 |
| | | if (StringUtils.hasText(attachment.getObjectName())) { |
| | | log.info("删除MinIO文件,对象名称: {}", attachment.getObjectName()); |
| | | minioService.deleteFile(attachment.getObjectName()); |
| | | } |
| | | // 删除数据库记录 |
| | | orderAttachmentMapper.deleteById(attachment.getId()); |
| | | log.info("删除附件记录成功,附件ID: {}", attachment.getId()); |
| | | } catch (Exception e) { |
| | | log.error("删除附件失败,附件ID: {}, 错误: {}", attachment.getId(), e.getMessage()); |
| | | // 继续删除其他附件,不中断整个流程 |
| | | } |
| | | } |
| | | // List<OrderAttachment> attachments = orderAttachmentMapper.selectByOrderId(orderId); |
| | | // for (OrderAttachment attachment : attachments) { |
| | | // try { |
| | | // // 删除MinIO中的文件 |
| | | // if (StringUtils.hasText(attachment.getObjectName())) { |
| | | // log.info("删除MinIO文件,对象名称: {}", attachment.getObjectName()); |
| | | // minioService.deleteFile(attachment.getObjectName()); |
| | | // } |
| | | // // 删除数据库记录 |
| | | // orderAttachmentMapper.deleteById(attachment.getId()); |
| | | // log.info("删除附件记录成功,附件ID: {}", attachment.getId()); |
| | | // } catch (Exception e) { |
| | | // log.error("删除附件失败,附件ID: {}, 错误: {}", attachment.getId(), e.getMessage()); |
| | | // // 继续删除其他附件,不中断整个流程 |
| | | // } |
| | | // } |
| | | |
| | | // 2. 逻辑删除订单详情 |
| | | log.info("开始逻辑删除订单详情,订单ID: {}", orderId); |
| | | // log.info("开始逻辑删除订单详情,订单ID: {}", orderId); |
| | | // 先查询订单详情列表,然后逐个逻辑删除 |
| | | List<OrderDetail> orderDetails = orderDetailMapper.selectByOrderId(orderId); |
| | | int detailDeleted = 0; |
| | | for (OrderDetail detail : orderDetails) { |
| | | int result = orderDetailMapper.deleteById(detail.getId()); |
| | | if (result > 0) { |
| | | detailDeleted++; |
| | | } |
| | | } |
| | | log.info("逻辑删除订单详情完成,影响行数: {}", detailDeleted); |
| | | // List<OrderDetail> orderDetails = orderDetailMapper.selectByOrderId(orderId); |
| | | // int detailDeleted = 0; |
| | | // for (OrderDetail detail : orderDetails) { |
| | | // int result = orderDetailMapper.deleteById(detail.getId()); |
| | | // if (result > 0) { |
| | | // detailDeleted++; |
| | | // } |
| | | // } |
| | | // log.info("逻辑删除订单详情完成,影响行数: {}", detailDeleted); |
| | | |
| | | // 3. 删除订单信息(逻辑删除) |
| | | log.info("开始删除订单信息,订单ID: {}", orderId); |
| | | int orderDeleted = this.baseMapper.deleteById(orderId); |
| | | log.info("删除订单信息完成,影响行数: {}", orderDeleted); |
| | | // log.info("开始删除订单信息,订单ID: {}", orderId); |
| | | // int orderDeleted = this.baseMapper.deleteById(orderId); |
| | | // log.info("删除订单信息完成,影响行数: {}", orderDeleted); |
| | | // 更新订单状态为已完成 |
| | | orderInfo.setOrderStatus("已取消"); |
| | | orderInfo.setUpdatedAt(LocalDateTime.now()); |
| | | int orderDeleted = this.baseMapper.updateById(orderInfo); |
| | | |
| | | if (orderDeleted > 0) { |
| | | log.info("订单取消成功,订单ID: {}", orderId); |
| | | return true; |
| | | } else { |
| | | log.error("删除订单信息失败,影响行数为0,订单ID: {}", orderId); |
| | | log.error("更新订单信息失败,影响行数为0,订单ID: {}", orderId); |
| | | throw new BusinessException("删除订单信息失败"); |
| | | } |
| | | } catch (Exception e) { |
| | |
| | | private RedisTemplate<String, Object> redisTemplate; |
| | | |
| | | @Override |
| | | public String generateToken(Long userId) { |
| | | public String generateToken(String userId) { |
| | | String token = UUID.randomUUID().toString().replace("-", ""); |
| | | String key = IDEMPOTENCY_TOKEN_PREFIX + token; |
| | | // 值不重要,设置一个标记即可 |
| | |
| | | endpoint: http://192.168.20.52:9000 |
| | | access-key: minioadmin |
| | | secret-key: AES:c4d4cefddd95e6733df755af0e29839c104ee8baa55eb53cdc24 |
| | | part-size: 104857600 |
| | | # part-size: 104857600 |
| | | bucket-name: dev |
| | | |
| | | |
| | |
| | | port: 8089 |
| | | servlet: |
| | | context-path: /admin |
| | | tomcat: |
| | | max-swallow-size: 500MB |
| | | |
| | | spring: |
| | | application: |
| | |
| | | #mcv配置 |
| | | mvc: |
| | | pathmatch: |
| | | matching-strategy: ant_path_matcher |
| | | matching-strategy: ant_path_matcher |
| | | servlet: |
| | | multipart: |
| | | max-file-size: 500MB |
| | | max-request-size: 500MB |
| | | |
| | | # MyBatis Plus配置 |
| | | mybatis-plus: |
| | |
| | | <include refid="Base_Column_List"/> |
| | | FROM tb_order_info |
| | | WHERE deleted = 0 |
| | | AND order_status IN ('待上传文件', '待审批授权','待授权', '待交易确认', '已完成', '已取消') |
| | | AND order_status IN ('待审批授权','待授权', '待交易确认', '已完成', '已取消') |
| | | <if test="orderStatus != null and orderStatus != ''"> |
| | | AND order_status = #{orderStatus} |
| | | </if> |
| | |
| | | <include refid="Base_Column_List"/> |
| | | FROM tb_order_info |
| | | WHERE deleted = 0 |
| | | AND order_status IN ('待上传文件', '待授权', '待审批授权', '待交易确认', '已完成', '已取消') |
| | | AND order_status IN ('待授权', '待审批授权', '待交易确认', '已完成', '已取消') |
| | | <if test="orderStatus != null and orderStatus != ''"> |
| | | AND order_status = #{orderStatus} |
| | | </if> |