NC65 活期存款计息提供的查询接口:

package nc.impl.fac.ia;import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;import nc.bs.fac.ia.InterestAccrualPubBS;
import nc.bs.fac.proxy.AiacOuterServiceProxy;
import nc.bs.framework.common.NCLocator;
import nc.impl.fac.ia.ace.AceDemandintcalQueryImpl;
import nc.itf.bd.bankacc.subinfo.IBankAccSubInfoQueryService;
import nc.itf.fac.demandintlist.IDemandIntListQuery;
import nc.itf.fi.rateconfig.IRateconfigQueryService;
import nc.md.persist.framework.IMDPersistenceQueryService;
import nc.md.persist.framework.MDPersistenceService;
import nc.ui.querytemplate.querytree.IQueryScheme;
import nc.vo.bd.bankaccount.BankAccSubVO;
import nc.vo.fac.ia.AggDemandIntCalVO;
import nc.vo.fac.ia.DemandIntCalVO;
import nc.vo.fac.interestobj.AccInterestObjVO;
import nc.vo.fac.interestobj.AggAccInterestObjVO;
import nc.vo.fac.interestobj.IntAccountInfoVO;
import nc.vo.fac.interestobj.InterestObjVerVO;
import nc.vo.fac.ml.MLFac;
import nc.vo.fac.pub.IFACConst;
import nc.vo.fi.rateconfig.AggRateCodeVO;
import nc.vo.fi.rateconfig.RateCodeVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.pub.lang.UFDate;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.tmpub.ia.setdate.ICDSetupVO;
import nc.vo.tmpub.util.ArrayUtil;
import nc.vo.tmpub.util.SqlUtil;/*** 活期存款计息提供的查询接口。*   查得的计息对象转换为活期计息的VO。* * @author liuyga**/
public class DemandintcalQueryImpl extends AceDemandintcalQueryImpl {/*** 活期存款计息查询*/public AggDemandIntCalVO[] queryByQueryScheme(IQueryScheme queryScheme, String oldfield, String newfield)throws BusinessException {AggDemandIntCalVO[] bills = null;try {String whereSql = this.preQuery(queryScheme);whereSql += " and "+ queryScheme.getWhereSQLOnly().replace(oldfield, newfield);// replace是为了替换两个表中字段差异,计息方式在两个表中字段不同的特殊处理whereSql = whereSql.replace("intobjcode", "objcode");// replace是为了替换两个表中字段差异,计息对象编码在两个表中字段不同的特殊处理Collection<?> objvos = getMDQueryService().queryBillOfVOByCond(AccInterestObjVO.class, whereSql, true, false);if (objvos != null && objvos.size() != 0) {bills = convertToDemandIntcalVO(objvos.toArray(new AggAccInterestObjVO[0]));} else {bills = null;}} catch (Exception e) {ExceptionUtils.marsh(e);}return bills;}public boolean  checkBankUser(String key) throws BusinessException{boolean b = false;String where = "pk_accintobj = "+"'"+ key+"'";Collection<?> objvos = getMDQueryService().queryBillOfVOByCond(IntAccountInfoVO.class,where , true, false);if (objvos.size() > 0) {int count = 0;for (Object obj : objvos) {IntAccountInfoVO vo = (IntAccountInfoVO) obj;if (vo.getUseflag().booleanValue()|| vo.getDistroyaccdate() != null) {count++;}}b = count == objvos.size() ? true : false;}return b;}/*** 将计息对象转换为活期计息界面展现的VO* * @param intObjs* @return* @throws BusinessException*/private AggDemandIntCalVO[] convertToDemandIntcalVO(AggAccInterestObjVO[] intObjs) throws BusinessException {// 取组织、计息对象PK,用来批量查询最近结息日Map<String, List<String>> orgIntObjMap = new HashMap<String, List<String>>();// 结息日PK,用来批量查询结息日设置Set<String> ICDSetupSet = new HashSet<String>();// 银行账户PK,用来批量查询银行账户信息Set<String> bankAcc = new HashSet<String>();// 利率PK,用来批量查询利率配置信息Set<String> iRateSet = new HashSet<String>();for (AggAccInterestObjVO agg : intObjs) {AccInterestObjVO objvo = agg.getParentVO();IntAccountInfoVO[] accinfovos = agg.getIntAccountInfoVO(); //计息对象账户信息InterestObjVerVO[] allVersions = agg.getInterestObjVerVO(); //计息对象版本信息objvo.setRatecode(allVersions[allVersions.length - 1].getPk_ratecode());  //最后一个版本InterestObjVerVO maxver = allVersions[0];for(InterestObjVerVO ver : allVersions ){if(Integer.valueOf(maxver.getVersion())<Integer.valueOf(ver.getVersion())){maxver = ver;}}objvo.setPk_settledate(maxver.getSettledate());String pk_org = objvo.getPk_org();if (IFACConst.COMBINATION.equals(objvo.getIntmode())) {// 合并计息addKeyValueToMap(orgIntObjMap, pk_org, objvo.getPk_accintobj());} else if (IFACConst.ONEBYONE.equals(objvo.getIntmode())) {// 分别计息if (accinfovos != null && accinfovos.length > 0) {for (IntAccountInfoVO accvo : accinfovos) {addKeyValueToMap(orgIntObjMap, pk_org, accvo.getPk_intaccinfo()); //类似分组String bankAccid = accvo.getPk_accid();  //账户编码=ref 银行账户子户if (!bankAcc.contains(bankAccid)) {bankAcc.add(bankAccid);}}}}// 结息日设置的PKString settleDatePk = objvo.getPk_settledate();if (!ICDSetupSet.contains(settleDatePk)) {ICDSetupSet.add(settleDatePk);}// 利率PKString ratecode = objvo.getRatecode();if (!iRateSet.contains(ratecode)) {iRateSet.add(ratecode);}}// 批量查询利率设置   存储为: 利率PK->利率编码、利率名称Map<String, RateCodeVO> iRateCodeMap = new HashMap<String, RateCodeVO>();String[] ratePks = iRateSet.toArray(new String[0]);Collection<AggRateCodeVO> rateCodeVOs = getIRateCodeService().queryRateconfigByPKS(ratePks, null);for (AggRateCodeVO aggvo : rateCodeVOs) {RateCodeVO vo = (RateCodeVO) aggvo.getParent();iRateCodeMap.put((String) vo.getAttributeValue(RateCodeVO.PK_RATECODE), vo);}// 批量查询结息日设置   存储为: 结息日PK->结息日设置VOMap<String, ICDSetupVO> ICDSetupMap = new InterestAccrualPubBS().getICDSetupVO(ICDSetupSet.toArray(new String[0]));// 批量查询银行账户 存储为 :银行账户PK->银行账户名称MapMap<String, BankAccSubVO> bankAccMap = null;if (bankAcc.size() > 0) {bankAccMap = new HashMap<String, BankAccSubVO>();BankAccSubVO[] bankAccSubList = getIBankAccSubInfoQueryService().querySubInfosByPKs(bankAcc.toArray(new String[0]));for (BankAccSubVO vo : bankAccSubList) {bankAccMap.put(vo.getPk_bankaccsub(), vo);}}// 批量查询最近结息日,存储为: 计息对象PK->最大结息日Map<String, UFDate> intObjpkMaxIntDateMap = new HashMap<String, UFDate>();for (String pk_org : orgIntObjMap.keySet()) {String[] pks = orgIntObjMap.get(pk_org).toArray(new String[0]);if (intObjpkMaxIntDateMap.size() == 0) {intObjpkMaxIntDateMap = getDemandIntListQuery().getMaxIntDateMap(pks, pk_org, IFACConst.INT_TYPE_JX);} else {intObjpkMaxIntDateMap.putAll(getDemandIntListQuery().getMaxIntDateMap(pks, pk_org, IFACConst.INT_TYPE_JX));}}// 构造活期计息界面展现的VOArrayList<AggDemandIntCalVO> aggcalvos = new ArrayList<AggDemandIntCalVO>();for (AggAccInterestObjVO agg : intObjs) {AccInterestObjVO objvo = agg.getParentVO();IntAccountInfoVO[] accinfovos = agg.getIntAccountInfoVO();if (IFACConst.COMBINATION.equals(objvo.getIntmode())) {// 合并计息AggDemandIntCalVO aggcalvo = new AggDemandIntCalVO();DemandIntCalVO vo = new DemandIntCalVO();vo.setPrimaryKey(objvo.getPrimaryKey()); // 计息对象主表主键setCommonAttrForDemandIntCalVO(vo, objvo, iRateCodeMap); // 共通项目设定vo.setIntobjcode(objvo.getObjcode());vo.setIntobjname(objvo.getIntobjname());UFDate lastSettleDate = intObjpkMaxIntDateMap.get(objvo.getPk_accintobj()); // 取最近结息日ICDSetupVO setupVO = ICDSetupMap.get(objvo.getPk_settledate());if (setupVO == null) {throw new BusinessException(MLFac.getStr00228()/*"查询不到计息对象的结息日设置,结息日PK:"*/+"[" + objvo.getPk_settledate() + "]");}UFDate nextSettleDate = getNextCalDate(objvo.getPk_org(), objvo.getBegdate().asBegin(), lastSettleDate, setupVO);vo.setLastsettledate(lastSettleDate);// 从利息清单取最近结息日vo.setNextsettledate(nextSettleDate);// 根据最近结息日推算出来UFBoolean useflag = objvo.getUseflag();// 表头未停用,需要判断表体,只要表体有一条未停用,认为是未停用的if (UFBoolean.FALSE.equals(useflag)) {//useflag = UFBoolean.TRUE;for (IntAccountInfoVO accinfo : accinfovos) {if (UFBoolean.FALSE.equals(accinfo.getUseflag())) {useflag = UFBoolean.FALSE;break;}}}// 停用标识vo.setUseflag(useflag);// 取最近的销户日期,只要有任意账户未销户,则认为计息对象未销户UFDate destroyDate = null;for (IntAccountInfoVO accinfo : accinfovos) {UFDate tmpDate = accinfo.getDistroyaccdate();if (tmpDate == null) {//destroyDate = null;break;} else {if (destroyDate == null) {destroyDate = tmpDate;} else if (tmpDate.afterDate(destroyDate)) {destroyDate = tmpDate;}}}vo.setDistroyaccdate(destroyDate);aggcalvo.setParentVO(vo);aggcalvos.add(aggcalvo);} else if (IFACConst.ONEBYONE.equals(objvo.getIntmode())) {// 分别计息if (accinfovos != null && accinfovos.length > 0) {for (IntAccountInfoVO accvo : accinfovos) {AggDemandIntCalVO aggcalvo = new AggDemandIntCalVO();DemandIntCalVO vo = new DemandIntCalVO();vo.setPk_intaccinfo(accvo.getPk_intaccinfo());vo.setPrimaryKey(accvo.getPk_intaccinfo()); // 计息对象子表主键setCommonAttrForDemandIntCalVO(vo, objvo, iRateCodeMap); // 共通项目设定if (bankAccMap.get(accvo.getPk_accid()) == null) {throw new BusinessException(MLFac.getStr00229()/*"查询不到计息对象设置的内部账户,账户PK:["*/+"[" + accvo.getPk_accid() + "]");}vo.setIntobjcode(objvo.getObjcode() + "-"+ (bankAccMap.get(accvo.getPk_accid()).getAccnum()));vo.setIntobjname(objvo.getIntobjname() + "-"+ (bankAccMap.get(accvo.getPk_accid()).getAccname()));UFDate lastSettleDate = intObjpkMaxIntDateMap.get(accvo.getPk_intaccinfo()); // 取最近结息日ICDSetupVO setupVO = ICDSetupMap.get(objvo.getPk_settledate());UFDate nextSettleDate = getNextCalDate(objvo.getPk_org(), objvo.getBegdate().asBegin(), lastSettleDate, setupVO);vo.setLastsettledate(lastSettleDate);// 从利息清单取最近结息日vo.setNextsettledate(nextSettleDate);// 根据最近结息日推算出来// 停用标识vo.setUseflag(accvo.getUseflag());// 销户日期vo.setDistroyaccdate(accvo.getDistroyaccdate());aggcalvo.setParentVO(vo);aggcalvos.add(aggcalvo);}}}}return aggcalvos.toArray(new AggDemandIntCalVO[0]);}/*** 设置活期计息VO的通用属性值(针对分别计息和合并计息)* * @param vo* @param objvo* @param iRateCodeMap * @throws BusinessException */private void setCommonAttrForDemandIntCalVO(DemandIntCalVO vo, AccInterestObjVO objvo, Map<String, RateCodeVO> iRateCodeMap) throws BusinessException {vo.setPk_org(objvo.getPk_org());vo.setPk_org_v(objvo.getPk_org_v());vo.setPk_group(objvo.getPk_group());vo.setPk_gaincenter(objvo.getPk_gaincenter());vo.setPk_capitalcenter(objvo.getPk_capitalcenter());vo.setPk_currtype(objvo.getPk_currtype());vo.setPk_intobj(objvo.getPk_accintobj());vo.setPk_settledate(objvo.getPk_settledate());vo.setSettlemode(objvo.getIntmode());RateCodeVO iRateCodeVO = iRateCodeMap.get(objvo.getRatecode());if (iRateCodeVO == null) {throw new BusinessException(MLFac.getStr00230()/*"查询不到计息对象设置的利率信息,利率PK:["*/+"[" + objvo.getRatecode() + "]");}vo.setRatecode((String) iRateCodeVO.getPk_ratecode());vo.setRatename((String) iRateCodeVO.getRatename());vo.setYrate(iRateCodeVO.getYrate());//FIXME:没法判断}private void addKeyValueToMap(Map<String, List<String>> orgIntObjMap, String pk_org, String pk_intObj) {if (!orgIntObjMap.containsKey(pk_org)) {List<String> pk_intObjs = new ArrayList<String>();pk_intObjs.add(pk_intObj);orgIntObjMap.put(pk_org, pk_intObjs);} else {orgIntObjMap.get(pk_org).add(pk_intObj);}}@Overridepublic AggDemandIntCalVO[] queryBillsByPks(String[] pks)throws BusinessException {// TODO Auto-generated method stubreturn null;}@Overridepublic String[] queryByPageQueryScheme(IQueryScheme queryScheme)throws BusinessException {// TODO Auto-generated method stubreturn null;}/*** 获取活期利息清单查询服务* * @return*/private IDemandIntListQuery getDemandIntListQuery() {return NCLocator.getInstance().lookup(IDemandIntListQuery.class);}/*** 获取利率编码查询服务* * @return*/private IRateconfigQueryService getIRateCodeService() {return NCLocator.getInstance().lookup(IRateconfigQueryService.class);}/*** 根据当前结息日,推算下一结息日* * @param pk_org* @param begDate* @param lastCalDate* @param settleDate* @return* @throws BusinessException*/private UFDate getNextCalDate(String pk_org, UFDate begDate, UFDate lastCalDate, ICDSetupVO settleDate) throws BusinessException {// 资金日历IDUFDate calBegDate = lastCalDate != null ?  lastCalDate.getDateAfter(1) : begDate;String pk_settledate = settleDate.getPk_id();UFDate calEndDate = AiacOuterServiceProxy.getSettleDateQueryService().getNextSettleDate(pk_settledate, pk_org, calBegDate);return calEndDate;}private IBankAccSubInfoQueryService getIBankAccSubInfoQueryService() {return NCLocator.getInstance().lookup(IBankAccSubInfoQueryService.class);}/* * 返回可用的计息对象* 过滤掉停用,销户的计息对象。* * 提供给预警自动计息使用的。* @see nc.itf.ifac.ia.IDemandintcalQuery#queryByOrgs(java.lang.String[])*/@SuppressWarnings("unchecked")@Overridepublic AggDemandIntCalVO[] queryByOrgs(String[] pk_orgs) throws BusinessException {AggDemandIntCalVO[] result = new AggDemandIntCalVO[0];if (ArrayUtil.isNull(pk_orgs)) {return result;}String whereCondStr = SqlUtil.buildSqlForIn(AccInterestObjVO.PK_ORG, pk_orgs);Collection<AggAccInterestObjVO> bills = MDPersistenceService.lookupPersistenceQueryService().queryBillOfVOByCond(AggAccInterestObjVO.class, whereCondStr, true, false);if (bills != null && bills.size() != 0) {ArrayList<AggAccInterestObjVO> realinterestvoArr = new ArrayList<AggAccInterestObjVO>();for (AggAccInterestObjVO interestvo : bills) {if (IFACConst.ONEBYONE.equals(interestvo.getParentVO().getIntmode())) {if (UFBoolean.FALSE.equals(interestvo.getParentVO().getUseflag())) {IntAccountInfoVO itemvo = (IntAccountInfoVO)(interestvo.getChildrenVO())[0];if (itemvo.getDistroyaccdate() == null) {realinterestvoArr.add(interestvo);}}} else {if (UFBoolean.FALSE.equals(interestvo.getParentVO().getUseflag())) {realinterestvoArr.add(interestvo);}}}AggAccInterestObjVO[] intObjs = realinterestvoArr.toArray(new AggAccInterestObjVO[0]);result = convertToDemandIntcalVO(intObjs);}return result;}/*** 返回元数据查询服务对象*/private IMDPersistenceQueryService getMDQueryService() {return MDPersistenceService.lookupPersistenceQueryService();}
}

父类:

package nc.impl.fac.ia.ace;import nc.bs.framework.common.NCLocator;
import nc.impl.pubapp.pattern.database.IDExQueryBuilder;
import nc.pubitf.rbac.IFunctionPermissionPubService;
import nc.ui.querytemplate.querytree.FromWhereSQL;
import nc.ui.querytemplate.querytree.IQueryScheme;
import nc.vo.pub.BusinessException;
import nc.vo.pubapp.AppContext;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import nc.vo.pubapp.query2.sql.process.QueryConstants;
import nc.vo.pubapp.query2.sql.process.QuerySchemeUtils;public abstract class AceDemandintcalQueryImpl implementsnc.itf.fac.ia.IDemandintcalQuery {/*** 由子类实现,查询之前对queryScheme进行加工,加入自己的逻辑* * @param queryScheme*/protected String preQuery(IQueryScheme queryScheme) {// 查询之前对queryScheme进行加工,加入自己的逻辑String funcode =(String) queryScheme.get(QueryConstants.KEY_FUNC_NODE);if (funcode == null) {return null;}String cuserid = AppContext.getInstance().getPkUser();String pkGroup = AppContext.getInstance().getPkGroup();try {String[] orgs =NCLocator.getInstance().lookup(IFunctionPermissionPubService.class).getUserPermissionPkOrgs(cuserid, funcode, pkGroup);String columnName =QuerySchemeUtils.getOrgColumnName(queryScheme);String sql = null;// 如果用户未分配任何组织时应该查不到任何单据queryScheme.getTableListFromWhereSQL();sql = queryScheme.getWhereSQLOnly();if (orgs == null || orgs.length == 0) {SqlBuilder builder = new SqlBuilder();builder.append("fac_accinterestobj" + "." + columnName, "null");sql = builder.toString();}else {// 在组织很多的时候一定要采用临时表IDExQueryBuilder builder = new IDExQueryBuilder("TEMP_PUBAPPO_");sql = builder.buildSQL("fac_accinterestobj" + "." + columnName, orgs);}return sql;}catch (BusinessException e) {ExceptionUtils.wrappException(e);}return null;}public String getMainTableAlias(IQueryScheme queryScheme) {FromWhereSQL fromWhereSql = queryScheme.getTableJoinFromWhereSQL();String mainTableAlias =fromWhereSql.getTableAliasByAttrpath(FromWhereSQL.DEFAULT_ATTRPATH);return mainTableAlias;}}

NC65 活期存款计息提供的查询接口相关推荐

  1. html百度天气查询api,百度提供天气预报查询接口API

    接口说明 根据经纬度/城市名查询天气的结果 接口示例 接口参数说明 参数类型 参数名称 是否必须 具体描述 String ak true 开发者密钥 String sn false 若用户所用ak的校 ...

  2. 提供网上机票实时查询接口

    ★ 点这免费申请机票查询接口试用 / 机票查询接口预订系统演示 21世纪是电子信息的时代,INTERNET已经全方位的融入人们的工作和生活.在这种环境下,电子商务已经逐渐成为一种主流的商务模式.在欧美 ...

  3. python调用api应用接口_第三方免费快递物流查询接口平台(快递鸟)api接口调用...

    随着网购的发展,快递业也随之壮大.快递查询接口对接的需求量也越来越大,下面是对免费快递接口做的整理,并附上调用流程,分享给大家. 项目开发中,有些需求难免会用到关于快递的一些Api接口:本篇主要介绍的 ...

  4. boot spring 接口接收数据_在 Spring Boot 中使用 Dataway 配置数据查询接口

    Dataway介绍 Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具.使得使用者无需开发任何代码就配置一个满足需求的接口. 整个接口配置.测试.冒烟.发布.一站式都通过 ...

  5. 代理模式(为对象提供相同的接口)

    一.代理模式 代理模式,即Proxy,让你能够提供对象的替代品或其占位符. 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理.它和Adapter模式很类似.我们先回顾Adapte ...

  6. php 支付宝订单查询_5. PHP接入支付宝单笔订单查询接口

    巴西奥运会来了,刚好我又是做体育行业的互联网.哎!这个月又要加班成狗了.最近遇到好多莫名其妙的问题,待我忙完这段,再跟大家分享下.今天还是继续说说 Payment项目 今天主要说说支付宝订单查询接口. ...

  7. 手机型号云服务器,手机型号查询接口

    手机型号查询接口 内容精选 换一换 通过调用云手机服务提供的接口,您可以完整地使用云手机的所有功能.例如查询云手机列表.重启云手机.为云手机推送文件. 华为云帮助中心,为用户提供产品简介.价格说明.购 ...

  8. thinkphp 助手函数url不生成https_如何用ThinkPHP框架写一个快递查询接口

    ThinkPHP是php程序员们经常使用的框架之一,运用框架来开发网站无疑减轻了我们代码量,加快了我们的开发速度,框架底层封装的方法和函数使用起来简直不能太爽.今天给大家总结一个小案例,如何实现一个快 ...

  9. 利用IP地址查询接口来查询IP归属地

    如果我们在项目中需要获得用户的地址,而不仅仅是获得用户的IP,为了避免在自己的数据库里添加IP库,可以直接调用网上的第3方IP地址查询接口来查询IP归属地.今儿个在网上了解了这些接口,要么返回XML, ...

最新文章

  1. 动态rem与1px边框问题的理解
  2. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY16-强化学习
  3. 怎么查询linux中的组密码,linux查看用户组中的用户
  4. python 函数的参数对应
  5. JDK8新特性(十)之Stream流的map和reduce组合使用、mapToInt()、concat()方法
  6. 十步教你如何接手别人的代码!
  7. Django 学习第九天——请求与响应
  8. linux 的 swapper 进程不能sleep,深入理解perf报告中的swapper进程
  9. android rxbus github,RxBus-实现EventBus之Sticky
  10. 微信分享至朋友圈和朋友接口
  11. Hyper-V虚拟机安装win10系统 2021-10-16
  12. 【已解决】Instances currently registered with Eureka中Application为UNKNOWN
  13. 从源码层面理解 Either、Option 和 Try
  14. python备份cisco交换机_思科交换机备份与还原
  15. 如何初始搭建vue2.x项目(vue3.x请走开)
  16. 幅度调制(线性调制)原理
  17. 微信小程序文本如何换行
  18. 前端三刺客---JS(WebAPI)
  19. 重生之我是赏金猎人(九)-从本无法触发的xss到梦幻联动挖掘多个致命接口下的XSS触发点
  20. 秒表计时器怎么读_秒表怎么读数

热门文章

  1. 计算机cpu的相关知识,电脑CPU的相关知识
  2. 历史性突破——JCG智能数显,五星级防蹭无线路由器
  3. perl dbi mysql 参数_perl DBI 总结
  4. 一个点围绕另外一个点旋转一定角度的新坐标
  5. Python爬虫Selenium手动接管Edge爬取裁判文书网“环境污染”数据(Mac环境)
  6. 使用Python3批量保存贴吧图片-附爬虫程序
  7. IP协议的服务类型(翻译RFC 1349)
  8. Lift, Splat, Shoot 翻译
  9. Java Swing面板布局之网格布局GridLayout
  10. 动物鸿蒙的图片,自然界五种秃顶动物:红色秃猴和皮包猪(图)