02_單表功能開發

前言

開發時注意遵循開發規範

一、明確需求

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 GldResponsibilityCenterMapperGldResponsibilityCenterMapper.xml
5 Service IGldResponsibilityCenterServiceGldResponsibilityCenterServiceImpl
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 GldResponsibilityCenterTestMapperGldResponsibilityCenterTestMapper.xml
5 Service IGldResponsibilityCenterServiceTestGldResponsibilityCenterServiceTestImpl
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 [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://host:{host}:{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對查詢參數進行了限制,所有的條件查詢,均需用 @WhereCriteria 手動聲明

  • 條件查詢: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)查詢時結合 CriteriaselectOptions 進行查詢

@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:值字段,一般填寫Id
  • TextField:文本字段,一般填寫主要數據字段
  • 自定義SQL:指定此LOV的數據來源
  • 顯示字段:配置要顯示的字段

(2)DataSet

  • LovCode:通過LovCode指定要使用的Lov
  • from: 通過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

實體類添加 JoinTableJoinColumn 註解

  • @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

查詢時結合 CriteriaselectOptions使用

@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]&amp;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>
發佈了18 篇原創文章 · 獲贊 4 · 訪問量 6124
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章