Service方法

1. 基本功能1. 基本功能

1.1. 查询前调用Service方法1.1. 查询前调用Service方法

应用场景

航运调度管理业务多船查询:
1. 航运调度业务很多界面有船舶查询条件,用户希望可以查询多条船舶,并且可以把选择的多船信息保存起来,每次查询时自动加上多船查询条件;提供多船查询的不同业务界面,希望可以设置不同的多船查询条件;
2. 项目组设计了一张基础表,用于存放用户、业务界面、对应的船舶列表;通过云平台配置查询前调用Service自定义代码实现自动拼入多船查询条件的功能。

界面效果

航次任务界面,有一个【多船选择】按钮
h012201
用户在【多船选择】界面,选择多条船舶并保存
h012002
用户保存后,基础表中记录【业务界面、用户、船舶列表】信息;用户在航次任务界面,点【查询】按钮时会默认加上多船查询条件。

1.2. 保存后调用Service方法1.2. 保存后调用Service方法

应用场景

同步更新结算业务表BcPublicOrder:
1. 货代业务表有多张,例如海运订单、空运订单、拖车订单、报关订单
2. 结算中心的费用清单挂在统一结算业务表
3. 货代业务表保存后,同步更新结算业务表

实现效果

海运出口制作界面,用户点【保存】按钮时,后台自动更新关联表信息
h012009

1.3. 删除前调用Service方法1.3. 删除前调用Service方法

应用场景

业务单删除前校验
1. 已存在结算信息的不允许删除
2. 状态为已提交的不允许删除

实现效果

出口委托单界面,用户点【删除】按钮时,删除前判断该业务单是否可删除。

1.4. 自定义扩展覆盖查询逻辑1.4. 自定义扩展覆盖查询逻辑

平台支持配置自定义扩展覆盖查询逻辑,即自定义查询后不需要修改html页面上的URL地址也可以实现数据显示。例如表格的数据是自定义扩展查询后的结果,覆盖了原来的查询逻辑。
QQ截图20180820155850

2. 配置方法2. 配置方法

2.1. 查询前调用Service方法2.1. 查询前调用Service方法

配置

  1. 对象建模–业务对象–业务对象管理:编辑业务对象,点击【业务对象扩展】tab页,新增一笔记录,填写扩展Service文件名称,类型为:Java Service,路径为扩展service在工程中的路径
    service1
    service2
  2. 编辑业务对象,在【方法定义】tab页找到查询方法,并进行编辑,在【调用规则表】tab页新增一笔记录,扩展名称为扩展Service的名称,执行类型为:Java Service,执行内容为Service中的方法名称,调用时机为执行之前
    service33
  3. 编写Service类java代码,自定义Service类MultiFindFilter.java中实现find方法,代码可以参考3.1. 查询前调用Service方法

2.2. 保存后调用Service方法2.2. 保存后调用Service方法

配置

  1. 对象建模–业务对象–业务对象管理:编辑业务对象,点击【业务对象扩展】tab页,新增一笔记录,填写扩展Service文件名称,类型为:Java Service,路径为扩展service在工程中的路径
    service4
    service5
  2. 编辑业务对象,在【方法定义】tab页找到查询方法,并进行编辑,在【调用规则表】tab页新增一笔记录,扩展名称为扩展Service的名称,执行类型为:Java Service,执行内容为Service中的方法名称,调用时机为执行之后
    service6
  3. 编写Service类java代码,自定义Service类MfOrderLogicServiceImpl.java中实现getOrderProcedureMFE方法,实现的逻辑是订单保存后更新其他关联表的数据。云平台框架调用保存后调用Service类时,会自动传入实体对象作为参数。

2.3. 删除前调用Service方法2.3. 删除前调用Service方法

配置

  1. 配置业务对象扩展:在业务对象的【业务对象扩展】配置扩展Service类信息,填写【扩展名称】=Service类名,【扩展类型】=Java Service,【路径】=Service类包路径
    h012015

h012016
2. 配置删除前调用Service:在【出口委托单】业务对象的【方法定义】配置删除前调用Service方法,在【调用规则表】子对象中新增调用规则记录,填写【扩展名称】为上一步业务对象的扩展名称,【调用时机】=执行之前,【执行类型】=Java Service,【执行内容】= deleteBefore(自定义Service类定义的方法名)
h012017
h012018
h012019
3. 编写Service类java代码,自定义Service类FbMfOrderOExpDeleteServiceImpl.java中实现deleteBefore方法,实现的逻辑是订单删除前判断是否满足可删除条件。云平台框架调用删除前调用Service类时,会自动传入主键ids参数。

2.4. 自定义扩展覆盖查询逻辑2.4. 自定义扩展覆盖查询逻辑

配置

  1. 对象建模–业务对象–业务对象管理:编辑业务对象–子对象关系,新增一笔数据,配置子对象关系,根据需求配置。
    QQ截图20180820160238
  2. 在子业务对象下的业务对象扩展配置扩展接口类的地址。
    QQ截图20180820161400
    QQ截图20180820161423
  3. 编辑子业务对象–方法定义下的查询方法,切换至调用规则表tab页,新增数据,配置【调用时机选择】选择覆盖方法,【扩展名称】填写业务对象扩展中配置的名称,【执行类型】JAVA Service
    QQ截图20180820160503
    QQ截图20180820160527
  4. 自定义代码可以参考3.4. 自定义扩展覆盖查询逻辑

3. 常用扩展3. 常用扩展

3.1. 查询前调用Service方法

  1. 编写Service类java代码,自定义Service类MultiFindFilter.java中实现find方法,实现的逻辑是如果对应页面有配置多船选择,则在查询条件中加入多船查询条件。云平台框架调用查询前调用Service类时,会自动传入example查询条件参数。
    h012003
    Service类的代码参考如下:
/**
 * 多船选择查询过滤
 * Created by user on 2017/3/31.
 */
@Service
public class MultiVesselFindFilter {

    @Autowired
    VopSysMultiShipSelectedService vopSysMultiShipSelectedService;

    public void find(BaseExample example){
        //
        boolean flag = true ;
        String menuNo = "";
        IUser user = UserContextHolder.getCurrentUser();
        RequestAndResponseContextHolder.request();

        if(example instanceof VocVoyageTaskExample){
            VocVoyageTaskExample  exampleActual = (VocVoyageTaskExample)example;
            menuNo = "vocVoyageTaskManage.html";
            if(exampleActual.getOredCriteria() != null && exampleActual.getOredCriteria().size() > 0)
            {
                List<Criterion> criterions = exampleActual.getOredCriteria().get(0).getAllCriteria();
                flag = insetParam(criterions,menuNo);
            }
        }else if(example instanceof VwVocVoyPlanOnStopExample){
            //2017-4-12 zhengtd 增加停航船舶界面
            VwVocVoyPlanOnStopExample  exampleVoyPlanOnStop = (VwVocVoyPlanOnStopExample)example;
            menuNo = "vwVocVoyPlanOnStopManage.html";
            if(exampleVoyPlanOnStop.getOredCriteria() != null && exampleVoyPlanOnStop.getOredCriteria().size() > 0)
            {
                List<Criterion> criterions = exampleVoyPlanOnStop.getOredCriteria().get(0).getAllCriteria();
                flag = insetParam(criterions,menuNo);
            }
        }else if(example instanceof VwVocVoyPlanOnPortExample){
            //2017-4-12 zhengtd 增加在港船舶界面
            VwVocVoyPlanOnPortExample  exampleVoyPlanOnPort = (VwVocVoyPlanOnPortExample)example;
            menuNo = "vwVocVoyPlanOnPortManage.html";
            if(exampleVoyPlanOnPort.getOredCriteria() != null && exampleVoyPlanOnPort.getOredCriteria().size() > 0)
            {
                List<Criterion> criterions = exampleVoyPlanOnPort.getOredCriteria().get(0).getAllCriteria();
                flag = insetParam(criterions,menuNo);
            }
        }else if(example instanceof VwVocAllShoreRptExample){
            //2017-4-12 zhengtd 增加岸端电报录入界面
            VwVocAllShoreRptExample  exampleAllShoreRpt = (VwVocAllShoreRptExample)example;
            menuNo = "vwVocAllShoreRptManage.html";
            if(exampleAllShoreRpt.getOredCriteria() != null && exampleAllShoreRpt.getOredCriteria().size() > 0)
            {
                List<Criterion> criterions = exampleAllShoreRpt.getOredCriteria().get(0).getAllCriteria();
                flag = insetParam(criterions,menuNo);
            }
        }else if(example instanceof VwVocVoyPlanUnvoyExample){
            //2017-4-12 zhengtd 增加非营运船舶界面
            VwVocVoyPlanUnvoyExample  exampleVoyPlanUnvoy = (VwVocVoyPlanUnvoyExample)example;
            menuNo = "vwVocVoyPlanUnvoyManage.html";
            if(exampleVoyPlanUnvoy.getOredCriteria() != null && exampleVoyPlanUnvoy.getOredCriteria().size() > 0)
            {
                List<Criterion> criterions = exampleVoyPlanUnvoy.getOredCriteria().get(0).getAllCriteria();
                flag = insetParam(criterions,menuNo);
            }
        }else if(example instanceof VocRptEmailsExample){
            VocRptEmailsExample vocRptEmailsExample = (VocRptEmailsExample)example;
            menuNo = "vocRptEmailsManage.html";
            if(vocRptEmailsExample.getOredCriteria()!=null && vocRptEmailsExample.getOredCriteria().size()>0){
                List<Criterion> criterions = vocRptEmailsExample.getOredCriteria().get(0).getAllCriteria();
                flag = insetParam(criterions,menuNo);
            }

        }
        else if(example instanceof VwAddOilPlanExample){
            //2017-8-18 luoaj 增加加油计划界面
            VwAddOilPlanExample exampleAddOilPlan = (VwAddOilPlanExample)example;
            menuNo = "vwAddOilPlanManage.html";
            if(exampleAddOilPlan.getOredCriteria() != null && exampleAddOilPlan.getOredCriteria().size() > 0)
            {
                List<Criterion> criterions = exampleAddOilPlan.getOredCriteria().get(0).getAllCriteria();
                flag = insetParam(criterions,menuNo);
            }
        }else if(example instanceof VwTraPortChargePortExample){
            //2017-8-24
            VwTraPortChargePortExample  exampleTraPortChargePort = (VwTraPortChargePortExample)example;
            menuNo = "vwTraPortChargePortManage.html";
            if(exampleTraPortChargePort.getOredCriteria() != null && exampleTraPortChargePort.getOredCriteria().size() > 0)
            {
                List<Criterion> criterions = exampleTraPortChargePort.getOredCriteria().get(0).getAllCriteria();
                flag = insetParam(criterions,menuNo);
            }
        }
        else if(example instanceof VwTraPortEstBalanceExample){
            //2017-09-18
            //预估余额冲销界面
            VwTraPortEstBalanceExample  vwTraPortEstBalanceExample = (VwTraPortEstBalanceExample)example;
            menuNo = "vwTraPortEstBalanceManage.html";
            if(vwTraPortEstBalanceExample.getOredCriteria() != null && vwTraPortEstBalanceExample.getOredCriteria().size() > 0)
            {
                List<Criterion> criterions = vwTraPortEstBalanceExample.getOredCriteria().get(0).getAllCriteria();
                flag = insetParam(criterions,menuNo);
            }
        }
        else if(example instanceof VwPortChargeHeaderExample){
            //2017-10-16 luoaj 港使费预估查询页面
            VwPortChargeHeaderExample exampleVwPortChargeHeader = (VwPortChargeHeaderExample)example;
            menuNo = "vwPortChargeHeaderManage.html";
            if(exampleVwPortChargeHeader.getOredCriteria() != null && exampleVwPortChargeHeader.getOredCriteria().size() > 0)
            {
                List<Criterion> criterions = exampleVwPortChargeHeader.getOredCriteria().get(0).getAllCriteria();
                flag = insetParam(criterions,menuNo);
            }
        }
        else{
            flag = false;
        }
        if(flag){
            VopSysMultiShipSelectedExample vopSysMultiShipSelectedExample = VopSysMultiShipSelectedExample.create();
            vopSysMultiShipSelectedExample.and().andUsrCodeEqualTo(user.getUsername())
                    .andMenuNoEqualTo(menuNo);
            int count = vopSysMultiShipSelectedService.countByExample(vopSysMultiShipSelectedExample);
            if(count > 0){
                example.and().andCreateCondition(" VESSEL_CODE in (select smss.vessel_code from SYS_MULTI_SHIP_SELECTED smss where smss.usr_code = '"+user.getUsername()+"' and smss.menu_no = '"+menuNo+"')");
            }
        }
    }

    public boolean insetParam(List<Criterion> criterions,String menuNo){
        if(criterions != null && criterions.size() > 0){
            for(Criterion criterion : criterions){
                System.out.println(criterion.getPropertyName());
                if("vesselCode".equals(criterion.getPropertyName())){
                    return false;
                }
            }
        }
        return true;
    }
}

3.4. 自定义扩展覆盖查询逻辑3.4. 自定义扩展覆盖查询逻辑

自定义扩展接口类代码

package com.gillion.base.freightcg.service.custom;
import com.gillion.platform.framework.core.query.DefaultQueryService;
/**
 * Created  on 2018/8/15.
 */
@SuppressWarnings("all")
public interface queryExtService extends DefaultQueryService{
}

自定义扩展实现类的代码

package com.gillion.base.freightcg.service.custom;

import com.gillion.base.freightcg.domain.BcFreightBf;
import com.gillion.base.freightcg.domain.BcFreightBfExample;
import com.gillion.base.freightcg.domain.BcFreightChangeItem;
import com.gillion.base.freightcg.domain.BcFreightChangeItemExample;
import com.gillion.base.freightcg.service.BcFreightBfService;
import com.gillion.base.freightcg.service.BcFreightChangeItemService;
import com.gillion.platform.framework.core.Constants;
import com.gillion.platform.framework.core.query.OrderColumn;
import com.gillion.platform.framework.core.query.Page;
import com.gillion.platform.framework.core.query.PageRequest;
import com.gillion.platform.framework.core.query.SearchColumn;
import com.gillion.platform.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import static com.gillion.platform.framework.core.web.BaseMultiActionController.removeSearchColumn;

/**
 * Created by liyy on 2018/8/15.
 */
@Service
@SuppressWarnings("all")
public class queryExtServiceImpl implements queryExtService{

    @Autowired
    protected BcFreightChangeItemService bcFreightChangeItemService;
    @Autowired
    protected BcFreightBfService bcFreightBfService;

    @Override
    public void query(HttpServletRequest request, Map<String, Object> result, List<SearchColumn> searchColumns, List<OrderColumn> orderColumns, PageRequest pageRequest, String gridKey, String s1) {
        String jobOrderNo = null;
        BcFreightBfExample example = BcFreightBfExample.create(searchColumns);
        BcFreightChangeItemExample bcFreightChangeItemExample = BcFreightChangeItemExample.create();
        for(SearchColumn searchColumn:searchColumns){
            if(searchColumn.getPropertyName().equals("jobOrderNo")){
                jobOrderNo = searchColumn.getValue();
                break;
            }
        }
        if(StringUtils.isNotBlank(jobOrderNo)){
            bcFreightChangeItemExample.createCriteria().andJobOrderNoEqualTo(jobOrderNo);
            List<BcFreightChangeItem> bcFreightChangeItemmList = bcFreightChangeItemService.selectByExample(bcFreightChangeItemExample);
            List<String> list = new ArrayList<String>();
            for(BcFreightChangeItem bcFreightChangeItem : bcFreightChangeItemmList){
                if(StringUtils.isNotBlank(bcFreightChangeItem.getBcFreightId())) {
                    list.add(bcFreightChangeItem.getBcFreightId());
                }
            }
            if(list.size()>0) {
                example.createCriteria().andBcFreightIdIn(list);
            }
        }
        example.addOrderByClause(BcFreightBf.class, orderColumns);
        List<BcFreightBf> bcFreightBfs = new ArrayList<BcFreightBf>();
        if(pageRequest.isQueryPage())
        {
            Page<BcFreightBf> page = bcFreightBfService.find(pageRequest, example);
            bcFreightBfs = page.getRecords();

            result.put(Constants.TOTAL, page.getTotalRecord());
        }
        else
        {
            bcFreightBfs = bcFreightBfService.find(example);
            result.put(Constants.TOTAL, bcFreightBfs.size());
        }
        // 1 ---BcFreightBf
        result.put("bcFreightBfs", bcFreightBfs);
    }
}

4. 版本更新 4. 版本更新