Przeglądaj źródła

异常上报初步完成;服务列表完成渲染

Huanyi 1 miesiąc temu
rodzic
commit
8a62f87826
34 zmienionych plików z 839 dodań i 116 usunięć
  1. 1 0
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteOrderService.java
  2. 9 0
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteSubOrderService.java
  3. 4 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java
  4. 6 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  5. 2 0
      ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/constants/LockContants.java
  6. 35 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfAnamalyController.java
  7. 6 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfFulfillerController.java
  8. 69 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfAnamaly.java
  9. 62 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/bo/FlfAnamalyAddBo.java
  10. 66 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/bo/FlfAnamalyBo.java
  11. 14 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/bo/FlfAnamalyPageBo.java
  12. 88 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfAnamalyVo.java
  13. 20 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfFulfilllerListByNameAndPhoneNumberVo.java
  14. 18 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/FlfAnamalyStatusEnum.java
  15. 15 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/mapper/FlfAnamalyMapper.java
  16. 14 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfAnamalyService.java
  17. 3 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfFulfillerService.java
  18. 109 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfAnamalyServiceImpl.java
  19. 23 1
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfFulfillerServiceImpl.java
  20. 2 2
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/SysSubOrderLog.java
  21. 3 3
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderClockInBo.java
  22. 2 2
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderLogBo.java
  23. 2 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteOrderServiceImpl.java
  24. 49 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteSubOrderServiceImpl.java
  25. 0 24
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogActionTypeEnum.java
  26. 17 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogFulfillerStepEnum.java
  27. 20 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogSystemStepEnum.java
  28. 2 3
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderStatusEnum.java
  29. 104 13
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysOrderServiceImpl.java
  30. 40 65
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysSubOrderServiceImpl.java
  31. 2 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/dubbo/RemoteSysServiceServiceImpl.java
  32. 8 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/service/impl/SysServiceServiceImpl.java
  33. 6 3
      ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties
  34. 18 0
      script/sql/business/create.sql

+ 1 - 0
ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteOrderService.java

@@ -2,4 +2,5 @@ package org.dromara.order.api;
 
 
 public interface RemoteOrderService {
 public interface RemoteOrderService {
     String getCodeById(Long id);
     String getCodeById(Long id);
+
 }
 }

+ 9 - 0
ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteSubOrderService.java

@@ -0,0 +1,9 @@
+package org.dromara.order.api;
+
+import java.util.List;
+
+public interface RemoteSubOrderService {
+    List<Long> getIdsByCode(String code);
+
+    Long getIdByCode(String code);
+}

+ 4 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java

@@ -27,4 +27,8 @@ public interface CacheConstants {
      */
      */
     String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
     String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
 
 
+    /**
+     * 订单号计数器
+     */
+    String SYS_ORDER_COUNT = "sys_order_count";
 }
 }

+ 6 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -115,4 +115,10 @@ public interface CacheNames {
      * @Author: Huanyi
      * @Author: Huanyi
      */
      */
     String SYS_ORDER_CODE = "sys_order_code#30d";
     String SYS_ORDER_CODE = "sys_order_code#30d";
+
+    /**
+     * 服务项目
+     * @Author: Huanyi
+     */
+    String SYS_SERVICE = "sys_service#30d";
 }
 }

+ 2 - 0
ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/constants/LockContants.java

@@ -4,4 +4,6 @@ public interface LockContants {
 
 
     String ROLE = "lock_role:";
     String ROLE = "lock_role:";
 
 
+    String ORDER = "lock_order:";
+
 }
 }

+ 35 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfAnamalyController.java

@@ -0,0 +1,35 @@
+package org.dromara.fulfiller.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.fulfiller.domain.bo.FlfAnamalyAddBo;
+import org.dromara.fulfiller.domain.bo.FlfAnamalyBo;
+import org.dromara.fulfiller.domain.bo.FlfAnamalyPageBo;
+import org.dromara.fulfiller.domain.vo.FlfAnamalyVo;
+import org.dromara.fulfiller.service.IFlfAnamalyService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/anamaly")
+@RequiredArgsConstructor
+@Validated
+public class FlfAnamalyController extends BaseController {
+
+    private final IFlfAnamalyService flfAnamalyService;
+
+    @GetMapping("/list")
+    public TableDataInfo<FlfAnamalyVo> list(FlfAnamalyPageBo bo, PageQuery pageQuery) {
+        return flfAnamalyService.list(bo, pageQuery);
+    }
+
+    @PostMapping("/add")
+    public R<Void> add(@Validated @RequestBody FlfAnamalyAddBo bo) {
+        return toAjax(flfAnamalyService.insertByBo(bo));
+    }
+
+}

+ 6 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfFulfillerController.java

@@ -8,6 +8,7 @@ import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import org.dromara.fulfiller.domain.vo.FlfFulfillerOnOrderVo;
 import org.dromara.fulfiller.domain.vo.FlfFulfillerOnOrderVo;
+import org.dromara.fulfiller.domain.vo.FlfFulfilllerListByNameAndPhoneNumberVo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -286,4 +287,9 @@ public class FlfFulfillerController extends BaseController {
         return R.ok(fulfillerService.listAllOnDispatch(service));
         return R.ok(fulfillerService.listAllOnDispatch(service));
     }
     }
 
 
+    @GetMapping("/listByNameAndPhoneNumber")
+    public TableDataInfo<FlfFulfilllerListByNameAndPhoneNumberVo> listByNameAndPhoneNumber(@RequestParam(name = "content", required = false) String content, PageQuery pageQuery) {
+        return fulfillerService.listByNameAndPhoneNumber(content, pageQuery);
+    }
+
 }
 }

+ 69 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfAnamaly.java

@@ -0,0 +1,69 @@
+package org.dromara.fulfiller.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 异常信息对象 flf_anamaly
+ *
+ * @author Huanyi
+ * @date 2026-03-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("flf_anamaly")
+public class FlfAnamaly extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 履约者
+     */
+    private Long fulfiller;
+
+    /**
+     * 关联订单
+     */
+    private Long orderId;
+
+    /**
+     * 异常类型
+     */
+    private String type;
+
+    /**
+     * 上报内容
+     */
+    private String content;
+
+    /**
+     * 上报图片
+     */
+    private String photos;
+
+    /**
+     * 审核状态
+     */
+    private Integer status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 62 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/bo/FlfAnamalyAddBo.java

@@ -0,0 +1,62 @@
+package org.dromara.fulfiller.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.fulfiller.domain.FlfAnamaly;
+
+/**
+ * 异常信息业务对象 flf_anamaly
+ *
+ * @author Huanyi
+ * @date 2026-03-11
+ */
+@Data
+public class FlfAnamalyAddBo extends BaseEntity {
+
+    /**
+     * 序号
+     */
+    private Long id;
+
+    /**
+     * 履约者
+     */
+    @NotNull(message = "履约者不能为空")
+    private Long fulfiller;
+
+    /**
+     * 关联订单
+     */
+    @NotBlank(message = "订单编号不能为空")
+    private String orderCode;
+
+    /**
+     * 异常类型
+     */
+    @NotBlank(message = "异常类型不能为空")
+    private String type;
+
+    /**
+     * 上报内容
+     */
+    @NotBlank(message = "上报内容不能为空")
+    private String content;
+
+    /**
+     * 上报图片
+     */
+    private String photos;
+
+    /**
+     * 审核状态
+     */
+    private Integer status;
+
+
+}

+ 66 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/bo/FlfAnamalyBo.java

@@ -0,0 +1,66 @@
+package org.dromara.fulfiller.domain.bo;
+
+import org.dromara.fulfiller.domain.FlfAnamaly;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 异常信息业务对象 flf_anamaly
+ *
+ * @author Huanyi
+ * @date 2026-03-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = FlfAnamaly.class, reverseConvertGenerate = false)
+public class FlfAnamalyBo extends BaseEntity {
+
+    /**
+     * 序号
+     */
+    @NotNull(message = "序号不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 履约者
+     */
+    @NotNull(message = "履约者不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long fulfiller;
+
+    /**
+     * 关联订单
+     */
+    @NotNull(message = "关联订单不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long orderId;
+
+    /**
+     * 异常类型
+     */
+    @NotBlank(message = "异常类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String type;
+
+    /**
+     * 上报内容
+     */
+    @NotBlank(message = "上报内容不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String content;
+
+    /**
+     * 上报图片
+     */
+    private String photos;
+
+    /**
+     * 审核状态
+     */
+    private Integer status;
+
+
+}

+ 14 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/bo/FlfAnamalyPageBo.java

@@ -0,0 +1,14 @@
+package org.dromara.fulfiller.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class FlfAnamalyPageBo {
+
+    private String content;
+
+    private String type;
+
+    private Integer status;
+
+}

+ 88 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfAnamalyVo.java

@@ -0,0 +1,88 @@
+package org.dromara.fulfiller.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.fulfiller.domain.FlfAnamaly;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 异常信息视图对象 flf_anamaly
+ *
+ * @author Huanyi
+ * @date 2026-03-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = FlfAnamaly.class)
+public class FlfAnamalyVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @ExcelProperty(value = "序号")
+    private Long id;
+
+    /**
+     * 履约者
+     */
+    @ExcelProperty(value = "履约者")
+    private Long fulfiller;
+
+    /**
+     * 关联订单
+     */
+    @ExcelProperty(value = "关联订单")
+    private Long orderId;
+
+    /**
+     * 异常类型
+     */
+    @ExcelProperty(value = "异常类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "flf_anamaly_type")
+    private String type;
+
+    /**
+     * 上报内容
+     */
+    @ExcelProperty(value = "上报内容")
+    private String content;
+
+    /**
+     * 上报图片
+     */
+    @ExcelProperty(value = "上报图片")
+    private String photos;
+
+    /**
+     * 上报图片Url
+     */
+    private List<String> photosUrls;
+
+    /**
+     * 审核状态
+     */
+    @ExcelProperty(value = "审核状态")
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+
+}

+ 20 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfFulfilllerListByNameAndPhoneNumberVo.java

@@ -0,0 +1,20 @@
+package org.dromara.fulfiller.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class FlfFulfilllerListByNameAndPhoneNumberVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String name;
+
+    private String phoneNumber;
+
+}

+ 18 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/FlfAnamalyStatusEnum.java

@@ -0,0 +1,18 @@
+package org.dromara.fulfiller.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum FlfAnamalyStatusEnum {
+
+    UNDER_REVIEW(0, "待审核"),
+    REVIEW_PASSED(1, "已通过"),
+    REVIEW_REJECTED(2, "已驳回"),
+    ;
+    private final Integer value;
+    private final String label;
+
+}

+ 15 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/mapper/FlfAnamalyMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.fulfiller.mapper;
+
+import org.dromara.fulfiller.domain.FlfAnamaly;
+import org.dromara.fulfiller.domain.vo.FlfAnamalyVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 异常信息Mapper接口
+ *
+ * @author Huanyi
+ * @date 2026-03-11
+ */
+public interface FlfAnamalyMapper extends BaseMapperPlus<FlfAnamaly, FlfAnamalyVo> {
+
+}

+ 14 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfAnamalyService.java

@@ -0,0 +1,14 @@
+package org.dromara.fulfiller.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.fulfiller.domain.bo.FlfAnamalyAddBo;
+import org.dromara.fulfiller.domain.bo.FlfAnamalyBo;
+import org.dromara.fulfiller.domain.bo.FlfAnamalyPageBo;
+import org.dromara.fulfiller.domain.vo.FlfAnamalyVo;
+
+public interface IFlfAnamalyService {
+    TableDataInfo<FlfAnamalyVo> list(FlfAnamalyPageBo bo, PageQuery pageQuery);
+
+    boolean insertByBo(FlfAnamalyAddBo bo);
+}

+ 3 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfFulfillerService.java

@@ -8,6 +8,7 @@ import org.dromara.fulfiller.domain.vo.FlfFulfillerOnOrderVo;
 import org.dromara.fulfiller.domain.vo.FlfFulfillerVo;
 import org.dromara.fulfiller.domain.vo.FlfFulfillerVo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.fulfiller.domain.vo.FlfFulfilllerListByNameAndPhoneNumberVo;
 
 
 import java.util.List;
 import java.util.List;
 
 
@@ -132,4 +133,6 @@ public interface IFlfFulfillerService {
     List<FlfFulfillerOnOrderVo> listAllOnOrder();
     List<FlfFulfillerOnOrderVo> listAllOnOrder();
 
 
     List<FlfFulfillerOnOrderVo> listAllOnDispatch(Long service);
     List<FlfFulfillerOnOrderVo> listAllOnDispatch(Long service);
+
+    TableDataInfo<FlfFulfilllerListByNameAndPhoneNumberVo> listByNameAndPhoneNumber(String content, PageQuery pageQuery);
 }
 }

+ 109 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfAnamalyServiceImpl.java

@@ -0,0 +1,109 @@
+package org.dromara.fulfiller.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.utils.WrapperUtils;
+import org.dromara.fulfiller.domain.FlfAnamaly;
+import org.dromara.fulfiller.domain.FlfFulfiller;
+import org.dromara.fulfiller.domain.bo.FlfAnamalyAddBo;
+import org.dromara.fulfiller.domain.bo.FlfAnamalyBo;
+import org.dromara.fulfiller.domain.bo.FlfAnamalyPageBo;
+import org.dromara.fulfiller.domain.vo.FlfAnamalyVo;
+import org.dromara.fulfiller.mapper.FlfAnamalyMapper;
+import org.dromara.fulfiller.mapper.FlfFulfillerMapper;
+import org.dromara.fulfiller.service.IFlfAnamalyService;
+import org.dromara.order.api.RemoteSubOrderService;
+import org.dromara.resource.api.RemoteFileService;
+import org.dromara.resource.api.domain.RemoteFile;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@RequiredArgsConstructor
+public class FlfAnamalyServiceImpl implements IFlfAnamalyService {
+
+    private final FlfAnamalyMapper baseMapper;
+    private final FlfFulfillerMapper flfFulfillerMapper;
+
+    @DubboReference
+    private final RemoteSubOrderService remoteSubOrderService;
+    @DubboReference
+    private final RemoteFileService remoteFileService;
+
+    @Override
+    public TableDataInfo<FlfAnamalyVo> list(FlfAnamalyPageBo bo, PageQuery pageQuery) {
+
+        LambdaQueryWrapper<FlfAnamaly> wrapper = Wrappers.lambdaQuery(FlfAnamaly.class).orderByDesc(FlfAnamaly::getId)
+            .eq(StringUtils.isNotBlank(bo.getType()), FlfAnamaly::getType, bo.getType())
+            .eq(bo.getStatus() != null, FlfAnamaly::getStatus, bo.getStatus());
+
+        String content = bo.getContent();
+        if (StringUtils.isNotBlank(content)) {
+            List<Long> fulfillerIds = new ArrayList<>();
+            flfFulfillerMapper.selectList(Wrappers.lambdaQuery(FlfFulfiller.class).select(FlfFulfiller::getId).like(FlfFulfiller::getName, content))
+                .forEach(e -> fulfillerIds.add(e.getId()));
+            wrapper.in(FlfAnamaly::getId, WrapperUtils.convertIds(fulfillerIds));
+            List<Long> orderIds = remoteSubOrderService.getIdsByCode(content);
+            wrapper.in(FlfAnamaly::getOrderId, WrapperUtils.convertIds(orderIds));
+        }
+
+        Page<FlfAnamalyVo> page = baseMapper.selectVoPage(pageQuery.build(), wrapper);
+
+        List<Long> photoIds = new ArrayList<>();
+        Map<Long, RemoteFile> photoMap = new HashMap<>();
+        page.getRecords().forEach(e -> {
+            if (StringUtils.isNotBlank(e.getPhotos())) {
+                String[] ids = e.getPhotos().split(",");
+                for (String id : ids) {
+                    photoIds.add(Long.valueOf(id));
+                }
+            }
+        });
+        if (!photoIds.isEmpty()) {
+            remoteFileService.selectByIds(photoIds).forEach(e -> photoMap.put(e.getOssId(), e));
+        }
+
+        return TableDataInfo.build(page.convert(e -> {
+            if (StringUtils.isNotBlank(e.getPhotos())) {
+                List<String> photoUrls = new ArrayList<>();
+                String[] ids = e.getPhotos().split(",");
+                for (String id : ids) {
+                    photoUrls.add(photoMap.get(id).getUrl());
+                }
+                e.setPhotosUrls(photoUrls);
+            }
+            return e;
+        }));
+    }
+
+    @Override
+    public boolean insertByBo(FlfAnamalyAddBo bo) {
+
+        Long orderId = remoteSubOrderService.getIdByCode(bo.getOrderCode());
+        if (orderId == null) {
+            throw new ServiceException("未能根据订单号 " + bo.getOrderCode() + " 找到订单,请仔细检查");
+        }
+
+        FlfAnamaly add = new FlfAnamaly();
+        add.setFulfiller(bo.getFulfiller());
+        add.setOrderId(orderId);
+        add.setType(bo.getType());
+        add.setContent(bo.getContent());
+        add.setPhotos(bo.getPhotos());
+        add.setStatus(bo.getStatus());
+
+        return baseMapper.insert(add) > 0;
+    }
+}

+ 23 - 1
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfFulfillerServiceImpl.java

@@ -16,6 +16,7 @@ import org.dromara.common.mybatis.helper.DataBaseHelper;
 import org.dromara.common.mybatis.utils.WrapperUtils;
 import org.dromara.common.mybatis.utils.WrapperUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.fulfiller.domain.vo.FlfFulfillerOnOrderVo;
 import org.dromara.fulfiller.domain.vo.FlfFulfillerOnOrderVo;
+import org.dromara.fulfiller.domain.vo.FlfFulfilllerListByNameAndPhoneNumberVo;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.dromara.fulfiller.domain.FlfAudit;
 import org.dromara.fulfiller.domain.FlfAudit;
@@ -564,7 +565,7 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
                 .and(StringUtils.isNotBlank(content), wrapper -> wrapper
                 .and(StringUtils.isNotBlank(content), wrapper -> wrapper
                     .like(FlfFulfiller::getName, content).or().like(FlfFulfiller::getPhone, content)
                     .like(FlfFulfiller::getName, content).or().like(FlfFulfiller::getPhone, content)
                 )
                 )
-//                .apply(DataBaseHelper.findInSet(service, "service_types"))
+                .apply(DataBaseHelper.findInSet(service, "service_types"))
         );
         );
         List<Long> fulfillerIds = new ArrayList<>();
         List<Long> fulfillerIds = new ArrayList<>();
         List<Long> avatarIds = new ArrayList<>();
         List<Long> avatarIds = new ArrayList<>();
@@ -692,4 +693,25 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
         return vos;
         return vos;
     }
     }
 
 
+    @Override
+    public TableDataInfo<FlfFulfilllerListByNameAndPhoneNumberVo> listByNameAndPhoneNumber(String content, PageQuery pageQuery) {
+
+        Page<FlfFulfiller> page = baseMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(FlfFulfiller.class)
+                .and(StringUtils.isNotBlank(content), w -> w
+                    .like(FlfFulfiller::getName, content).or()
+                    .like(FlfFulfiller::getPhone, content)
+                )
+        );
+
+        return TableDataInfo.build(page.convert(e -> {
+            FlfFulfilllerListByNameAndPhoneNumberVo vo = new FlfFulfilllerListByNameAndPhoneNumberVo();
+            vo.setId(e.getId());
+            vo.setName(e.getName());
+            vo.setPhoneNumber(e.getPhone());
+            return vo;
+        }));
+    }
+
 }
 }

+ 2 - 2
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/SysSubOrderLog.java

@@ -48,9 +48,9 @@ public class SysSubOrderLog extends TenantEntity {
     private Integer logType;
     private Integer logType;
 
 
     /**
     /**
-     * 操作类型
+     * 步骤
      */
      */
-    private Integer actionType;
+    private Integer step;
 
 
     /**
     /**
      * 标题
      * 标题

+ 3 - 3
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderClockInBo.java

@@ -11,10 +11,10 @@ public class SysSubOrderClockInBo {
 
 
     private List<Long> photos;
     private List<Long> photos;
 
 
-    private String content;
-
-    private Integer type;
+    private Integer step;
 
 
     private String title;
     private String title;
 
 
+    private String content;
+
 }
 }

+ 2 - 2
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderLogBo.java

@@ -53,8 +53,8 @@ public class SysSubOrderLogBo extends BaseEntity {
     /**
     /**
      * 操作类型
      * 操作类型
      */
      */
-    @NotNull(message = "操作类型不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Integer actionType;
+    @NotNull(message = "步骤操作类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer step;
 
 
     /**
     /**
      * 标题
      * 标题

+ 2 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteOrderServiceImpl.java

@@ -10,6 +10,8 @@ import org.dromara.order.mapper.SysOrderMapper;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.List;
+
 @Service
 @Service
 @DubboService
 @DubboService
 @RequiredArgsConstructor
 @RequiredArgsConstructor

+ 49 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteSubOrderServiceImpl.java

@@ -0,0 +1,49 @@
+package org.dromara.order.dubbo;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.order.api.RemoteSubOrderService;
+import org.dromara.order.domain.SysSubOrder;
+import org.dromara.order.mapper.SysSubOrderMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@DubboService
+@RequiredArgsConstructor
+@Service
+public class RemoteSubOrderServiceImpl implements RemoteSubOrderService {
+
+    private final SysSubOrderMapper baseMapper;
+
+    @Override
+    public List<Long> getIdsByCode(String code) {
+
+        List<Long> ids = new ArrayList<>();
+
+        baseMapper.selectList(
+            Wrappers.lambdaQuery(SysSubOrder.class)
+                .select(SysSubOrder::getId)
+                .like(SysSubOrder::getCode, code)
+        ).forEach(e -> ids.add(e.getId()));
+
+        return ids;
+    }
+
+    @Override
+    public Long getIdByCode(String code) {
+        SysSubOrder subOrder = baseMapper.selectOne(
+            Wrappers.lambdaQuery(SysSubOrder.class).select(SysSubOrder::getId)
+                .eq(SysSubOrder::getCode, code)
+                .last("LIMIT 1")
+        );
+
+        if (subOrder == null) {
+            return null;
+        }
+
+        return subOrder.getId();
+    }
+}

+ 0 - 24
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogActionTypeEnum.java

@@ -1,24 +0,0 @@
-package org.dromara.order.enums;
-
-import lombok.AccessLevel;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-@Getter
-@AllArgsConstructor(access = AccessLevel.PRIVATE)
-public enum OrderLogActionTypeEnum {
-
-    CREATE_ORDER(0, "订单创建"),
-    DISPATCH(1, "系统派单"),
-    FULFILLER_RECIEVE(2, "已接单"),
-    RECIEVED(3, "接单成功"),
-    ARRIVE_LOCK_ON(4, "到达打卡"),
-    ARRIVED(5, "到达服务点"),
-    START_SERVICE(6, "开始服务"),
-    FINISH_SERVICE(7, "服务结束"),
-    WAITING_FOR_CONFIRM(8, "待商家确认"),
-    FINISH(9, "订单完成"),
-    ;
-    private final Integer value;
-    private final String label;
-}

+ 17 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogFulfillerStepEnum.java

@@ -0,0 +1,17 @@
+package org.dromara.order.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum OrderLogFulfillerStepEnum {
+
+    RECIEVED(0, "已接单", "履约者 {} 已确认接单,准备前往服务地点"),
+    ;
+    private final Integer value;
+    private final String title;
+    private final String content;
+
+}

+ 20 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogSystemStepEnum.java

@@ -0,0 +1,20 @@
+package org.dromara.order.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum OrderLogSystemStepEnum {
+
+    CREATE_ORDER(0, "订单创建", "商户提交订单"),
+    DISPATCH(1, "系统派单", "指派给 {}"),
+    RECIEVED(2, "接单成功", "履约者已确认接单"),
+    ARRIVED(3, "到达服务点", "履约者已打卡"),
+    FINISH(4, "订单完成", "履约者已完成"),
+    ;
+    private final Integer step;
+    private final String title;
+    private final String content;
+}

+ 2 - 3
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderStatusEnum.java

@@ -15,9 +15,8 @@ public enum OrderStatusEnum {
     PENDING_ACCEPT(1, "待接单", "#e6a23c"),
     PENDING_ACCEPT(1, "待接单", "#e6a23c"),
     PENDING_SERVICE(2, "待服务", "#49a3ff"),
     PENDING_SERVICE(2, "待服务", "#49a3ff"),
     IN_SERVICE(3, "服务中", "#49a3ff"),
     IN_SERVICE(3, "服务中", "#49a3ff"),
-    PENDING_CONFIRM(4, "待商家确认", "#bf24e8"),
-    COMPLETED(5, "已完成", "#67c23a"),
-    CANCELLED(6, "已取消", "#909399"),
+    COMPLETED(4, "已完成", "#67c23a"),
+    CANCELLED(5, "已取消", "#909399"),
     ;
     ;
 
 
     private final Integer value;
     private final Integer value;

+ 104 - 13
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysOrderServiceImpl.java

@@ -1,17 +1,25 @@
 package org.dromara.order.service.impl;
 package org.dromara.order.service.impl;
 
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.lock.LockInfo;
+import com.baomidou.lock.LockTemplate;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.CacheConstants;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.constant.CacheNames;
-import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.mybatis.utils.IdGeneratorUtil;
 import org.dromara.common.mybatis.utils.IdGeneratorUtil;
 import org.dromara.common.platform.PlatformUtils;
 import org.dromara.common.platform.PlatformUtils;
+import org.dromara.common.redis.constants.LockContants;
 import org.dromara.common.redis.utils.CacheUtils;
 import org.dromara.common.redis.utils.CacheUtils;
+import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.order.domain.SysOrder;
 import org.dromara.order.domain.SysOrder;
 import org.dromara.order.domain.SysSubOrder;
 import org.dromara.order.domain.SysSubOrder;
 import org.dromara.order.domain.SysSubOrderLog;
 import org.dromara.order.domain.SysSubOrderLog;
 import org.dromara.order.domain.bo.SysOrderCreateBo;
 import org.dromara.order.domain.bo.SysOrderCreateBo;
-import org.dromara.order.enums.OrderLogActionTypeEnum;
+import org.dromara.order.domain.bo.SysSubOrderCreateBo;
+import org.dromara.order.enums.OrderLogSystemStepEnum;
 import org.dromara.order.enums.OrderLogActionerTypeEnum;
 import org.dromara.order.enums.OrderLogActionerTypeEnum;
 import org.dromara.order.enums.OrderLogTypeEnum;
 import org.dromara.order.enums.OrderLogTypeEnum;
 import org.dromara.order.mapper.SysOrderMapper;
 import org.dromara.order.mapper.SysOrderMapper;
@@ -22,22 +30,26 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.List;
 
 
 @Service
 @Service
 @RequiredArgsConstructor
 @RequiredArgsConstructor
+@Slf4j
 public class SysOrderServiceImpl implements ISysOrderService {
 public class SysOrderServiceImpl implements ISysOrderService {
 
 
     private final SysOrderMapper baseMapper;
     private final SysOrderMapper baseMapper;
     private final SysSubOrderMapper subOrderMapper;
     private final SysSubOrderMapper subOrderMapper;
     private final SysSubOrderLogMapper subOrderLogMapper;
     private final SysSubOrderLogMapper subOrderLogMapper;
 
 
+    private final LockTemplate lockTemplate;
+
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     @Override
     @Override
     public boolean create(SysOrderCreateBo bo) {
     public boolean create(SysOrderCreateBo bo) {
 
 
         SysOrder order = new SysOrder();
         SysOrder order = new SysOrder();
-        order.setCode(IdGeneratorUtil.nextUUID().replaceAll("-", ""));
+        order.setCode(generateOrderCode());
         order.setStore(bo.getStore());
         order.setStore(bo.getStore());
         order.setStoreSite(bo.getStoreSite());
         order.setStoreSite(bo.getStoreSite());
         order.setOrderPlacer(LoginHelper.getUserId());
         order.setOrderPlacer(LoginHelper.getUserId());
@@ -52,13 +64,12 @@ public class SysOrderServiceImpl implements ISysOrderService {
         if (flag) {
         if (flag) {
             throw new RuntimeException("订单插入失败");
             throw new RuntimeException("订单插入失败");
         }
         }
-
         CacheUtils.put(CacheNames.SYS_ORDER_CODE, order.getId(), order.getCode());
         CacheUtils.put(CacheNames.SYS_ORDER_CODE, order.getId(), order.getCode());
-
         List<SysSubOrder> subOrders = new ArrayList<>();
         List<SysSubOrder> subOrders = new ArrayList<>();
-        bo.getSubOrders().forEach(e -> {
+        for (int i = 1; i <= bo.getSubOrders().size(); i++) {
+            SysSubOrderCreateBo e = bo.getSubOrders().get(i - 1);
             SysSubOrder subOrder = new SysSubOrder();
             SysSubOrder subOrder = new SysSubOrder();
-            subOrder.setCode(IdGeneratorUtil.nextUUID().replaceAll("-", ""));
+            subOrder.setCode(order.getCode() + "-" + i);
             subOrder.setOrderId(order.getId());
             subOrder.setOrderId(order.getId());
             subOrder.setStore(bo.getStore());
             subOrder.setStore(bo.getStore());
             subOrder.setStoreSite(bo.getStoreSite());
             subOrder.setStoreSite(bo.getStoreSite());
@@ -89,8 +100,42 @@ public class SysOrderServiceImpl implements ISysOrderService {
                 6. 特殊情况/备注:
                 6. 特殊情况/备注:
                 """);
                 """);
             subOrders.add(subOrder);
             subOrders.add(subOrder);
-
-        });
+        }
+//        bo.getSubOrders().forEach(e -> {
+//            SysSubOrder subOrder = new SysSubOrder();
+//            subOrder.setCode(IdGeneratorUtil.nextUUID().replaceAll("-", ""));
+//            subOrder.setOrderId(order.getId());
+//            subOrder.setStore(bo.getStore());
+//            subOrder.setStoreSite(bo.getStoreSite());
+//            subOrder.setOrderPlacer(LoginHelper.getUserId());
+//            subOrder.setUsrCustomer(bo.getCustomer());
+//            subOrder.setUsrPet(bo.getPet());
+//            subOrder.setService(bo.getService());
+//            subOrder.setMode(e.getMode());
+//            subOrder.setType(e.getType());
+//            subOrder.setContact(e.getContact());
+//            subOrder.setContactPhoneNumber(e.getContactPhoneNumber());
+//            subOrder.setGroupPurchasePackageName(bo.getGroupPurchasePackageName());
+//            subOrder.setServiceTime(e.getServiceTime());
+//            subOrder.setEndServiceTime(e.getEndServiceTime());
+//            subOrder.setFromCode(e.getFromCode());
+//            subOrder.setFromAddress(e.getFromAddress());
+//            subOrder.setToCode(e.getToCode());
+//            subOrder.setToAddress(e.getToAddress());
+//            subOrder.setRemark(order.getRemark());
+//            subOrder.setTenantId(order.getTenantId());
+//            subOrder.setPlatformId(PlatformUtils.getId());
+//            subOrder.setNursingSummary("""
+//                1. 精神/身体状态:
+//                2. 进食/饮水:
+//                3. 排泄情况:
+//                4. 卫生情况:
+//                5. 互动情况:
+//                6. 特殊情况/备注:
+//                """);
+//            subOrders.add(subOrder);
+//
+//        });
         boolean subFlag = subOrderMapper.insertBatch(subOrders);
         boolean subFlag = subOrderMapper.insertBatch(subOrders);
         if (!subFlag) {
         if (!subFlag) {
             throw new RuntimeException("批量生成子订单失败");
             throw new RuntimeException("批量生成子订单失败");
@@ -104,9 +149,10 @@ public class SysOrderServiceImpl implements ISysOrderService {
             log.setActioner(LoginHelper.getUserId());
             log.setActioner(LoginHelper.getUserId());
             log.setActionerType(OrderLogActionerTypeEnum.SYS_USER.getValue());
             log.setActionerType(OrderLogActionerTypeEnum.SYS_USER.getValue());
             log.setLogType(OrderLogTypeEnum.ORDER.getValue());
             log.setLogType(OrderLogTypeEnum.ORDER.getValue());
-            log.setActionType(OrderLogActionTypeEnum.CREATE_ORDER.getValue());
-            log.setTitle(OrderLogActionTypeEnum.CREATE_ORDER.getLabel());
-            log.setContent("商户提交订单");
+            OrderLogSystemStepEnum step = OrderLogSystemStepEnum.CREATE_ORDER;
+            log.setStep(step.getStep());
+            log.setTitle(step.getTitle());
+            log.setContent(step.getContent());
             log.setTenantId(order.getTenantId());
             log.setTenantId(order.getTenantId());
             logs.add(log);
             logs.add(log);
         }
         }
@@ -116,6 +162,51 @@ public class SysOrderServiceImpl implements ISysOrderService {
         }
         }
 
 
         return true;
         return true;
-//        throw new ServiceException("成功");
     }
     }
+
+    /**
+     * 按照一定规则生成订单号
+     */
+    private String generateOrderCode() {
+
+        try {
+            // 方案一:使用分布式锁来串行化
+//        String date = DateUtil.format(new Date(), "yyyyMMddHHmmss");
+
+//        LockInfo locker = lockTemplate.lock(LockContants.ORDER, 500L, 1000L);
+//
+//        try {
+//
+//            Long count = RedisUtils.getCacheObject(CacheConstants.SYS_ORDER_COUNT);
+//            if (count == null) {
+//                count = 1L;
+//            }
+//            RedisUtils.setCacheObject(CacheConstants.SYS_ORDER_COUNT, count + 1L);
+//
+//        } finally {
+//            // 无论是否抛出异常,都解锁
+//            if (locker != null) {
+//                lockTemplate.releaseLock(locker);
+//            }
+//        }
+//        return date;
+
+            // 方案二:Redis原子递增 以每天的订单为准
+            // 先不按照品牌或门店隔离
+            String date = DateUtil.format(new Date(), "yyyyMMdd");
+            String redisKey = CacheConstants.SYS_ORDER_COUNT + date;
+            long count = RedisUtils.incrAtomicValue(redisKey);
+            if (count == 1L) {
+                // 应对服务器时钟微调或网络延迟导致的临界点问题
+                RedisUtils.expire(redisKey, 60L * 60L * 25L);
+            }
+            return date + String.format("%06d", count);
+        } catch (Exception e) {
+            // 容灾 如果Redis挂掉,降级采用雪花ID
+            log.error("Redis 订单号生成失败,降级使用本地雪花算法", e);
+            return "ORD" + IdUtil.getSnowflakeNextIdStr();
+        }
+
+    }
+
 }
 }

+ 40 - 65
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysSubOrderServiceImpl.java

@@ -12,12 +12,10 @@ import org.dromara.api.RemotePetService;
 import org.dromara.api.domain.vo.RemoteCustomerVo;
 import org.dromara.api.domain.vo.RemoteCustomerVo;
 import org.dromara.api.domain.vo.RemotePetVo;
 import org.dromara.api.domain.vo.RemotePetVo;
 import org.dromara.common.core.constant.TenantConstants;
 import org.dromara.common.core.constant.TenantConstants;
-import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.utils.WrapperUtils;
 import org.dromara.common.mybatis.utils.WrapperUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.fulfiller.api.RemoteFulfillerService;
 import org.dromara.fulfiller.api.RemoteFulfillerService;
 import org.dromara.fulfiller.api.domain.vo.RemoteFulfillerVo;
 import org.dromara.fulfiller.api.domain.vo.RemoteFulfillerVo;
 import org.dromara.fulfiller.api.model.FulfillerLoginUser;
 import org.dromara.fulfiller.api.model.FulfillerLoginUser;
@@ -26,11 +24,7 @@ import org.dromara.order.domain.SysSubOrder;
 import org.dromara.order.domain.SysSubOrderLog;
 import org.dromara.order.domain.SysSubOrderLog;
 import org.dromara.order.domain.bo.*;
 import org.dromara.order.domain.bo.*;
 import org.dromara.order.domain.vo.*;
 import org.dromara.order.domain.vo.*;
-import org.dromara.order.enums.OrderLogActionTypeEnum;
-import org.dromara.order.enums.OrderLogActionerTypeEnum;
-import org.dromara.order.enums.OrderLogTypeEnum;
-import org.dromara.order.enums.OrderStatusEnum;
-import org.dromara.order.mapper.SysOrderMapper;
+import org.dromara.order.enums.*;
 import org.dromara.order.mapper.SysSubOrderLogMapper;
 import org.dromara.order.mapper.SysSubOrderLogMapper;
 import org.dromara.order.mapper.SysSubOrderMapper;
 import org.dromara.order.mapper.SysSubOrderMapper;
 import org.dromara.order.service.ISysSubOrderService;
 import org.dromara.order.service.ISysSubOrderService;
@@ -121,19 +115,27 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
             vo.setType(e.getType());
             vo.setType(e.getType());
             vo.setPet(e.getUsrPet());
             vo.setPet(e.getUsrPet());
             RemotePetVo pet = petMap.get(e.getUsrPet());
             RemotePetVo pet = petMap.get(e.getUsrPet());
-            vo.setPetName(pet.getName());
-            vo.setPetBreed(pet.getBreed());
+            if (pet != null) {
+                vo.setPetName(pet.getName());
+                vo.setPetBreed(pet.getBreed());
+            }
             vo.setCustomer(e.getUsrCustomer());
             vo.setCustomer(e.getUsrCustomer());
             RemoteCustomerVo customer = customerMap.get(e.getUsrCustomer());
             RemoteCustomerVo customer = customerMap.get(e.getUsrCustomer());
-            vo.setCustomerName(customer.getName());
+            if (customer != null) {
+                vo.setCustomerName(customer.getName());
+            }
             vo.setToAddress(e.getToAddress());
             vo.setToAddress(e.getToAddress());
             vo.setSite(e.getStoreSite());
             vo.setSite(e.getStoreSite());
             vo.setStore(e.getStore());
             vo.setStore(e.getStore());
             RemoteStoreVo store = storeMap.get(e.getStore());
             RemoteStoreVo store = storeMap.get(e.getStore());
-            vo.setStoreName(store.getName());
+            if (store != null) {
+                vo.setStoreName(store.getName());
+            }
             vo.setPlacer(e.getOrderPlacer());
             vo.setPlacer(e.getOrderPlacer());
             RemoteUserVo placer = userMap.get(e.getOrderPlacer());
             RemoteUserVo placer = userMap.get(e.getOrderPlacer());
-            vo.setPlacerUsername(placer.getUserName());
+            if (placer != null) {
+                vo.setPlacerUsername(placer.getUserName());
+            }
             vo.setCreateTime(e.getCreateTime());
             vo.setCreateTime(e.getCreateTime());
             vo.setStatus(e.getStatus());
             vo.setStatus(e.getStatus());
             vo.setFulfiller(e.getFulfiller());
             vo.setFulfiller(e.getFulfiller());
@@ -171,9 +173,12 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
         log.setActioner(LoginHelper.getUserId());
         log.setActioner(LoginHelper.getUserId());
         log.setActionerType(OrderLogActionerTypeEnum.SYS_USER.getValue());
         log.setActionerType(OrderLogActionerTypeEnum.SYS_USER.getValue());
         log.setLogType(OrderLogTypeEnum.ORDER.getValue());
         log.setLogType(OrderLogTypeEnum.ORDER.getValue());
-        log.setActionType(OrderLogActionTypeEnum.DISPATCH.getValue());
-        log.setTitle(OrderLogActionTypeEnum.DISPATCH.getLabel());
-        log.setContent("指派给 " + fulfiller.getName());
+
+        OrderLogSystemStepEnum step = OrderLogSystemStepEnum.DISPATCH;
+        log.setStep(step.getStep());
+        log.setTitle(step.getTitle());
+        log.setContent(String.format(step.getContent(), fulfiller.getName()));
+
         log.setTenantId(subOrder.getTenantId());
         log.setTenantId(subOrder.getTenantId());
         boolean logFlag = subOrderLogMapper.insert(log) == 0;
         boolean logFlag = subOrderLogMapper.insert(log) == 0;
         if (logFlag) {
         if (logFlag) {
@@ -355,9 +360,10 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
         orderLog.setActioner(LoginHelper.getUserId());
         orderLog.setActioner(LoginHelper.getUserId());
         orderLog.setActionerType(OrderLogActionerTypeEnum.FULFILLER.getValue());
         orderLog.setActionerType(OrderLogActionerTypeEnum.FULFILLER.getValue());
         orderLog.setLogType(OrderLogTypeEnum.ORDER.getValue());
         orderLog.setLogType(OrderLogTypeEnum.ORDER.getValue());
-        orderLog.setActionType(OrderLogActionTypeEnum.RECIEVED.getValue());
-        orderLog.setTitle(OrderLogActionTypeEnum.RECIEVED.getLabel());
-        orderLog.setContent("履约者已确认接单");
+        OrderLogSystemStepEnum step = OrderLogSystemStepEnum.RECIEVED;
+        orderLog.setStep(step.getStep());
+        orderLog.setTitle(step.getTitle());
+        orderLog.setContent(step.getContent());
         orderLog.setTenantId(subOrder.getTenantId());
         orderLog.setTenantId(subOrder.getTenantId());
 
 
         SysSubOrderLog fulfillerLog = new SysSubOrderLog();
         SysSubOrderLog fulfillerLog = new SysSubOrderLog();
@@ -365,9 +371,9 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
         fulfillerLog.setActioner(LoginHelper.getUserId());
         fulfillerLog.setActioner(LoginHelper.getUserId());
         fulfillerLog.setActionerType(OrderLogActionerTypeEnum.FULFILLER.getValue());
         fulfillerLog.setActionerType(OrderLogActionerTypeEnum.FULFILLER.getValue());
         fulfillerLog.setLogType(OrderLogTypeEnum.FULFILLER.getValue());
         fulfillerLog.setLogType(OrderLogTypeEnum.FULFILLER.getValue());
-        fulfillerLog.setActionType(OrderLogActionTypeEnum.FULFILLER_RECIEVE.getValue());
-        fulfillerLog.setTitle(OrderLogActionTypeEnum.FULFILLER_RECIEVE.getLabel());
-        fulfillerLog.setContent("履约者 " + LoginHelper.getLoginUser().getNickname() + " 已确认接单,准备前往服务地点");
+        fulfillerLog.setStep(OrderLogFulfillerStepEnum.RECIEVED.getValue());
+        fulfillerLog.setTitle(OrderLogFulfillerStepEnum.RECIEVED.getTitle());
+        fulfillerLog.setContent(String.format(OrderLogFulfillerStepEnum.RECIEVED.getContent(), LoginHelper.getLoginUser().getNickname()));
         fulfillerLog.setTenantId(subOrder.getTenantId());
         fulfillerLog.setTenantId(subOrder.getTenantId());
 
 
         boolean logFlag = subOrderLogMapper.insertBatch(Arrays.asList(orderLog, fulfillerLog));
         boolean logFlag = subOrderLogMapper.insertBatch(Arrays.asList(orderLog, fulfillerLog));
@@ -410,21 +416,12 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
             }
             }
         }
         }
 
 
-        if (bo.getType().equals(OrderLogActionTypeEnum.FINISH_SERVICE.getValue())) {
-            subOrder.setStatus(OrderStatusEnum.PENDING_CONFIRM.getValue());
-            boolean flag = baseMapper.updateById(subOrder) == 0;
-            if (flag) {
-                throw new RuntimeException("修改订单状态失败");
-            }
-
-        }
-
         SysSubOrderLog log = new SysSubOrderLog();
         SysSubOrderLog log = new SysSubOrderLog();
         log.setSubOrderId(subOrder.getId());
         log.setSubOrderId(subOrder.getId());
         log.setActioner(LoginHelper.getUserId());
         log.setActioner(LoginHelper.getUserId());
         log.setActionerType(OrderLogActionerTypeEnum.FULFILLER.getValue());
         log.setActionerType(OrderLogActionerTypeEnum.FULFILLER.getValue());
         log.setLogType(OrderLogTypeEnum.FULFILLER.getValue());
         log.setLogType(OrderLogTypeEnum.FULFILLER.getValue());
-        log.setActionType(bo.getType());
+        log.setStep(bo.getStep());
         log.setTitle(bo.getTitle());
         log.setTitle(bo.getTitle());
         log.setContent(bo.getContent());
         log.setContent(bo.getContent());
         log.setPhotos(bo.getPhotos().stream().map(String::valueOf).collect(Collectors.joining(",")));
         log.setPhotos(bo.getPhotos().stream().map(String::valueOf).collect(Collectors.joining(",")));
@@ -434,38 +431,6 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
             throw new RuntimeException("记录服务进度失败");
             throw new RuntimeException("记录服务进度失败");
         }
         }
 
 
-        if (bo.getType().equals(OrderLogActionTypeEnum.FINISH_SERVICE.getValue())) {
-            SysSubOrderLog waitingLog = new SysSubOrderLog();
-            waitingLog.setSubOrderId(subOrder.getId());
-            waitingLog.setActioner(LoginHelper.getUserId());
-            waitingLog.setActionerType(OrderLogActionerTypeEnum.FULFILLER.getValue());
-            waitingLog.setLogType(OrderLogTypeEnum.FULFILLER.getValue());
-            waitingLog.setActionType(OrderLogActionTypeEnum.WAITING_FOR_CONFIRM.getValue());
-            waitingLog.setTitle("待商家确认");
-            waitingLog.setContent("履约者已提交完成信息,等待商家确认订单");
-            waitingLog.setTenantId(subOrder.getTenantId());
-            boolean waitingLogFlag = subOrderLogMapper.insert(waitingLog) == 0;
-            if (waitingLogFlag) {
-                throw new RuntimeException("记录服务进度(待上架确认)失败");
-            }
-        }
-
-        if (bo.getType().equals(OrderLogActionTypeEnum.ARRIVE_LOCK_ON.getValue())) {
-            SysSubOrderLog systemLog = new SysSubOrderLog();
-            systemLog.setSubOrderId(subOrder.getId());
-            systemLog.setActioner(LoginHelper.getUserId());
-            systemLog.setActionerType(OrderLogActionerTypeEnum.SYS_USER.getValue());
-            systemLog.setLogType(OrderLogTypeEnum.ORDER.getValue());
-            systemLog.setActionType(OrderLogActionTypeEnum.ARRIVED.getValue());
-            systemLog.setTitle(OrderLogActionTypeEnum.ARRIVED.getLabel());
-            systemLog.setContent("履约者已打卡");
-            systemLog.setTenantId(subOrder.getTenantId());
-            boolean systemFlag = subOrderLogMapper.insert(systemLog) == 0;
-            if (systemFlag) {
-                throw new RuntimeException("记录订单日志失败");
-            }
-        }
-
         return true;
         return true;
     }
     }
 
 
@@ -542,9 +507,19 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
         log.setSubOrderId(subOrder.getId());
         log.setSubOrderId(subOrder.getId());
         log.setActioner(LoginHelper.getUserId());
         log.setActioner(LoginHelper.getUserId());
         log.setActionerType(OrderLogActionerTypeEnum.SYS_USER.getValue());
         log.setActionerType(OrderLogActionerTypeEnum.SYS_USER.getValue());
+
         log.setLogType(OrderLogTypeEnum.FULFILLER.getValue());
         log.setLogType(OrderLogTypeEnum.FULFILLER.getValue());
-        log.setActionType(OrderLogActionTypeEnum.FINISH.getValue());
-        log.setTitle(OrderLogActionTypeEnum.FINISH.getLabel());
+        log.setStep(
+            // 动态取最后一步
+            subOrderLogMapper.selectOne(
+                    Wrappers.lambdaQuery(SysSubOrderLog.class)
+                        .eq(SysSubOrderLog::getActionerType, OrderLogActionerTypeEnum.FULFILLER.getValue())
+                        .eq(SysSubOrderLog::getSubOrderId, bo.getId())
+                        .orderByDesc(SysSubOrderLog::getStep)
+                        .last("LIMIT 1")
+                )
+                .getStep() + 1
+        );
         log.setContent("用户/商家已确认,服务圆满结束");
         log.setContent("用户/商家已确认,服务圆满结束");
         log.setTenantId(subOrder.getTenantId());
         log.setTenantId(subOrder.getTenantId());
         boolean logFlag = subOrderLogMapper.insert(log) == 0;
         boolean logFlag = subOrderLogMapper.insert(log) == 0;

+ 2 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/dubbo/RemoteSysServiceServiceImpl.java

@@ -3,10 +3,12 @@ package org.dromara.service.dubbo;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.service.api.RemoteSysServiceService;
 import org.dromara.service.api.RemoteSysServiceService;
 import org.dromara.service.api.domain.vo.RemoteSysServiceVo;
 import org.dromara.service.api.domain.vo.RemoteSysServiceVo;
 import org.dromara.service.domain.SysService;
 import org.dromara.service.domain.SysService;
 import org.dromara.service.mapper.SysServiceMapper;
 import org.dromara.service.mapper.SysServiceMapper;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;

+ 8 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/service/impl/SysServiceServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.service.service.impl;
 package org.dromara.service.service.impl;
 
 
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -9,9 +10,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.redis.utils.CacheUtils;
 import org.dromara.service.domain.vo.SysServiceOnOrderVo;
 import org.dromara.service.domain.vo.SysServiceOnOrderVo;
 import org.dromara.service.domain.vo.SysServiceOnStoreVo;
 import org.dromara.service.domain.vo.SysServiceOnStoreVo;
 import org.dromara.service.domain.vo.SysServiceOnTaskHallVo;
 import org.dromara.service.domain.vo.SysServiceOnTaskHallVo;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.dromara.service.domain.bo.SysServiceBo;
 import org.dromara.service.domain.bo.SysServiceBo;
 import org.dromara.service.domain.vo.SysServiceVo;
 import org.dromara.service.domain.vo.SysServiceVo;
@@ -42,6 +46,7 @@ public class SysServiceServiceImpl implements ISysServiceService {
      * @param id 主键
      * @param id 主键
      * @return 服务列表
      * @return 服务列表
      */
      */
+    @Cacheable(cacheNames = CacheNames.SYS_SERVICE, key = "#id")
     @Override
     @Override
     public SysServiceVo queryById(Long id){
     public SysServiceVo queryById(Long id){
         return baseMapper.selectVoById(id);
         return baseMapper.selectVoById(id);
@@ -86,6 +91,7 @@ public class SysServiceServiceImpl implements ISysServiceService {
      * @param bo 服务列表
      * @param bo 服务列表
      * @return 是否新增成功
      * @return 是否新增成功
      */
      */
+    @CachePut(cacheNames = CacheNames.SYS_SERVICE, key = "#bo.id")
     @Override
     @Override
     public Boolean insertByBo(SysServiceBo bo) {
     public Boolean insertByBo(SysServiceBo bo) {
         SysService add = MapstructUtils.convert(bo, SysService.class);
         SysService add = MapstructUtils.convert(bo, SysService.class);
@@ -103,6 +109,7 @@ public class SysServiceServiceImpl implements ISysServiceService {
      * @param bo 服务列表
      * @param bo 服务列表
      * @return 是否修改成功
      * @return 是否修改成功
      */
      */
+    @CachePut(cacheNames = CacheNames.SYS_SERVICE, key = "#bo.id")
     @Override
     @Override
     public Boolean updateByBo(SysServiceBo bo) {
     public Boolean updateByBo(SysServiceBo bo) {
         SysService update = MapstructUtils.convert(bo, SysService.class);
         SysService update = MapstructUtils.convert(bo, SysService.class);
@@ -129,6 +136,7 @@ public class SysServiceServiceImpl implements ISysServiceService {
         if(isValid){
         if(isValid){
             //TODO 做一些业务上的校验,判断是否需要校验
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         }
+        ids.forEach(id -> CacheUtils.evict(CacheNames.SYS_SERVICE, id));
         return baseMapper.deleteByIds(ids) > 0;
         return baseMapper.deleteByIds(ids) > 0;
     }
     }
 
 

+ 6 - 3
ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties

@@ -40,9 +40,12 @@ spring.sql.init.platform=mysql
 db.num=1
 db.num=1
 
 
 ### Connect URL of DB:
 ### Connect URL of DB:
-db.url.0=jdbc:mysql://116.62.136.107:4563/pet_system_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
-db.user.0=pet_system_config
-db.password.0=tfry6h6yrztNTw3e
+#db.url.0=jdbc:mysql://116.62.136.107:4563/pet_system_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
+#db.user.0=pet_system_config
+#db.password.0=tfry6h6yrztNTw3e
+db.url.0=jdbc:mysql://127.0.0.1:3306/pet_system_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
+db.user.0=root
+db.password.0=1234
 
 
 ### the maximum retry times for push
 ### the maximum retry times for push
 nacos.config.push.maxRetryTime=50
 nacos.config.push.maxRetryTime=50

+ 18 - 0
script/sql/business/create.sql

@@ -222,3 +222,21 @@ CREATE TABLE `pet_system`.`sys_sub_order_log`
     `update_by`     bigint(20) COMMENT '更新者',
     `update_by`     bigint(20) COMMENT '更新者',
     `update_time`   datetime COMMENT '更新时间'
     `update_time`   datetime COMMENT '更新时间'
 ) ENGINE = innoDB COMMENT = '订单操作日志表';
 ) ENGINE = innoDB COMMENT = '订单操作日志表';
+
+CREATE TABLE `pet_system`.`flf_anamaly`
+(
+    `id`            bigint PRIMARY KEY NOT NULL COMMENT '序号',
+    `fulfiller`     bigint             NOT NULL COMMENT '履约者',
+    `order_id`      bigint             NOT NULL COMMENT '关联订单',
+    `type`          char(1)            NOT NULL COMMENT '异常类型',
+    `content`       text               NOT NULL COMMENT '上报内容',
+    `photos`        varchar(512)       COMMENT '上报图片',
+    `status`        tinyint            NOT NULL DEFAULT 0 COMMENT '审核状态',
+    `tenant_id`     varchar(20)        NOT NULL COMMENT '租户编号',
+    `del_flag`      char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+    `create_dept`   bigint(20) COMMENT '创建部门',
+    `create_by`     bigint(20) COMMENT '创建者',
+    `create_time`   datetime COMMENT '创建时间',
+    `update_by`     bigint(20) COMMENT '更新者',
+    `update_time`   datetime COMMENT '更新时间'
+) ENGINE = innoDB COMMENT = '异常信息表';