package com.java110.code.api; import com.alibaba.fastjson.JSONObject; import com.java110.code.smo.IPrimaryKeyServiceSMO; import com.java110.common.constant.ResponseConstant; import com.java110.common.exception.ResponseErrorException; import com.java110.common.util.Assert; import com.java110.common.util.DateUtil; import com.java110.core.base.controller.BaseController; import com.java110.core.context.CodeDataFlow; import com.java110.core.factory.DataFlowFactory; import com.java110.core.factory.DataTransactionFactory; import com.java110.feign.code.ICodeApi; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; import java.util.UUID; /** * ID 生成 * Created by wuxw on 2018/6/3. */ @RestController public class CodeApi extends BaseController implements ICodeApi { @Autowired IPrimaryKeyServiceSMO primaryKeyServiceSMOImpl; @RequestMapping(path = "/codeApi/generate", method = RequestMethod.GET) public String generateGet(HttpServletRequest request) { return DataTransactionFactory.createCodeResponseJson(ResponseConstant.NO_TRANSACTION_ID, "-1", ResponseConstant.RESULT_CODE_ERROR, "不支持Get方法请求").toJSONString(); } @RequestMapping(path = "/codeApi/generate", method = RequestMethod.POST) public String generatePost(@RequestBody String orderInfo, HttpServletRequest request) { Map headers = new HashMap(); try { getRequestInfo(request, headers); //预校验 preValiateOrderInfo(orderInfo, headers); CodeDataFlow dataFlow = DataFlowFactory.newInstance(CodeDataFlow.class).builder(orderInfo, null); primaryKeyServiceSMOImpl.generateCode(dataFlow); return dataFlow.getResJson().toJSONString(); } catch (Exception e) { logger.error("请求订单异常", e); return DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_CODE_ERROR, e.getMessage() + e).toJSONString(); } } /** * 获取请求信息 * * @param request * @param headers * @throws RuntimeException */ private void getRequestInfo(HttpServletRequest request, Map headers) throws Exception { try { super.initHeadParam(request, headers); super.initUrlParam(request, headers); } catch (Exception e) { logger.error("加载头信息失败", e); throw e; } } /** * 这里预校验,请求报文中不能有 dataFlowId * * @param orderInfo */ private void preValiateOrderInfo(String orderInfo, Map headers) { Assert.jsonObjectHaveKey(orderInfo, "prefix", "没有包含prefix"); Assert.jsonObjectHaveKey(orderInfo, "transactionId", "没有包含transactionId"); } public IPrimaryKeyServiceSMO getPrimaryKeyServiceSMOImpl() { return primaryKeyServiceSMOImpl; } public void setPrimaryKeyServiceSMOImpl(IPrimaryKeyServiceSMO primaryKeyServiceSMOImpl) { this.primaryKeyServiceSMOImpl = primaryKeyServiceSMOImpl; } /** * 生成 编码 * * @param prefix 前缀 * @return */ @Override public String generateCode(String prefix) { try { JSONObject requestInfo = new JSONObject(); //封装符合构建CodeDataFlow对象的JSON对象参数 builderRequestInfo(prefix, requestInfo); CodeDataFlow dataFlow = DataFlowFactory.newInstance(CodeDataFlow.class).builder(requestInfo.toJSONString(), null); //生成编码 primaryKeyServiceSMOImpl.generateCode(dataFlow); if (!ResponseConstant.RESULT_CODE_SUCCESS.equals(dataFlow.getResJson().getString("code"))) { throw new ResponseErrorException(ResponseConstant.RESULT_CODE_ERROR, "生成oId编码失败 " + dataFlow.getResJson().getString("message")); } return dataFlow.getResJson().getString("id"); } catch (Exception e) { logger.error("请求订单异常", e); return ResponseConstant.RESULT_CODE_ERROR; } } /** * 封装符合构建CodeDataFlow对象的JSON对象参数 * * @param prefix 前缀 * @param requestInfo 构建的请求JSON对象 */ private void builderRequestInfo(String prefix, JSONObject requestInfo) { requestInfo.put("transactionId", UUID.randomUUID().toString().replace("-", "")); requestInfo.put("prefix", prefix); requestInfo.put("requestTime", DateUtil.getNowDefault()); } }