前言
開發時注意遵循開發規範
一、明確需求
1.拿到問題
登錄 豬齒魚敏捷管理,找到自己的問題,例如:
遷移 [GLD2030] 覈算主體級成本中心定義
即功能編號:GLD2030,功能名稱:覈算主體級成本中心定義
2.拿到對應的 Screen頁面、表
(1)拿到Screen頁面
然後我們登錄 標準hec4.0演示環境,搜索功能編號
按回車進入相應的Screen頁面
然後右鍵 -> 查看框架的源代碼
注意地址欄,這樣我們就拿到了Screen頁面:gld/GLD2030/gld_responsibility_centers.screen
(2)拿到表
然後去標準hec4.0源碼中查看此screen頁面中源碼,找到相應的bm
bm中的baseTable就指定了表:GLD_RESPONSIBILITY_CENTERS
3.開發涉及的文件
拿到 Screen頁面和表之後,就可以開始開發了,開發涉及的文件將至少包括如下內容:
序號 | 類型 | 名稱 |
---|---|---|
1 | 多語言基表 | gld_responsibility_center_tl |
2 | 多語言表 | gld_responsibility_center |
3 | DTO | GldResponsibilityCenter |
4 | Mapper | GldResponsibilityCenterMapper 、GldResponsibilityCenterMapper.xml |
5 | Service | IGldResponsibilityCenterService 、 GldResponsibilityCenterServiceImpl |
6 | Controller | GldResponsibilityCenterController |
7 | Screen頁面 | gld_responsibility_center.screen |
爲避免和原本的功能衝突,我們爲我們的功能統一添加後綴 Test
功能名:[GLD2030] 覈算主體級成本中心定義測試
序號 | 類型 | 名稱 |
---|---|---|
1 | 多語言基表 | gld_responsibility_center_test |
2 | 多語言表 | gld_responsibility_center_test_tl |
3 | DTO | GldResponsibilityCenterTest |
4 | Mapper | GldResponsibilityCenterTestMapper 、GldResponsibilityCenterTestMapper.xml |
5 | Service | IGldResponsibilityCenterServiceTest 、 GldResponsibilityCenterServiceTestImpl |
6 | Controller | GldResponsibilityCenterControllerTest |
7 | Screen頁面 | gld_responsibility_center_test.screen |
二、建表
嚴格遵循 01_功能遷移指引
1.修改Oracle表
登錄標準hec4.0數據庫,主要做以下兩處變動:
- 將複數表名改爲單數
- 將Oracle數據庫中整型含義的Number都改爲Number(38)
可以看到原表名爲:
將其改爲單數,然後將整型含義的Number都改爲Number(38)
注意:主鍵和索引的複數也要記得改成單數
2.生成groovy
2.1 生成groovy
(1)訪問 groovy 文件生成器
地址:http://192.168.12.107:16060
(2)填寫 author、fileName,檢索表,回車,勾選表名,然後點擊 生成Groovy
選項 | 格式 | 示例 |
---|---|---|
author | [email protected] | |
fileName | YYYY-MM-DD-module | 2019-06-26-GLD2030 |
表檢索 | 表名(支持特殊字符%) | gld_responsibility_center |
(3)將生成的 groovy 文件
放入到 hap-core-db
工程下
2.2 修改groovy
- 描述ID
- 將生成的groovy文件中多語言字段的comment中的id去掉
- 索引名
如:
3.導入mysql
- 將項目重新
clean install
先將hap-core-db模塊clean install 一下,然後再將hap-db模塊clean install一下(沒有測過)
- 在parent下執行 process-resources 命令
mvn process-resources -D skipLiquibaseRun=false -D db.driver=com.mysql.jdbc.Driver -D db.url=jdbc:mysql://127.0.0.1:3306/hap_dev -D db.user=hap_dev -D db.password=hap_dev
三、生成後端代碼
1.生成後端代碼
啓動 hssp 項目,訪問代碼生成器頁面
http://{port}/${context}/generator/generator.html
2.後端調整
嚴格遵循 01_功能遷移指引
2.1 DTO
2.1.1 類
(1)每個DTO都對應數據庫中的一張表,需要繼承 BaseDTO,BaseDTO 中封裝了 who字段 以及 擴展字段
(2)DTO類上需要加如下註解
- @ExtensionAttribute(disable=true) : 擴展字段註解
- @Table(name = “fnd_business_rule_b”) : 映射數據庫表
- @Getter、@Setter、@AllArgsConstructor、@NoArgsConstructor、 @Builder、@ToString: lombok註解
- @MultiLanguage : 若有多語言字段,則需要加多語言註解,對應的多語言表爲 baseTable_tl
2.1.2 字段
(1)靜態屬性字段
每一個字段都需要添加其對應的靜態屬性字段
(2)主鍵字段
主鍵字段需要加註解:
- @Id : 主鍵註解
- @GeneratedValue : 主鍵自增長註解。對於自增長、序列(SEQUENCE)類型的主鍵,需要添加註解@GeneratedValue
(3)多語言字段
- 多語言字段需要添加多語言字段註解
- @MultiLanguageField : 多語言字段註解
(4)非數據庫字段
- 非數據庫字段需要添加@Transient
javax.persistence.Transient
(5)字段類型
- 不使用基本類型,全部使用基本類型的
包裝類
,如 Long 對應數據庫中的INTEGER,而不是使用 long- 數字類型主鍵統一採用 Long
- 金額、數量 等精度嚴格浮點類型採用 BigDecimal。注意 BigDecimal 在計算、比較方面的特殊性
(6)條件查詢字段
若需要對某些字段進行條件查詢,則需要加 @Where 聲明該字段可以被條件查詢,並在Controller中配合 Criteria 使用
2.1.3 完整示例
package com.hand.hssp.gld.dto;
import com.hand.hap.core.annotation.MultiLanguage;
import com.hand.hap.core.annotation.MultiLanguageField;
import com.hand.hap.mybatis.annotation.ExtensionAttribute;
import com.hand.hap.mybatis.common.query.Where;
import com.hand.hap.system.dto.BaseDTO;
import lombok.*;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.Date;
/**
* <p>
* 覈算主體級成本中心
* </p>
*
* <p>
* 一、類
* 1. 每個DTO都對應數據庫中的一張表,需要繼承 BaseDTO
* BaseDTO 中封裝了 who字段 以及 擴展字段
*
* 2.DTO類上需要加如下註解
* @ExtensionAttribute(disable=true) : 擴展字段註解
* @Table(name = "fnd_business_rule_b") : 映射數據庫表
* @Getter、@Setter、@AllArgsConstructor、@NoArgsConstructor、 @Builder、@ToString: lombok註解
* @MultiLanguage : 若有多語言字段,則需要加多語言註解,對應的多語言表爲 baseTable_tl
*
* 二、靜態屬性字段
* 每一個字段都需要添加其對應的靜態屬性字段
*
* 三、字段
* 1.主鍵
* 主鍵字段需要加註解:
* @Id : 主鍵註解
*
* @GeneratedValue : 主鍵自增長註解。
* 對於自增長、序列(SEQUENCE)類型的主鍵,需要添加註解@GeneratedValue
* 2.多語言字段
* 多語言字段需要添加多語言字段註解
* @MultiLanguageField : 多語言字段註解
*
* 3.非數據庫字段
* 非數據庫字段需要添加@Transient
* javax.persistence.Transient
*
* 4.字段類型
* >- 不使用基本類型,全部使用基本類型的`包裝類`,如 Long 對應數據庫中的INTEGER,而不是使用 long
* >- 數字類型主鍵統一採用 Long
* >- 金額、數量 等精度嚴格浮點類型採用 BigDecimal。注意 BigDecimal 在計算、比較方面的特殊性
*
* 5.條件查詢字段
* 若需要對某些字段進行條件查詢,則需要加 @Where 聲明該字段可以被條件查詢,並在Controller中配合 Criteria 使用
*
*
* </p>
*
* @author [email protected] 2019/01/08 13:50
*/
@ExtensionAttribute(disable = true)
@Table(name = "gld_responsibility_center")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
@MultiLanguage
public class GldResponsibilityCenter extends BaseDTO {
public static final String FIELD_RESPONSIBILITY_CENTER_ID = "responsibilityCenterId";
public static final String FIELD_ACC_ENTITY_ID = "accEntityId";
public static final String FIELD_RESPONSIBILITY_CENTER_CODE = "responsibilityCenterCode";
public static final String FIELD_RESPONSIBILITY_CENTER_NAME = "responsibilityCenterName";
public static final String FIELD_RESP_CENTER_TYPE_CODE = "respCenterTypeCode";
public static final String FIELD_START_DATE_ACTIVE = "startDateActive";
public static final String FIELD_END_DATE_ACTIVE = "endDateActive";
public static final String FIELD_SUMMARY_FLAG = "summaryFlag";
public static final String FIELD_PARENT_RESP_CENTER_ID = "parentRespCenterId";
public static final String FIELD_SUMMARY_TYPE = "summaryType";
@Id
@GeneratedValue
private Long responsibilityCenterId;
/**
* 覈算主體ID
*/
// @NotNull
@Where
private Long accEntityId;
/**
* 覈算主體名稱
*/
@Transient
private String accEntityCode;
/**
* 覈算主體代碼
*/
@Transient
private String accEntityName;
@NotEmpty
@Length(max = 30)
@Where
private String responsibilityCenterCode;
/**
* 責任中心名稱
*/
@Length(max = 500)
@MultiLanguageField
@Where
private String responsibilityCenterName;
/**
* 責任中心類型
*/
@Length(max = 30)
private String respCenterTypeCode;
/**
* 有效日期從
*/
private Date startDateActive;
/**
* 有效日期至
*/
private Date endDateActive;
/**
* 彙總標誌
*/
@NotEmpty
@Length(max = 1)
private String summaryFlag;
/**
* 上級責任中心
*/
@Where
private Long parentRespCenterId;
@Transient
private String summaryType;
public GldResponsibilityCenter(Long accEntityId, String responsibilityCenterCode, String responsibilityCenterName, String respCenterTypeCode, Date startDateActive, Date endDateActive, String summaryFlag, Long parentRespCenterId) {
this.accEntityId = accEntityId;
this.responsibilityCenterCode = responsibilityCenterCode;
this.responsibilityCenterName = responsibilityCenterName;
this.respCenterTypeCode = respCenterTypeCode;
this.startDateActive = startDateActive;
this.endDateActive = endDateActive;
this.summaryFlag = summaryFlag;
this.parentRespCenterId = parentRespCenterId;
}
}
2.2 Mapper
(1)GldResponsibilityCenterMapper
繼承了通用Mapper接口之後,就具備了一些單表的增刪改查操作。
package com.hand.hssp.gld.mapper;
import com.hand.hap.mybatis.common.Mapper;
import com.hand.hssp.gld.dto.GldResponsibilityCenter;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* GldResponsibilityCenterMapper
* </p>
*
* <p>
* > - 繼承了通用Mapper接口之後,就具備了一些單表的增刪改查操作。
* > - 如需要自定義一些多表查詢,則需要自己寫Mapper方法,並自己加以實現
* </p>
*
* @author shira 2019/06/26 17:17
*/
public interface GldResponsibilityCenterMapper extends Mapper<GldResponsibilityCenter> {
}
(2)GldResponsibilityCenterMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hand.hssp.gld.mapper.GldResponsibilityCenterMapper">
<!-- 將查詢結果中的SQL字段與DTO實體類字段一一映射,這樣值就映射到實體類對象上了-->
<resultMap id="BaseResultMap" type="com.hand.hssp.gld.dto.GldResponsibilityCenter">
<result column="RESPONSIBILITY_CENTER_ID" property="responsibilityCenterId" jdbcType="DECIMAL"/>
<result column="ACC_ENTITY_ID" property="accEntityId" jdbcType="DECIMAL"/>
<result column="RESPONSIBILITY_CENTER_CODE" property="responsibilityCenterCode" jdbcType="VARCHAR"/>
<result column="RESPONSIBILITY_CENTER_NAME" property="responsibilityCenterName" jdbcType="VARCHAR"/>
<result column="RESP_CENTER_TYPE_CODE" property="respCenterTypeCode" jdbcType="VARCHAR"/>
<result column="START_DATE_ACTIVE" property="startDateActive" jdbcType="DATE"/>
<result column="END_DATE_ACTIVE" property="endDateActive" jdbcType="DATE"/>
<result column="SUMMARY_FLAG" property="summaryFlag" jdbcType="VARCHAR"/>
<result column="PARENT_RESP_CENTER_ID" property="parentRespCenterId" jdbcType="DECIMAL"/>
<result column="SUMMARY_TYPE" property="summaryType" jdbcType="VARCHAR"/>
</resultMap>
</mapper>
2.3 Service
(1)IGldResponsibilityCenterService
service 接口 需要繼承IBaseServcie 和 ProxySelf 這兩個接口:
- IBaseServcie 提供了基本的增刪改查接口。
- ProxySelf 提供了自身代理功能
package com.hand.hssp.gld.service;
import com.hand.hap.core.ProxySelf;
import com.hand.hap.system.service.IBaseService;
import com.hand.hssp.gld.dto.GldResponsibilityCenter;
import java.util.Date;
/**
* <p>
* service 接口 需要繼承IBaseServcie 和 ProxySelf 這兩個接口:
* - IBaseServcie 提供了基本的增刪改查接口。
* - ProxySelf 提供了自身代理功能
* </p>
*
* @author shira 2019/06/28 10:19
*/
public interface IGldResponsibilityCenterService
extends IBaseService<GldResponsibilityCenter>, ProxySelf<IGldResponsibilityCenterService> {
}
(3)GldResponsibilityCenterServiceImpl
類上需要加兩個註解:
- @Service : 聲明Bean
- @Transactional(rollbackFor = Exception.class) : 開啓Spring聲明式事務,有異常時會回滾。
需要繼承 BaseServiceImpl 接口,這樣就具有了單表的增刪改查操作。
package com.hand.hssp.gld.service.impl;
import com.hand.hap.system.service.impl.BaseServiceImpl;
import com.hand.hssp.gld.dto.GldResponsibilityCenter;
import com.hand.hssp.gld.mapper.GldResponsibilityCenterMapper;
import com.hand.hssp.gld.service.IGldResponsibilityCenterService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
@Service
@Transactional(rollbackFor = Exception.class)
public class GldResponsibilityCenterServiceImpl extends BaseServiceImpl<GldResponsibilityCenter>
implements IGldResponsibilityCenterService {
}
2.4 Controller
- 類上需要加 @Controller
- 需要繼承 BaseController ,這樣就有了一些通用方法,請求參數驗證、異常處理
- GldResponsibilityCenterController
package com.hand.hssp.gld.controllers;
import com.hand.hap.core.IRequest;
import com.hand.hap.mybatis.common.Criteria;
import com.hand.hap.mybatis.common.query.Comparison;
import com.hand.hap.mybatis.common.query.WhereField;
import com.hand.hap.system.controllers.BaseController;
import com.hand.hap.system.dto.ResponseData;
import com.hand.hssp.gld.dto.GldAccountingEntity;
import com.hand.hssp.gld.dto.GldResponsibilityCenter;
import com.hand.hssp.gld.service.IGldAccountingEntityService;
import com.hand.hssp.gld.service.IGldResponsibilityCenterService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* <p>
*覈算主體級成本中心
* </p>
*
* @author [email protected] 2019/01/08 13:50
*/
@Controller
public class GldResponsibilityCenterController extends BaseController{
@Autowired
private IGldResponsibilityCenterService service;
@Autowired
private IGldAccountingEntityService gldAccountingEntityService;
@RequestMapping("/gld/responsibility-center/query")
@ResponseBody
public ResponseData query(GldResponsibilityCenter dto, @RequestParam(defaultValue = DEFAULT_PAGE) int page,
@RequestParam(defaultValue = DEFAULT_PAGE_SIZE) int pageSize, HttpServletRequest request) {
IRequest requestContext = createRequestContext(request);
Criteria criteria = new Criteria(dto);
if(dto.getResponsibilityCenterCode()!=null){
criteria.where(new WhereField(GldResponsibilityCenter.FIELD_RESPONSIBILITY_CENTER_CODE, Comparison.LIKE));
}
if(dto.getResponsibilityCenterName()!=null){
criteria.where(new WhereField(GldResponsibilityCenter.FIELD_RESPONSIBILITY_CENTER_NAME, Comparison.LIKE));
}
if(dto.getAccEntityId()!=null){
criteria.where(new WhereField(GldResponsibilityCenter.FIELD_ACC_ENTITY_ID));
}
return new ResponseData(service.selectOptions(requestContext,dto,criteria));
}
@RequestMapping("/gld/responsibility-center/submit")
@ResponseBody
public ResponseData update(@RequestBody List<GldResponsibilityCenter> dto, BindingResult result, HttpServletRequest request){
getValidator().validate(dto, result);
if (result.hasErrors()) {
ResponseData responseData = new ResponseData(false);
responseData.setMessage(getErrorMessage(result, request));
return responseData;
}
IRequest requestCtx = createRequestContext(request);
return new ResponseData(service.batchUpdate(requestCtx, dto));
}
@RequestMapping("/gld/responsibility-center/remove")
@ResponseBody
public ResponseData delete(HttpServletRequest request,@RequestBody List<GldResponsibilityCenter> dto){
service.batchDelete(dto);
return new ResponseData();
}
@RequestMapping(value = "/gld/GLD2030/gld_responsibility_center.screen")
public ModelAndView gldResponsibilityCenter(HttpServletRequest request) {
IRequest requestContext = createRequestContext(request);
GldAccountingEntity gldAccountingEntity =new GldAccountingEntity();
GldAccountingEntity defaultAccEntity = gldAccountingEntityService.queryDefaultAccEntity(requestContext,requestContext.getCompanyId());
List<GldAccountingEntity> gldAccountingEntityList = gldAccountingEntityService.queryAccEntityByCompany(requestContext,requestContext.getCompanyId());
ModelAndView view = new ModelAndView("gld/GLD2030/gld_responsibility_center");
view.addObject("gldAccountingEntityList", gldAccountingEntityList);
view.addObject("defaultAccEntity", defaultAccEntity);
return view;
}
}
四、功能管理
系統管理 -> 功能管理
1.資源管理
通常,所有要用到的鏈接都要註冊成資源
- gld/responsibility-center/query
- gld/responsibility-center/submit
- gld/GLD2030/gld_responsibility_center.screen
參考下圖,註冊資源
2.功能維護
參考下圖的功能維護,維護一條功能。
- 入口頁面可以是一個Html資源或URL資源,點擊功能時會進入此入口頁面
- 功能下用到的資源都需要加入到功能資源中
3.功能分配
勾選剛剛添加的功能
五、Screen頁面調整
1.Screen頁面調整
Screen頁面還是原來的Screen頁面,不過還需要進行部分調整,Screen頁面調整部分,參見 01_功能遷移指引
2.Screen頁面示例1
覈算主體級成本中心的主頁面(gld_responsibility_center.screen
)示例如下:
此頁面主要涉及到如下知識點:
- 多語言
- SysCode、下拉框
- 默認值
- 條件查詢和模糊查詢
可參見 01_功能遷移指引
完整的代碼見 :gld_responsibility_center.screen
2.1 多語言
(1)實體類
@MultiLanguage
public class GldResponsibilityCenter extends BaseDTO {
/**
* 責任中心名稱
*/
@Length(max = 500)
@MultiLanguageField
@Where
private String responsibilityCenterName;
}
(2)DataSet
多語言字段對應的field需要添加 dto 以及 dtoId 屬性。
<a:field name="responsibilityCenterName" required="true" prompt="gld_responsibility_center.responsibility_center_name" dto="com.hand.hssp.gld.dto.GldResponsibilityCenter" dtoId="responsibilityCenterId"/>
(2)Grid
<a:grid id="GLD2030_responsibilityCentersGrid" bindTarget="GLD2030_responsibilityCentersResultDs" marginHeight="115" marginWidth="3" navBar="true">
<a:columns>
<a:column name="responsibilityCenterName" align="left" editor="GLD2030_responsibilityCenterNameTld" width="200"/>
</a:columns>
<a:editors>
<a:tledit id="GLD2030_responsibilityCenterNameTld"/>
</a:editors>
2.2 下拉框
(1)sysCode類型的下拉框的數據來源:
<a:dataSet id="GLD2030_respCenterTypeCodeDs" autoQuery="true" fetchAll="true" queryUrl="$[/request/@context_path]/common/auroraCode/GLD.RESP_CENTER_TYPE/"/>
(2)下拉框的DataSet
<a:dataSet id="GLD2030_responsibilityCentersResultDs" autoQuery="true" fetchAll="true" baseUrl="/gld/responsibility-center" queryDataSet="GLD2030_responsibilityCentersQueryDs" queryUrl="$[/request/@context_path]/gld/responsibility-center/query">
<a:fields>
<a:field name="respCenterTypeCode"/>
<!-- 下拉框:成本中心類型-->
<a:field name="respCenterTypeCodeDisplay" displayField="meaning" options="GLD2030_respCenterTypeCodeDs" prompt="gld_responsibility_center.resp_center_type_code_display" required="true" valueField="value" returnField="respCenterTypeCode" />
</a:fields>
</a:dataSet>
(3)下拉框的Grid
<a:grid id="GLD2030_responsibilityCentersGrid" bindTarget="GLD2030_responsibilityCentersResultDs" marginHeight="115" marginWidth="3" navBar="true">
<a:columns>
<a:column name="respCenterTypeCodeDisplay" align="center" editor="GLD2030_gridCb" width="80"/>
</a:columns>
<a:editors>
<a:comboBox id="GLD2030_gridCb"/>
</a:editors>
</a:grid>
2.3 默認值
如下圖,QueryForm中有一個默認的核算主體字段,頁面一進來的時候,就會查詢這個默認的核算主體下的成本中心(每一個用戶都有一個默認的核算主體)
也就是說,我們應該在頁面渲染前,就準備好這個默認值。我們的做法是,在進入此頁面前,先進入一個Controller方法通過ModelAndView的方式準備好這個默認值,然後再頁面上直接用就行了
實現如下:
(1)維護功能的入口頁面
將覈算主體級成本中心
這個功能的入口頁面設置:gld/GLD2030/gld_responsibility_center.screen
(2)編寫Controller方法
這樣當用戶點擊功能時,就會跳轉到下圖的Controller中
@Controller
public class GldResponsibilityCenterController extends BaseController{
@RequestMapping(value = "/gld/GLD2030/gld_responsibility_center.screen")
public ModelAndView gldResponsibilityCenter(HttpServletRequest request) {
IRequest requestContext = createRequestContext(request);
GldAccountingEntity gldAccountingEntity =new GldAccountingEntity();
GldAccountingEntity defaultAccEntity = gldAccountingEntityService.queryDefaultAccEntity(requestContext,requestContext.getCompanyId());
List<GldAccountingEntity> gldAccountingEntityList = gldAccountingEntityService.queryAccEntityByCompany(requestContext,requestContext.getCompanyId());
ModelAndView view = new ModelAndView("gld/GLD2030/gld_responsibility_center");
view.addObject("gldAccountingEntityList", gldAccountingEntityList);
view.addObject("defaultAccEntity", defaultAccEntity);
return view;
}
}
(3)Screen頁面取值
<a:dataSet id="GLD2030_responsibilityCentersQueryDs" autoCreate="true">
<a:fields>
<a:field name="accEntityNameDisplay" defaultValue="$[/model/defaultAccEntity/records/record/@accEntityName]" displayField="accEntityName" options="GLD2030_accEntityDs" prompt="gld_accounting_entities.acc_entity_name_display" required="true" returnField="accEntityId" valueField="accEntityId"/>
<a:field name="accEntityId" defaultValue="$[/model/defaultAccEntity/records/record/@accEntityId]" />
</a:fields>
</a:dataSet>
2.4 條件查詢和模糊查詢
hap對查詢參數進行了限制,所有的條件查詢,均需用 @Where
和 Criteria
手動聲明
- 條件查詢:Comparison.EQUAL
- 模糊查詢:Comparison.LIKE
- 其他匹配條件請參見
Comparison
枚舉類
(1)實體類添加 @Where
public class GldResponsibilityCenter extends BaseDTO {
@NotEmpty
@Length(max = 30)
@Where
private String responsibilityCenterCode;
/**
* 責任中心名稱
*/
@Length(max = 500)
@MultiLanguageField
@Where
private String responsibilityCenterName;
}
(2)查詢時結合 Criteria
和selectOptions
進行查詢
@Controller
public class GldResponsibilityCenterController extends BaseController{
@Autowired
private IGldResponsibilityCenterService service;
@Autowired
private IGldAccountingEntityService gldAccountingEntityService;
@RequestMapping("/gld/responsibility-center/query")
@ResponseBody
public ResponseData query(GldResponsibilityCenter dto, @RequestParam(defaultValue = DEFAULT_PAGE) int page,
@RequestParam(defaultValue = DEFAULT_PAGE_SIZE) int pageSize, HttpServletRequest request) {
IRequest requestContext = createRequestContext(request);
Criteria criteria = new Criteria(dto);
if(dto.getResponsibilityCenterCode()!=null){
criteria.where(new WhereField(GldResponsibilityCenter.FIELD_RESPONSIBILITY_CENTER_CODE, Comparison.LIKE));
}
if(dto.getResponsibilityCenterName()!=null){
criteria.where(new WhereField(GldResponsibilityCenter.FIELD_RESPONSIBILITY_CENTER_NAME, Comparison.LIKE));
}
if(dto.getAccEntityId()!=null){
criteria.where(new WhereField(GldResponsibilityCenter.FIELD_ACC_ENTITY_ID));
}
return new ResponseData(service.selectOptions(requestContext,dto,criteria));
}
}
3.Screen頁面示例2
覈算主體級成本中心—分配預算實體頁面(gld_resp_center_ref_bc.screen
)如下:
此頁面主要涉及如下知識點:
- lov實現
可參見 01_功能遷移指引
完整的代碼見 :gld_resp_center_ref_bc.screen
3.1 lov查詢映射
(1)定義Lov
系統管理->Lov定義
在Lov定義中定義一個Lov
填寫相關信息:
ValueField
:值字段,一般填寫IdTextField
:文本字段,一般填寫主要數據字段- 自定義SQL:指定此LOV的數據來源
- 顯示字段:配置要顯示的字段
(2)DataSet
LovCode
:通過LovCode指定要使用的Lovfrom
: 通過mapping的form子節點來實現lov到dataSet的字段映射的值來源to
:通過mapping的to子節點來實現lov到dataSet的字段映射的目標字段
<a:dataSet id="GLD2030_respCenterRefBeDs" autoPageSize="true" autoQuery="true" baseUrl="/gld/resp-center-ref-bc" pageSize="10" queryUrl="$[/request/@context_path]/gld/resp-center-ref-bc/query?respCenterId=$[/parameter/@respCenterId]" selectable="true">
<a:fields>
<a:field name="bgtEntityId"/>
<a:field name="bgtEntityName" lovCode="LOV_BGT_ENTITY?accEntityId=$[/parameter/@accEntityId]" autoComplete="true" required="true" prompt="bgt_entity.description" title="bgt_entity.bgt_entity">
<a:mapping>
<a:map from="entityId" to="bgtEntityId"/>
<a:map from="description" to="bgtEntityName"/>
</a:mapping>
</a:field>
</a:fields>
</a:dataSet>
即將lov的description字段映射到DataSet的bgtEntityName字段
(3)Grid
<a:grid id="GLD2030_respCenterRefBeGrid" bindTarget="GLD2030_respCenterRefBeDs" marginHeight="200" navBar="true" width="1000">
<a:columns>
<a:column name="bgtEntityName" align="center" editor="GLD2030_accEntityRefLov" width="200"/>
</a:columns>
<a:editors>
<a:lov id="GLD2030_accEntityRefLov"/>
</a:editors>
</a:grid>
3.2 lov字段帶出
由於lov字段來自其他表,默認的單表查詢是無法查出這些字段的,這樣就會導致lov描述字段爲空,因此要實現lov字段的帶出,可通過關聯其他表進行多表查詢實現,也可通過hap提供了
@JoinTable
、@JoinClumn
註解實現
(1)DTO
實體類添加 JoinTable
、 JoinColumn
註解
@JoinTable
: 指定關聯那張表,同時指定關聯條件@JoinColumn
:指定要關聯查詢的字段
public class GldRespCenterRefBc extends BaseDTO {
public static final String FIELD_BGT_ENTITY_ID = "bgtEntityId";
public static final String FIELD_BGT_ENTITY_NAME = "bgtEntityName";
/**
* 預算實體ID
*/
@JoinTable(name = "bgtEntityJoin", joinMultiLanguageTable = true, target = BgtEntity.class,
type = JoinType.LEFT, on = {@JoinOn(joinField = BgtEntity.FIELD_ENTITY_ID)})
@NotNull
private Long bgtEntityId;
/**
* 預算實體名稱
*/
@JoinColumn(joinName = "bgtEntityJoin", field = BgtEntity.FIELD_DESCRIPTION)
@Transient
@Length(max = 500)
private String bgtEntityName;
}
(2)Controller
查詢時結合 Criteria
和 selectOptions
使用
@Controller
@RequestMapping(value = "/gld/resp-center-ref-bc")
public class GldRespCenterRefBcController extends BaseController{
@RequestMapping("/query")
@ResponseBody
public ResponseData query(GldRespCenterRefBc dto, @RequestParam(defaultValue = DEFAULT_PAGE) int page,
@RequestParam(defaultValue = DEFAULT_PAGE_SIZE) int pageSize, HttpServletRequest request) {
IRequest requestContext = createRequestContext(request);
Criteria criteria = new Criteria(dto);
criteria.where(new WhereField(GldRespCenterRefBc.FIELD_BGT_ENTITY_NAME),
new WhereField(GldRespCenterRefBc.FIELD_BGT_CENTER_NAME),
new WhereField(GldRespCenterRefBc.FIELD_RESP_CENTER_ID));
return new ResponseData(service.selectOptions(requestContext,dto,criteria));
}
}
3.3 lov傳參
Lov的傳參方式有如下兩種:
- lovCode傳參
- js傳參
(1)lovCode傳參
直接在lovCode屬性後拼接參數即可
<a:dataSet id="GLD2030_respCenterRefBeDs" autoPageSize="true" autoQuery="true" baseUrl="/gld/resp-center-ref-bc" pageSize="10" queryUrl="$[/request/@context_path]/gld/resp-center-ref-bc/query?respCenterId=$[/parameter/@respCenterId]" selectable="true">
<a:fields>
<a:field name="bgtEntityId"/>
<a:field name="bgtEntityName" lovCode="LOV_BGT_ENTITY?accEntityId=$[/parameter/@accEntityId]" autoComplete="true" required="true" prompt="bgt_entity.description" title="bgt_entity.bgt_entity">
<a:mapping>
<a:map from="entityId" to="bgtEntityId"/>
<a:map from="description" to="bgtEntityName"/>
</a:mapping>
</a:field>
</a:fields>
</a:dataSet>
若有多個參數,則通過實體符號連接如:
lovCode="LOV_BGT_ENTITY?accEntityId=$[/parameter/@accEntityId]&accEntityName=$[/parameter/@accEntityName]"
(3)JS傳參
可參考:bgt_budget_balance_query.screen
record.getMeta().getField('parameterValueCode').setLovPara('bgtOrgId', bgtOrgId);
record.getMeta().getField('parameterValueCode').setLovPara('companyId', companyId);
record.getMeta().getField('parameterValueCode').setLovPara('parameterCode', parameterCode);
record.getMeta().getField('parameterValueCode').setTitle(record.get('parameterName'));
2.4 lov定義自定義sql示例
SELECT
be.entity_id,
be.entity_code,
betl.description
FROM
bgt_entity be
join bgt_entity_tl betl on be.ENTITY_ID =betl.ENTITY_ID
and betl.LANG = #{request.locale,jdbcType=VARCHAR,javaType=java.lang.String}
AND be.enabled_flag = 'Y'
and EXISTS (
SELECT
1
FROM
gld_acc_entity_ref_be a
WHERE
a.bgt_entity_id = be.entity_id
AND a.acc_entity_id = #{accEntityId}
AND a.enabled_flag = 'Y'
)
<if test="entityCode != null">
AND be.entity_code LIKE CONCAT('%',#{entityCode},'%')
</if>
<if test="description != null">
AND be.description LIKE CONCAT('%',#{description},'%')
</if>