从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,"已取消");
}
}