1、controller控制层
package com.sxc.workflow.controller.suggest;
import com.sxc.workflow.client.suggest.ProcessSuggestServiceClient;
import com.sxc.workflow.response.Page.PageResult;
import com.sxc.workflow.response.suggest.ProcessSuggestItemDTO;
import com.sxc.workflow.service.vo.ResultBean;
import com.sxc.workflow.vo.param.suggest.SuggestParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/suggest")
public class ProcessSuggestController {
@Autowired
private ProcessSuggestServiceClient processSuggestClient;
/**
* suggest接口,可以根据输入框指定匹配申请单号、业务单号、单据、申请人员等
*
* @return
*/
@PostMapping("/r/input")
public ResultBean<PageResult<ProcessSuggestItemDTO>> input(@RequestBody SuggestParam suggestParam) {
return processSuggestClient.input(suggestParam);
}
}
package com.sxc.workflow.vo.param.suggest;
import com.sxc.workflow.request.page.PageRequestDTO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author zhouzhiwei
* @date 2020/11/16 10:35
* @description
*/
@Data
@EqualsAndHashCode
@Accessors(chain = true)
public class SuggestParam extends PageRequestDTO implements Serializable {
/**
* @see com.sxc.workflow.common.enums.ProcessSuggestTypeEnum
*/
private String suggestType;
/**
* suggest关键字
*/
private String keyword;
}
2、client层
package com.sxc.workflow.client.suggest;
import com.alibaba.dubbo.config.annotation.Reference;
import com.sxc.workflow.common.enums.ProcessSuggestTypeEnum;
import com.sxc.workflow.response.Page.PageResult;
import com.sxc.workflow.response.ProcessBaseResponse;
import com.sxc.workflow.response.suggest.ProcessSuggestItemDTO;
import com.sxc.workflow.service.suggest.ProcessSuggestRpcService;
import com.sxc.workflow.service.vo.ResultBean;
import com.sxc.workflow.vo.param.suggest.SuggestParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class ProcessSuggestServiceClient {
@Reference(check = false)
private ProcessSuggestRpcService processSuggestRpcService;
public ResultBean<PageResult<ProcessSuggestItemDTO>> input(SuggestParam suggestParam) {
ProcessSuggestTypeEnum tradeSuggestTypeEnum = ProcessSuggestTypeEnum.findByCode(suggestParam.getSuggestType());
if (tradeSuggestTypeEnum == null) {
return ResultBean.ok();
}
ProcessBaseResponse<PageResult<ProcessSuggestItemDTO>> suggest = processSuggestRpcService.suggest(tradeSuggestTypeEnum, suggestParam.getKeyword(), suggestParam);
return suggest.isSuccess() ? ResultBean.ok(suggest.getData()) : ResultBean.failed(suggest.getErrmsg());
}
}
3、api层
package com.sxc.workflow.service.suggest;
import com.sxc.workflow.common.enums.ProcessSuggestTypeEnum;
import com.sxc.workflow.request.page.PageRequestDTO;
import com.sxc.workflow.response.Page.PageResult;
import com.sxc.workflow.response.ProcessBaseResponse;
import com.sxc.workflow.response.suggest.ProcessSuggestItemDTO;
/**
*
* @author zhouzhiwei 2021/1/13.
* @version 1.0.0
* @dubbo
*/
public interface ProcessSuggestRpcService {
/**
* suggest搜索
*
* @param tradeSuggestTypeEnum
* @param keyword
* @param pageRequestDTO
* @return
*/
ProcessBaseResponse<PageResult<ProcessSuggestItemDTO>> suggest(ProcessSuggestTypeEnum tradeSuggestTypeEnum, String keyword, PageRequestDTO pageRequestDTO);
}
4、server服务的api.service.impl层
package com.sxc.workflow.api.service.impl.suggest;
import com.sxc.workflow.biz.suggest.ProcessSuggestBizService;
import com.sxc.workflow.common.enums.ProcessSuggestTypeEnum;
import com.sxc.workflow.request.page.PageRequestDTO;
import com.sxc.workflow.response.Page.PageResult;
import com.sxc.workflow.response.ProcessBaseResponse;
import com.sxc.workflow.response.suggest.ProcessSuggestItemDTO;
import com.sxc.workflow.service.suggest.ProcessSuggestRpcService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class ProcessSuggestRpcServiceImpl implements ProcessSuggestRpcService {
@Autowired
private ProcessSuggestBizService processSuggestBizService;
@Override
public ProcessBaseResponse<PageResult<ProcessSuggestItemDTO>> suggest(ProcessSuggestTypeEnum tradeSuggestTypeEnum, String keyword, PageRequestDTO pageRequestDTO) {
return processSuggestBizService.suggest(tradeSuggestTypeEnum, keyword, pageRequestDTO);
}
}
5、biz业务层
package com.sxc.workflow.biz.suggest;
import com.sxc.workflow.biz.suggest.strategy.AbstractTradeSuggestStrategy;
import com.sxc.workflow.biz.suggest.strategy.ProcessSuggestStrategyContext;
import com.sxc.workflow.common.enums.ProcessSuggestTypeEnum;
import com.sxc.workflow.request.page.PageRequestDTO;
import com.sxc.workflow.response.Page.PageResult;
import com.sxc.workflow.response.ProcessBaseResponse;
import com.sxc.workflow.response.suggest.ProcessSuggestItemDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class ProcessSuggestBizService {
public ProcessBaseResponse<PageResult<ProcessSuggestItemDTO>> suggest(ProcessSuggestTypeEnum tradeSuggestTypeEnum, String keyword, PageRequestDTO pageRequestDTO) {
final AbstractTradeSuggestStrategy suggestStrategy = ProcessSuggestStrategyContext.getStrategy(tradeSuggestTypeEnum);
return ProcessBaseResponse.success(suggestStrategy.suggest(keyword, pageRequestDTO));
}
}
6、ProcessSuggestStrategyContext工具类
这里是结合spring,利用bean初始化前,将注入的List,进行扫描注解,获取注解里的值put到map容器,即可get出来。
package com.sxc.workflow.biz.suggest.strategy;
import cn.hutool.core.collection.CollectionUtil;
import com.google.common.collect.Maps;
import com.sxc.workflow.annotation.ProcessSuggestType;
import com.sxc.workflow.common.enums.ProcessSuggestTypeEnum;
import org.springframework.aop.support.AopUtils;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* @author zhouzhiwei
* @date 2020/11/2 19:50
* @description
*/
@Component
public class ProcessSuggestStrategyContext {
@Resource
private List<AbstractTradeSuggestStrategy> suggestStrategies;
private static Map<ProcessSuggestTypeEnum, AbstractTradeSuggestStrategy> suggestStrategyMap = Maps.newHashMap();
@PostConstruct
public void init() {
if (CollectionUtil.isEmpty(suggestStrategies)) {
return;
}
suggestStrategies.forEach(strategy -> {
ProcessSuggestType suggestType = AopUtils.getTargetClass(strategy).getAnnotation(ProcessSuggestType.class);
suggestStrategyMap.put(suggestType.type(), strategy);
});
}
public static AbstractTradeSuggestStrategy getStrategy(ProcessSuggestTypeEnum suggestType) {
AbstractTradeSuggestStrategy suggestStrategy = suggestStrategyMap.get(suggestType);
if (null == suggestStrategy) {
throw new IllegalArgumentException("not fond suggestType");
}
return suggestStrategy;
}
}
7、定义一个抽象类AbstractTradeSuggestStrategy
package com.sxc.workflow.biz.suggest.strategy;
import com.sxc.workflow.request.page.PageRequestDTO;
import com.sxc.workflow.response.Page.PageResult;
/**
* @author zhouzhiwei
* @date 2020/11/2 19:38
* @description
*/
public abstract class AbstractTradeSuggestStrategy<T> {
/**
* 搜索列表
*
* @param input
* @param pageRequestDTO
* @throws Exception
*/
public abstract PageResult<T> suggest(String input, PageRequestDTO pageRequestDTO);
}
8、使用者只需要关注AbstractTradeSuggestStrategy的子类即可完成功能,例如
package com.sxc.workflow.biz.suggest.user;
import com.sxc.workflow.annotation.ProcessSuggestType;
import com.sxc.workflow.biz.suggest.strategy.AbstractTradeSuggestStrategy;
import com.sxc.workflow.client.mdm.MainDataClient;
import com.sxc.workflow.common.enums.ProcessSuggestTypeEnum;
import com.sxc.workflow.common.vo.CodeNameVo;
import com.sxc.workflow.request.page.PageRequestDTO;
import com.sxc.workflow.response.Page.PageResult;
import com.sxc.workflow.utils.PageUtil.PageUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@ProcessSuggestType(type = ProcessSuggestTypeEnum.USER_NAME)
@Service
@Slf4j
public class UserNameSuggestStrategy extends AbstractTradeSuggestStrategy {
@Autowired
private MainDataClient mainDataClient;
@Override
public PageResult suggest(String input, PageRequestDTO pageRequestDTO) {
List<CodeNameVo> suggestRecords = mainDataClient.getPersonListByName(input);
return PageUtil.getPageResult(suggestRecords);
}
}
9、枚举
package com.sxc.workflow.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @Description suggest接口数据类型定义
* @Date 2020/11/2 9:50
*/
@Getter
@AllArgsConstructor
public enum ProcessSuggestTypeEnum {
USER_NAME("USER_NAME","用户名称");
private String code;
private String name;
public static ProcessSuggestTypeEnum findByCode(String code) {
for (ProcessSuggestTypeEnum typeEnum : values()) {
if (typeEnum.getCode().equals(code)) {
return typeEnum;
}
}
return null;
}
}