不太对的状态模式

66 阅读2分钟

从controller开始到service结束的工单状态模式实践,优化方向在service解耦,行为规则抽离

@Api(tags = "后台工单")
@RestController
@RequestMapping("/web/ticket")
public class TicketController extends BaseController {

@Autowired
private StateHandler stateHandler;
/**
 * 指派
 */
@PreAuthorize("@ss.hasPermi('web:ticket:edit')")
@Log(title = "工单指派" , businessType = BusinessType.UPDATE)
@TicketOperaLogAn(operaType = TicketOperaConstants.ASSIGN)
@ApiOperation(value = "指派")
@PostMapping("/assignment")
public AjaxResult assignment(@Validated @RequestBody TicketInfo ticketInfo) {
    Ticket ticket = ticketService.selectTicketById(ticketInfo.getTicketId());
    if (ticket == null) {
        return new AjaxResult(HttpStatus.NOT_FOUND, "无此工单");
    }
    // 将状态字符串转换为 Enum<Status>
    Enum<Status> currentStatus = Status.getById(ticket.getTicketStatus());
    return stateHandler.assignment(ticketInfo, currentStatus);
}
}

import cn.risesun.app.domain.event.*;
import cn.risesun.app.domain.model.State;
import cn.risesun.app.domain.model.Status;
import cn.risesun.app.domain.model.TicketInfo;
import cn.risesun.common.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class StateHandler {
    private final Map<Status, State> stateMap = new ConcurrentHashMap<>();

    @Autowired
    private PendingAssignmentState pendingAssignmentState;
}
import cn.risesun.common.domain.AjaxResult;

public abstract class State {
    /**
     * 指派
     *
     * @param ticketInfo    指派工单所需信息
     * @return 执行结果
     */
    public abstract AjaxResult assignment(TicketInfo ticketInfo);

public enum Status {
    // 1待分配 2已指派 3已接受 4进行中 5已完成 6已结算 7已取消 8暂停挂起 9已关闭
    PendingAssignment(1, "PendingAssignment"),
    Assigned(2,"Assigned"),
    Accepted(3,"Accepted"),
    InProgress(4,"InProgress"),
    Completed(5,"Completed"),
    Settled(6,"Settled"),
    Cancelled(7,"Cancelled"),
    OnHold(8,"OnHold"),
    Closed(9,"Closed");

    Status(int code, String name) {
        this.code = code;
        this.name = name;
    }

    private int code;

    private String name;

    public int getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    //通过ID获取枚举值
    public static Status getById(Integer code) {
        if(code == null){
            return null;
        }
        for(Status v : values()) {
            if(v.code == code) {
                return v;
            }
        }
        return null;
    }

}

import cn.risesun.app.domain.model.State;
import cn.risesun.app.domain.model.Status;
import cn.risesun.app.domain.model.TicketInfo;
import cn.risesun.app.service.ITicketService;
import cn.risesun.common.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class PendingAssignmentState extends State {

    @Autowired
    private ITicketService ticketService;

    @Override
    public AjaxResult assignment(TicketInfo ticketInfo) {
        ticketService.assignment(ticketInfo);
        return new AjaxResult( 200,"已指派");
    }

    @Override
    public AjaxResult reAssignment(TicketInfo ticketInfo) {
        return new AjaxResult( 409,"待分配状态无需转派");
    }

    @Override
    public AjaxResult accept(Integer ticketId) {
        return new AjaxResult( 409,"待分配状态无需接受");
    }

    @Override
    public AjaxResult reject(Integer ticketId) {
        return new AjaxResult( 409,"待分配状态无需拒绝");
    }

    @Override
    public AjaxResult start(TicketInfo ticketInfo) {
        return new AjaxResult( 409,"待分配状态无需开始");
    }

    @Override
    public AjaxResult hold(TicketInfo ticketInfo) {
        return new AjaxResult( 409,"待分配状态无需暂停");
    }

    @Override
    public AjaxResult complete(TicketInfo ticketInfo)  {
        return new AjaxResult( 409,"待分配状态不可完成");
    }

    @Override
    public AjaxResult settle(TicketInfo ticketInfo) {
        return new AjaxResult( 409,"待分配状态无需结算");
    }

    @Override
    public AjaxResult close(Integer ticketId, Enum<Status> currentStatus) {
        return new AjaxResult( 409,"待分配状态不可关闭");
    }

    @Override
    public AjaxResult cancel(Integer ticketId) {
        ticketService.cancel(ticketId);
        return new AjaxResult( 200,"已取消");
    }
}