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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章