1.代码示例
/**
* 查询合同释放额度历史查询
*
* @param dctx 适配器
* @param context 上下文
* @return 结果
* @throws BusinessException 异常
* @author hanyu
* @see [类、类#方法、类#成员]
*/
public static Map<String, Object> queryContractHistoryList(DispatchContext dctx, Map<String, Object> context)
throws BusinessException {
Debug.logInfo("=== ===enter queryContractHistoryList=== ===" + context, MODULE);
String contractNo = (String) context.get(Fields.CONTRACT_NO);
GenericDelegator delegator = (GenericDelegator) dctx.getDelegator();
Map<String, Object> fields = FastMap.newInstance();
fields.put(Fields.CONTRACT_NO, contractNo);
List<String> orderBy = FastList.newInstance();
orderBy.add(Fields.CREATED_STAMP);
EntityExpr entityCondition = DBOperatorUtils.getEntityExpr(fields);
FastSet<String> fieldsToSelect = FastSet.newInstance();
fieldsToSelect.add(Fields.CREATED_STAMP);//创建时间
fieldsToSelect.add(Fields.OWNER_PARTY_ID);//经销商编号
fieldsToSelect.add(Fields.OWNER_PARTY_NAME);//经销商名称
fieldsToSelect.add(Fields.FROM_DATE);//开始日期
fieldsToSelect.add(Fields.THRU_DATE);//结束日期
fieldsToSelect.add(Fields.CONTRACT_START_DATE);//合同开始日期
fieldsToSelect.add(Fields.CONTRACT_END_DATE);//合同结束日期
fieldsToSelect.add(Fields.CONFIRM_FACILITY);//释放额度
fieldsToSelect.add(Fields.STATUS_ID);
GenericValue msg = null;
BigDecimal nowFacTotal = BigDecimal.ZERO;
try {
PagingList pagingList = delegator.findPartialListSingleTable(Fields.FACILITY_MSG,
entityCondition,
null,
fieldsToSelect,
null,
null,
1,
20);
if (UtilValidate.isEmpty(pagingList.getResult())) {
return ServiceUtil.returnSuccess();
}
for (GenericValue gv : pagingList.getResult()) {
String statusId = (String) gv.get(Fields.STATUS_ID);
if (statusId.equals(Fields.FAC_CREATE) || statusId.equals(Fields.FAC_PAUSE)
|| statusId.equals(Fields.FAC_APPROVE)) {
nowFacTotal = nowFacTotal.add(gv.getBigDecimal(Fields.CONFIRM_FACILITY));
}
}
msg = pagingList.getResult().get(0);
} catch (GenericEntityException e) {
Debug.logError(e, MODULE);
throw new BusinessException(FacilityErrorUtil.getInternationalErrorMsg(FacilityErrorCode.ERROR_67313,
UtilMisc.toMap(Fields.TABLE, Fields.FACILITY_MSG)));
}
//创建临时list
List<Map<String, Object>> tempList = new ArrayList<>();
//根据合同号查询历史记录表
List<Map<String, Object>> historyList = FacHistoryQueryHelper.queryFacHistoryList(dctx, context);
//添加调减终止的变动记录
for (Map<String, Object> hisMap : historyList) {
Map<String, Object> tempMap = new HashMap<>();
tempMap.put(Fields.OWNER_PARTY_ID, msg.get(Fields.OWNER_PARTY_ID));
tempMap.put(Fields.OWNER_PARTY_NAME, msg.get(Fields.OWNER_PARTY_NAME));
tempMap.put(Fields.CHANGE_TIME, hisMap.get(Fields.MODIFY_DATE));
tempMap.put(Fields.CHANGE_VALUE, new BigDecimal((String) hisMap.get(Fields.REMARK_ONE)));
tempList.add(tempMap);
}
//对tempList里的内容按照变动时间排序
if (UtilValidate.isNotEmpty(tempList)) {
Collections.sort(tempList, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
String time1 = (String) o1.get(Fields.CHANGE_TIME);
String time2 = (String) o2.get(Fields.CHANGE_TIME);
return -time1.compareTo(time2);
}
});
}
//设置返回list
List<Map<String, Object>> facList = new ArrayList<>();
//计算变动后额度
if (UtilValidate.isNotEmpty(tempList)) {
for (int i = 0; i < tempList.size(); i++) {
Map<String, Object> changeMap = new HashMap<>();
changeMap.putAll(tempList.get(i));
BigDecimal curFacTotal = nowFacTotal;
curFacTotal = nowFacTotal;
BigDecimal changeVal = new BigDecimal(changeMap.get(Fields.CHANGE_VALUE).toString());
nowFacTotal = nowFacTotal.subtract(changeVal);
changeMap.put(Fields.FAC_TOTAL, curFacTotal);
changeMap.put("seqNo", String.valueOf(i + 1));
facList.add(changeMap);
}
}
Map<String, Object> returnMap = ReturnMapUtil.getSuccessMap();
returnMap.put(Fields.FAC_LIST, facList);
returnMap.put(Fields.TOTAL_NO, String.valueOf(facList.size()));
Debug.logInfo("=== ===exit queryContractHistoryList=== ===", MODULE);
return returnMap;
}
@ApiImplicitParams:用在请求的方法上,表示一组参数说明
@ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面
name:参数名
value:参数的汉字说明、解释
required:参数是否必须传
paramType:参数放在哪个地方
· header --> 请求参数的获取:@RequestHeader
· query --> 请求参数的获取:@RequestParam
· path(用于restful接口)–> 请求参数的获取:@PathVariable
· body(不常用)
· form(不常用)
dataType:参数类型,默认String,其它值dataType=“Integer”
defaultValue:参数的默认值
2.@HystrixCommand 注解 熔断、服务降级
所谓熔断就是说在调用服务时,在一定的时间内,调用失败的次数达到了一定的比例,调用方会认为服务处于不可用的状态,会组织后续的请求继续发送到服务方
默认请求失败,避免了服务器资源的过度消耗
但是这种机制不会一直持续下去,默认过一段时间会将接下来的一条请求放行(通过注解的参数设置),如果此条请求能够成功返回则表明服务可用,熔断机制结束,否则继续维持熔断状态。与之一起使用的操作有服务降级,指的是当发生熔断时,进行的后续操作,比如改变调用方式或者向上级抛出异常信息等等
eg:如图,当调用失败时候会进行服务降级,调用箭头处方法
1.通过feign客户端调用服务,可以使用feign内置的Hystrix功能,注意需要在配置文件中开启此功能
feign.hystrix.enabled=true
在项目启动类上需要加注解@EnableCircuitBreaker
3. @ApiOperation注解
@ApiOperation不是spring自带的注解是swagger里的
com.wordnik.swagger.annotations.ApiOperation
Swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目
实现了与SpingMVC框架的无缝集成功能,方便生成spring restful风格的接口文档,
同时swagger-ui还可以测试spring restful风格的接口功能。
什么是Ofbiz
是一个开源的,基于J2EE和XML规范的,用于构建大型企业级、跨平台、跨数据库、跨应用服务器的多层、
分布式电子上午类WEB应用的框架
OFBIZ所提供的系统框架,是一个纯Java的应用程序。框架提供的接口十分的完备,例如核心部件实体引擎,早期版本就有,已经十分的成熟。通过实体引擎,用户不用直接操纵数据库,建立库表、查询、视图、触发器等都可以通过写XML配置文件来完成。也有人提出,实体引擎不能够处理复杂的SQL查询,实际上,一方面这种复杂的SQL查询很少遇到,另一方面实体引擎也同样允许你用SQL代码来操纵这种复杂的查询
Ofbiz的MVC模式实现
Ofbiz最大的价值,也许就是它不仅仅是一个技术框架,更是一个实现企业应用得很好的业务框架。它的MVC模式不仅仅是Web层,而是贯穿于业务层和数据层,每一层都有出色的控制器
数据层的控制器 (Entity Engine)
实体引擎是Ofbiz最有价值、最核心的、也是最稳定的一个数据层控制器,通过它基本不用编码或很少编码就可以访问数据层。Ofbiz提供了用XML些配置文件的方法来操纵数据。
逻辑层的控制器 (Service Engine)
服务引擎是Ofbiz的另一个核心组件。Ofbiz只有这两个核心组件。实体引擎代表业务数据,而服务引擎代表了业务逻辑
Web层控制器 (Control Servlet, JPublish, etc)
Web层控制器的核心是Control Servlet。和Struts一样,Web层的流控制器的配置文件也是一个XML文件。
Bosent实体
一、Entity Engine屏蔽了数据库访问的很多细节,通过XML配置文件定义描述实体,实体引擎自动维护实体 至数据库的所有细节
二、支持主流数据库,包括Oracle、MySql、MS SQL、PostgreSql等 三、Bosent实体引擎与其他的ORM框架最大的不同,是Bosent只有一个GenericValue对象,不像其它ORM 框架,要定义各种不同类型的,防止产生过多的实体对象,避免产生类爆炸。
四、Bosent的GenericValue对象不同于其它ORM框架定义的实体对象,它没有getter和setter方法,全部通 过put(key,value)的形式来设置属性的值,保持最大的灵活性。