Browse Source

护工订单

guomengjiao 3 months ago
parent
commit
47f320888a

+ 17 - 0
ruoyi-api/src/main/java/com/ruoyi/api/controller/common/AbstractApiController.java

@@ -78,6 +78,23 @@ public abstract class AbstractApiController {
         return teacherId;
     }
 
+    protected Long getWorkerId() {
+        //isThrow 是否抛异常,不抛的话返回常量0
+        User user = UserContext.currentUser();
+        if (ObjectUtil.isNull(user)){
+            throw new ServiceException(ApiUserException.USER_NOT_EXISTS);
+        }
+        UserExtendInfo userExtendInfo = user.getUserExtendInfo();
+        if (ObjectUtil.isNull(userExtendInfo)){
+            throw new ServiceException(ApiUserException.USER_IS_NOT_WORKER);
+        }
+        Long workerId = userExtendInfo.getWorkerId();
+        if (ObjectUtil.isNull(workerId)){
+            throw new ServiceException(ApiUserException.USER_IS_NOT_WORKER);
+        }
+        return workerId;
+    }
+
     /**
      * 响应返回结果
      *

+ 9 - 0
ruoyi-api/src/main/java/com/ruoyi/api/controller/info/ApiOrderController.java

@@ -10,6 +10,7 @@ import com.ruoyi.common.core.validate.QueryGroup;
 import com.ruoyi.common.enums.FilePathSplicingType;
 import com.ruoyi.common.filepathsplicing.FilePathSplicing;
 import com.ruoyi.info.order.domain.bo.OrderBo;
+import com.ruoyi.info.order.domain.bo.OrderReviewsBo;
 import com.ruoyi.info.order.domain.vo.OrderVo;
 import com.ruoyi.info.order.enums.CancellationMethod;
 import com.ruoyi.info.order.enums.OrderStatus;
@@ -56,6 +57,7 @@ public class ApiOrderController extends AbstractApiController {
     public R<Map<String,  Object>> getEnum() {
         Map<String, Object> map = new HashMap<>();
         map.put("orderStatus", OrderStatus.toJsonArray());
+        map.put("cancellationMethod", CancellationMethod.toJsonArray());
         return R.ok(map);
     }
 
@@ -91,4 +93,11 @@ public class ApiOrderController extends AbstractApiController {
         return toAjax(iOrderService.cancel(id, getUserId(), CancellationMethod.user_canceled) ? 1 : 0);
     }
 
+    @ApiOperation("评价订单")
+    @RepeatSubmit()
+    @PostMapping("/evaluate")
+    public R<Void> evaluate(@Validated(AddGroup.class) @RequestBody OrderReviewsBo bo) {
+        bo.setUserId(getUserId());
+        return toAjax(iOrderService.evaluate(bo) ? 1 : 0);
+    }
 }

+ 8 - 8
ruoyi-api/src/main/java/com/ruoyi/api/controller/info/ApiTeacherOrderController.java

@@ -64,14 +64,6 @@ public class ApiTeacherOrderController extends AbstractApiController {
         return iOrderService.queryPageList(bo, pageQuery);
     }
 
-    @ApiOperation("枚举")
-    @GetMapping("/enum")
-    public R<Map<String,  Object>> getEnum() {
-        Map<String, Object> map = new HashMap<>();
-        map.put("orderStatus", OrderStatus.toJsonArray());
-        return R.ok(map);
-    }
-
     /**
      * 获取订单详细信息
      */
@@ -99,4 +91,12 @@ public class ApiTeacherOrderController extends AbstractApiController {
     public R<Void> assignWorker(@RequestBody OrderBo bo) {
         return toAjax(iOrderService.assignWorker(bo, getTeacherId()) ? 1 : 0);
     }
+
+    @ApiOperation("获取护工电话")
+    @GetMapping("/getWorkerPhone/{id}")
+    public R<String> getWorkerPhone(@ApiParam("主键")
+                                        @NotNull(message = "主键不能为空")
+                                        @PathVariable("id") Long id) {
+        return R.ok(iOrderService.getWorkerPhone(id, getTeacherId()));
+    }
 }

+ 86 - 0
ruoyi-api/src/main/java/com/ruoyi/api/controller/info/ApiWorkerOrderController.java

@@ -0,0 +1,86 @@
+package com.ruoyi.api.controller.info;
+
+import com.ruoyi.api.controller.common.AbstractApiController;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.domain.PageQuery;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.FilePathSplicingType;
+import com.ruoyi.common.filepathsplicing.FilePathSplicing;
+import com.ruoyi.info.order.domain.bo.OrderBo;
+import com.ruoyi.info.order.domain.vo.OrderVo;
+import com.ruoyi.info.order.service.IOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 订单Controller
+ *
+ * @author ruoyi
+ * @date 2025-09-20
+ */
+@Validated
+@Api(value = "护工端订单控制器", tags = {"护工端订单管理"})
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/api/worker/order")
+public class ApiWorkerOrderController extends AbstractApiController {
+
+    private final IOrderService iOrderService;
+
+    /**
+     * 分页查询订单列表
+     */
+    @FilePathSplicing(type = FilePathSplicingType.RESPONSE)
+    @ApiOperation("查询订单列表")
+    @GetMapping("/page")
+    public TableDataInfo<OrderVo> page(@Validated(QueryGroup.class) OrderBo bo, PageQuery pageQuery) {
+        bo.setWorkerId(getWorkerId());
+        return iOrderService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取订单详细信息
+     */
+    @FilePathSplicing(type = FilePathSplicingType.RESPONSE)
+    @ApiOperation("获取订单详细信息")
+    @GetMapping("/info/{id}")
+    public R<OrderVo> getInfo(@ApiParam("主键")
+                                                  @NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return R.ok(iOrderService.queryById(id));
+    }
+
+    @ApiOperation("开始服务")
+    @RepeatSubmit()
+    @PostMapping("/startService/{id}")
+    public R<Void> startService(@ApiParam("主键")
+                              @NotNull(message = "主键不能为空")
+                              @PathVariable("id") Long id) {
+        return toAjax(iOrderService.startService(id, getWorkerId()) ? 1 : 0);
+    }
+
+    @ApiOperation("完成服务")
+    @RepeatSubmit()
+    @PostMapping("/finishService/{id}")
+    public R<Void> finishService(@ApiParam("主键")
+                                     @NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return toAjax(iOrderService.finishService(id, getWorkerId()) ? 1 : 0);
+    }
+
+    @ApiOperation("获取管理老师电话")
+    @GetMapping("/getManagerPhone/{id}")
+    public R<String> getManagerPhone(@ApiParam("主键")
+                                         @NotNull(message = "主键不能为空")
+                                         @PathVariable("id") Long id) {
+        return R.ok(iOrderService.getManagerPhone(id, getWorkerId()));
+    }
+}

+ 1 - 2
ruoyi-common/src/main/java/com/ruoyi/common/exception/user/ApiUserException.java

@@ -14,8 +14,7 @@ public enum ApiUserException implements IIntegerEnum {
     // TODO 注意检查错误码,保证系统内唯一
     USER_NOT_EXISTS(100001, "用户不存在"),
     USER_IS_NOT_TEACHER(100002, "用户不是老师"),
-
-    ;
+    USER_IS_NOT_WORKER(100003, "用户不是护工");
 
     private Integer code;
 

+ 6 - 0
ruoyi-info/src/main/java/com/ruoyi/info/order/domain/vo/OrderReviewsVo.java

@@ -75,5 +75,11 @@ public class OrderReviewsVo {
     @ApiModelProperty("内容")
     private String content;
 
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    @ApiModelProperty("创建时间")
+    private Date createTime;
 
 }

+ 6 - 0
ruoyi-info/src/main/java/com/ruoyi/info/order/domain/vo/OrderVo.java

@@ -3,8 +3,10 @@ package com.ruoyi.info.order.domain.vo;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.annotation.Sensitive;
 import com.ruoyi.common.convert.ExcelDictConvert;
 import com.ruoyi.common.convert.ExcelEnumConvert;
+import com.ruoyi.common.enums.SensitiveStrategy;
 import com.ruoyi.common.filepathsplicing.FilePathValue;
 import com.ruoyi.info.hospital.domain.vo.HospitalVo;
 import com.ruoyi.info.order.enums.CancellationMethod;
@@ -119,6 +121,7 @@ public class OrderVo {
     @ExcelProperty(value = "就诊人姓名", order = 17)
     @ApiModelProperty("就诊人姓名")
     private String patientName;
+    @Sensitive(strategy = SensitiveStrategy.PHONE)
     @ExcelProperty(value = "就诊人电话", order = 18)
     @ApiModelProperty("手机号")
     private String patientMobile;
@@ -246,4 +249,7 @@ public class OrderVo {
 
     @ApiModelProperty("订单护工信息")
     private OrderWorkerChangeRecordVo orderWorkerChangeRecord;
+
+    @ApiModelProperty("订单评价信息")
+    private OrderReviewsVo orderReviews;
 }

+ 4 - 4
ruoyi-info/src/main/java/com/ruoyi/info/order/domain/vo/OrderWorkerChangeRecordVo.java

@@ -1,14 +1,13 @@
 package com.ruoyi.info.order.domain.vo;
 
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import com.ruoyi.common.annotation.ExcelDictFormat;
-import com.ruoyi.common.convert.ExcelDictConvert;
+import com.ruoyi.common.annotation.Sensitive;
+import com.ruoyi.common.enums.SensitiveStrategy;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
 import java.util.Date;
 
 
@@ -56,6 +55,7 @@ public class OrderWorkerChangeRecordVo {
     /**
      * 护工手机号
      */
+    @Sensitive(strategy = SensitiveStrategy.PHONE)
     @ExcelProperty(value = "护工手机号")
     @ApiModelProperty("护工手机号")
     private String workerPhoneNumber;

+ 5 - 1
ruoyi-info/src/main/java/com/ruoyi/info/order/exception/OrderExceptionEnum.java

@@ -15,7 +15,11 @@ public enum OrderExceptionEnum implements IIntegerEnum {
     Order_STATUS_ERROR(800003, "订单不是待确认,不可取消!"),
     Order_WORKER_NOT_IN_HOSPITAL(800004, "当前护工的常驻医院不在本医院,不可分配!"),
     Order_WORKER_NOT_ENABLE(800005, "当前护工状态不可接单,不可分配!"),
-    Order_STATUS_IS_NOT_ASSIGN(800006, "当前订单状态无法分配或更换护工!");
+    Order_STATUS_IS_NOT_ASSIGN(800006, "当前订单状态无法分配或更换护工!"),
+    Order_STATUS_IS_NOT_START(800007, "当前订单状态无法开始服务!"),
+    Order_WORKER_IS_NOT_YOURS(800008, "当前订单的护工不是您本人,无法操作!"),
+    Order_STATUS_IS_NOT_PROGRESS(800009, "当前订单状态无法完成服务!"),
+    Order_STATUS_IS_NOT_EVALUATED(800010, "当前订单状态无法评价!");
 
     private Integer code;
 

+ 1 - 0
ruoyi-info/src/main/java/com/ruoyi/info/order/service/IOrderReviewsService.java

@@ -74,4 +74,5 @@ public interface IOrderReviewsService {
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
+    OrderReviewsVo queryByOrderId(Long orderId);
 }

+ 11 - 0
ruoyi-info/src/main/java/com/ruoyi/info/order/service/IOrderService.java

@@ -5,6 +5,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.info.hospital.domain.vo.HospitalStatisticsVo;
 import com.ruoyi.info.order.domain.Order;
 import com.ruoyi.info.order.domain.bo.OrderBo;
+import com.ruoyi.info.order.domain.bo.OrderReviewsBo;
 import com.ruoyi.info.order.domain.vo.OrderVo;
 import com.ruoyi.info.order.enums.CancellationMethod;
 
@@ -87,4 +88,14 @@ public interface IOrderService {
     List<HospitalStatisticsVo> queryHospitalOrderStatistics();
 
     boolean assignWorker(OrderBo bo, Long teacherId);
+
+    boolean startService(Long id, Long workerId);
+
+    boolean finishService(Long id, Long workerId);
+
+    String getManagerPhone(Long id, Long workerId);
+
+    String getWorkerPhone(Long id, Long teacherId);
+
+    boolean evaluate(OrderReviewsBo bo);
 }

+ 5 - 0
ruoyi-info/src/main/java/com/ruoyi/info/order/service/impl/OrderReviewsServiceImpl.java

@@ -152,4 +152,9 @@ public class OrderReviewsServiceImpl implements IOrderReviewsService {
         return baseMapper.deleteBatchIds(ids) > 0;
     }
 
+    @Override
+    public OrderReviewsVo queryByOrderId(Long orderId) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<OrderReviews>().eq(OrderReviews::getOrderId, orderId).last("limit 1"));
+    }
+
 }

+ 89 - 0
ruoyi-info/src/main/java/com/ruoyi/info/order/service/impl/OrderServiceImpl.java

@@ -24,16 +24,20 @@ import com.ruoyi.info.hospital.service.IHospitalService;
 import com.ruoyi.info.management.domain.vo.ManagementTeacherVo;
 import com.ruoyi.info.management.service.IManagementTeacherService;
 import com.ruoyi.info.nursing.domain.NursingWorker;
+import com.ruoyi.info.nursing.domain.vo.NursingWorkerVo;
 import com.ruoyi.info.nursing.service.INursingWorkerService;
 import com.ruoyi.info.order.domain.Order;
 import com.ruoyi.info.order.domain.bo.OrderBo;
+import com.ruoyi.info.order.domain.bo.OrderReviewsBo;
 import com.ruoyi.info.order.domain.bo.OrderWorkerChangeRecordBo;
+import com.ruoyi.info.order.domain.vo.OrderReviewsVo;
 import com.ruoyi.info.order.domain.vo.OrderVo;
 import com.ruoyi.info.order.domain.vo.OrderWorkerChangeRecordVo;
 import com.ruoyi.info.order.enums.CancellationMethod;
 import com.ruoyi.info.order.enums.OrderStatus;
 import com.ruoyi.info.order.exception.OrderExceptionEnum;
 import com.ruoyi.info.order.mapper.OrderMapper;
+import com.ruoyi.info.order.service.IOrderReviewsService;
 import com.ruoyi.info.order.service.IOrderService;
 import com.ruoyi.info.order.service.IOrderWorkerChangeRecordService;
 import com.ruoyi.info.patient.domain.Patient;
@@ -77,6 +81,7 @@ public class OrderServiceImpl implements IOrderService {
     private final INursingWorkerService nursingWorkerService;
     private final IOrderWorkerChangeRecordService orderWorkerChangeRecordService;
     private final IManagementTeacherService managementTeacherService;
+    private final IOrderReviewsService orderReviewsService;
 
     /**
      * 查询订单分页
@@ -168,6 +173,11 @@ public class OrderServiceImpl implements IOrderService {
             }
             vo.setOrderWorkerChangeRecord(orderWorkerChangeRecordVo);
         }
+        //评价
+        if (OrderStatus.done.equals(vo.getStatus())) {
+            OrderReviewsVo orderReviewsVo = orderReviewsService.queryByOrderId(vo.getId());
+            vo.setOrderReviews(orderReviewsVo);
+        }
         return vo;
     }
 
@@ -360,6 +370,85 @@ public class OrderServiceImpl implements IOrderService {
         return baseMapper.updateById(order) > 0;
     }
 
+    @Transactional
+    @Override
+    public boolean startService(Long id, Long workerId) {
+        Order order = loadById(id, true);
+        if (!OrderStatus.wait_service.equals(order.getStatus())) {
+            throw new ServiceException(OrderExceptionEnum.Order_STATUS_IS_NOT_START);
+        }
+        if (!order.getWorkerId().equals(workerId)) {
+            throw new ServiceException(OrderExceptionEnum.Order_WORKER_IS_NOT_YOURS);
+        }
+        order.setStatus(OrderStatus.in_progress);
+        //更新开始时间
+        OrderWorkerChangeRecordVo orderWorkerChangeRecordVo = orderWorkerChangeRecordService.queryByOrderAndWorker(id, workerId);
+        if (ObjectUtil.isNull(orderWorkerChangeRecordVo)) {
+            throw new ServiceException(OrderExceptionEnum.Order_WORKER_IS_NOT_YOURS);
+        }
+        OrderWorkerChangeRecordBo orderWorkerChangeRecordBo = new OrderWorkerChangeRecordBo();
+        orderWorkerChangeRecordBo.setId(orderWorkerChangeRecordVo.getId());
+        orderWorkerChangeRecordBo.setWorkerStartTime(new Date());
+        orderWorkerChangeRecordService.updateByBo(orderWorkerChangeRecordBo);
+        return baseMapper.updateById(order) > 0;
+    }
+
+    @Transactional
+    @Override
+    public boolean finishService(Long id, Long workerId) {
+        Order order = loadById(id, true);
+        if (!OrderStatus.in_progress.equals(order.getStatus())) {
+            throw new ServiceException(OrderExceptionEnum.Order_STATUS_IS_NOT_PROGRESS);
+        }
+        if (!order.getWorkerId().equals(workerId)) {
+            throw new ServiceException(OrderExceptionEnum.Order_WORKER_IS_NOT_YOURS);
+        }
+        order.setStatus(OrderStatus.wait_evaluated);
+        //更新结束时间
+        OrderWorkerChangeRecordVo orderWorkerChangeRecordVo = orderWorkerChangeRecordService.queryByOrderAndWorker(id, workerId);
+        if (ObjectUtil.isNull(orderWorkerChangeRecordVo)) {
+            throw new ServiceException(OrderExceptionEnum.Order_WORKER_IS_NOT_YOURS);
+        }
+        OrderWorkerChangeRecordBo orderWorkerChangeRecordBo = new OrderWorkerChangeRecordBo();
+        orderWorkerChangeRecordBo.setId(orderWorkerChangeRecordVo.getId());
+        orderWorkerChangeRecordBo.setWorkerEndTime(new Date());
+        orderWorkerChangeRecordService.updateByBo(orderWorkerChangeRecordBo);
+        return baseMapper.updateById(order) > 0;
+    }
+
+    @Override
+    public String getManagerPhone(Long id, Long workerId) {
+        OrderWorkerChangeRecordVo orderWorkerChangeRecordVo = orderWorkerChangeRecordService.queryByOrderAndWorker(id, workerId);
+        if (ObjectUtil.isNotNull(orderWorkerChangeRecordVo)) {
+            ManagementTeacherVo managementTeacherVo = managementTeacherService.queryById(orderWorkerChangeRecordVo.getOperatingTeacherId());
+            return ObjectUtil.isNotNull(managementTeacherVo) ? managementTeacherVo.getPhoneNumber() : null;
+        }
+        return null;
+    }
+
+    @Override
+    public String getWorkerPhone(Long id, Long teacherId) {
+        Order order = loadById(id, true);
+        if (ObjectUtil.isNotNull(order.getWorkerId())) {
+            NursingWorkerVo nursingWorkerVo = nursingWorkerService.queryById(order.getWorkerId());
+            return ObjectUtil.isNotNull(nursingWorkerVo) ? nursingWorkerVo.getPhoneNumber() : null;
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean evaluate(OrderReviewsBo bo) {
+        Order order = loadById(bo.getOrderId(), true);
+        if (!OrderStatus.wait_evaluated.equals(order.getStatus())) {
+            throw new ServiceException(OrderExceptionEnum.Order_STATUS_IS_NOT_EVALUATED);
+        }
+        order.setStatus(OrderStatus.done);
+        //新增评价
+        orderReviewsService.insertByBo(bo);
+        return baseMapper.updateById(order) > 0;
+    }
+
     private List<OrderVo> convertAllList(List<OrderVo> list, boolean queryPatient) {
         return list.stream().map(o -> {
             HospitalVo hospitalVo = JSONObject.parseObject(o.getHospitalInfo(), HospitalVo.class);

+ 3 - 0
ruoyi-info/src/main/java/com/ruoyi/info/patient/domain/vo/PatientVo.java

@@ -2,6 +2,8 @@ package com.ruoyi.info.patient.domain.vo;
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.annotation.Sensitive;
+import com.ruoyi.common.enums.SensitiveStrategy;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -44,6 +46,7 @@ public class PatientVo {
     /**
      * 手机号
      */
+    @Sensitive(strategy = SensitiveStrategy.PHONE)
     @ExcelProperty(value = "手机号")
     @ApiModelProperty("手机号")
     private String mobile;

+ 5 - 0
ruoyi-system/pom.xml

@@ -29,6 +29,11 @@
             <artifactId>ruoyi-oss</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 20 - 1
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysSensitiveServiceImpl.java

@@ -1,7 +1,13 @@
 package com.ruoyi.system.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.core.domain.model.UserExtendInfo;
 import com.ruoyi.common.core.service.SensitiveService;
+import com.ruoyi.common.enums.LoginUserTypeEnum;
 import com.ruoyi.common.helper.LoginHelper;
+import com.ruoyi.framework.interceptor.UserContext;
+import com.ruoyi.user.domain.User;
 import org.springframework.stereotype.Service;
 
 /**
@@ -20,7 +26,20 @@ public class SysSensitiveServiceImpl implements SensitiveService {
      */
     @Override
     public boolean isSensitive() {
-        return LoginHelper.isAdmin();
+        try {
+            LoginUser loginUser = LoginHelper.getLoginUser();
+            return ObjectUtil.isNotNull(loginUser);
+        } catch (Exception e) {
+            // C端
+            User user = UserContext.currentUser();
+            if (ObjectUtil.isNotNull(user)) {
+                UserExtendInfo userExtendInfo = user.getUserExtendInfo();
+                if (ObjectUtil.isNotNull(userExtendInfo)) {
+                    return LoginUserTypeEnum.ORDINARY.getKey().equals(userExtendInfo.getLoginUserType());
+                }
+            }
+            return false;
+        }
     }
 
 }