Grid中“授权类型+库存组织编码+编码”组合生效时间不重叠的实现

问题描述

grid中“授权类型+库存组织编码+编码”三个字段的值一样时,生效时间(起始时间->结束时间 跨度不重叠)

解决思路

保存数据时,先根据前台传递过来的封装好的dto(其中包含了起始时间和结束时间)从数据库中查询生效时间重叠的数据集合list。如果list为空,那么说明数据库中没有与这个dto生效时间重叠的数据,就可以做新增或者更新操作了。如果List不为空,则抛出自定义异常。

关于生效时间,这里认为有以下4种情况
1.起始时间、结束时间都不为空,起始时间-结束时间之间的跨度为生效时间
2.起始时间为空,结束时间不为空,结束时间之前的所有时间为生效时间
3.起始时间不为空,结束时间为空,起始时间之后的所有时间为生效时间
4.起始时间、结束时间都为空,没有生效时间

具体方案

这里从mapper层往上看

  • mapper层
    在xml文件中,在对应的select语句中添加判断生效时间是否重叠的条件
<select id="selectPurchaserAuth"  resultMap="BaseResultMap">
...
<where>
            <if test="purchaserId!=null">
                and cgepa.PURCHASER_ID = #{purchaserId,jdbcType=DECIMAL}
            </if>
            <if test="enterpriseId!=null">
                and cgepa.ENTERPRISE_ID = #{enterpriseId,jdbcType=DECIMAL}
            </if>
            <!--add by xiaotong.wu@hand-china.com 2017-10-16-->
            <if test="authType!=null and organizationId!=null and itemId!=null and startDate!=null and endDate!=null">
                and cgepa.AUTH_TYPE = #{authType}
                and cgepa.ORGANIZATION_ID = #{organizationId}
                and not (cgepa.START_DATE > #{endDate} or #{startDate} > cgepa.END_DATE )
            </if>
            <if test="authType!=null and organizationId!=null and itemId!=null and startDate ==null and endDate!=null">
                and cgepa.AUTH_TYPE = #{authType}
                and cgepa.ORGANIZATION_ID = #{organizationId}
                and not cgepa.START_DATE > #{endDate}
            </if>
            <if test="authType!=null and organizationId!=null and itemId!=null and startDate !=null and endDate==null">
                and cgepa.AUTH_TYPE = #{authType}
                and cgepa.ORGANIZATION_ID = #{organizationId}
                and cgepa.END_DATE > #{startDate}
            </if>
            <!--add end-->
        </where>
</select>
  • service层
    1.将前台传过来的改变过的数据集合分为新增的数据集合与更新的数据集合
    2.分别遍历两个数据集合,先判断数据库中是否有生效时间重叠的数据,再执行相应的操作
/**
     * @description 根据实体分页查询出实体的集合
     * @param requestContext
     * @param dto
     * @param page
     * @param pageSize
     * @return
     */
@Override
    public List<GxpEntpPurchaserAuth> selectPurchaserAuth(IRequest requestContext, GxpEntpPurchaserAuth dto, int page,
                                                          int pageSize) {
        PageHelper.startPage(page, pageSize);
        List<GxpEntpPurchaserAuth> gxpEntpPurchaserAuths=gxpEntpPurchaserAuthMapper.selectPurchaserAuth(dto);
        return gxpEntpPurchaserAuths;
    }
/**
     * @description 校验数据的合法性并插入数据库
     * @param  request
     * @param  dto
     * @return
     */
@Override
    public String validateThenSubmit(IRequest request, List<GxpEntpPurchaserAuth> dto) throws Exception {
        String message = "";
        GxpEntpPurchaserAuth purchaserAuthCheck = new GxpEntpPurchaserAuth();
        List<GxpEntpPurchaserAuth> addList = new ArrayList<>();
        List<GxpEntpPurchaserAuth> updateList = new ArrayList<>();
        for(GxpEntpPurchaserAuth auth:dto){
            //把批量提交数据分类,一类为新增数据,一类为更新数据
            if(auth.get__status()==null||auth.get__status().trim().equals("")||auth.get__status().trim().equals("add")){
                addList.add(auth);
            }else {
                updateList.add(auth);
            }
        }
        //先更新
        for (GxpEntpPurchaserAuth auth:updateList){
            purchaserAuthCheck.setAuthId(auth.getAuthId());
            purchaserAuthCheck.setPurchaserId(auth.getPurchaserId());
            purchaserAuthCheck.setEnterpriseId(auth.getEnterpriseId());
            purchaserAuthCheck.setAuthType(auth.getAuthType());
            purchaserAuthCheck.setItemId(auth.getItemId());
            purchaserAuthCheck.setOrganizationId(auth.getOrganizationId());
            purchaserAuthCheck.setStartDate(auth.getStartDate());
            purchaserAuthCheck.setEndDate(auth.getEndDate());
            List<GxpEntpPurchaserAuth> purchaserAuthList = this.selectPurchaserAuth(request,purchaserAuthCheck,1,10);

            if(auth.getStartDate()==null&&auth.getEndDate()==null){
                //如果起始日期和生效日期都为null,则不做限制,那么做更新操作
                auth.setLastUpdatedBy(request.getUserId());
                this.updateByPrimaryKeySelective(request,auth);
            } else
            if(purchaserAuthList.size()>0){
                //起始日期和生效日期不都为null
                if((purchaserAuthList.size()==1)&&(purchaserAuthList.get(0).getAuthId().equals(auth.getAuthId()))){
                    //数据库中存在一条与更新后生效时间重叠的记录,并且这条记录就是要被更新的记录,那么做更新操作
                    auth.setLastUpdatedBy(request.getUserId());
                    this.updateByPrimaryKeySelective(request,auth);
                }else {
                    /*1.数据库中存在一条与更新后生效时间重叠的记录,但是这条记录不是要被更新的记录,抛异常
                     *2.数据库中存在多条与更新后生效时间重叠的记录,抛异常
                     */
                    GxpEntpPurchaserAuth gxpEntpPurchaserAuth = purchaserAuthList.get(0);
                    String code = "";
                    if (gxpEntpPurchaserAuth.getAuthType().equals("ITEM")){
                        code = gxpEntpPurchaserAuth.getItemNo();
                    }else {
                        code = gxpEntpPurchaserAuth.getItemCategoryCode();
                    }
                    message = "授权类型为:"+auth.getAuthTypeDesc()+",库存组织名称为:"+gxpEntpPurchaserAuth.getOrganizationName()+",编码为:"
                            +code+",生效时间重叠!";
                    throw new RuntimeException(message);
                }
            }else {
                //数据库中不存在与更新后生效时间重叠的记录,那么做更新操作
                auth.setLastUpdatedBy(request.getUserId());
                this.updateByPrimaryKeySelective(request,auth);
            }

        }

        //再新增
        for(GxpEntpPurchaserAuth auth:addList){
            purchaserAuthCheck.setAuthId(auth.getAuthId());
            purchaserAuthCheck.setPurchaserId(auth.getPurchaserId());
            purchaserAuthCheck.setEnterpriseId(auth.getEnterpriseId());
            purchaserAuthCheck.setAuthType(auth.getAuthType());
            purchaserAuthCheck.setItemId(auth.getItemId());
            purchaserAuthCheck.setOrganizationId(auth.getOrganizationId());
            purchaserAuthCheck.setStartDate(auth.getStartDate());
            purchaserAuthCheck.setEndDate(auth.getEndDate());
            List<GxpEntpPurchaserAuth> purchaserAuthList = this.selectPurchaserAuth(request,purchaserAuthCheck,1,10);

            if(auth.getStartDate()==null&&auth.getEndDate()==null){
                //起始日期和生效日期都为null,则不做验证,那么做新增操作
                this.insertSelective(request,auth);
            }else
            if(purchaserAuthList.size()>0){
                //起始日期和生效日期不都为null
                GxpEntpPurchaserAuth gxpEntpPurchaserAuth = purchaserAuthList.get(0);
                String code = "";
                if (gxpEntpPurchaserAuth.getAuthType().equals("ITEM")){
                    code = gxpEntpPurchaserAuth.getItemNo();
                }else {
                    code = gxpEntpPurchaserAuth.getItemCategoryCode();
                }
                message = "授权类型为:"+gxpEntpPurchaserAuth.getAuthTypeDesc()+",库存组织名称为:"+gxpEntpPurchaserAuth.getOrganizationName()+",编码为:"
                        +code+",生效时间重叠!";
                throw new RuntimeException(message);
            }else {
                this.insertSelective(request,auth);
            }
        }

        return message;

    }
  • controller层
    将hap框架自带的批量更新方法batchUpdate换成自定义的validateThenSubmit方法
@RequestMapping(value = "/cux/gxp/entp/purchaser/auth/submit/{enterpriseId}")
    @ResponseBody
    public ResponseData update(@PathVariable Long enterpriseId, HttpServletRequest request, @RequestBody List<GxpEntpPurchaserAuth> dto){
        IRequest requestCtx = createRequestContext(request);
        ResponseData message = new ResponseData();
        GxpEntpEnterprise gxpEntpEnterprise = new GxpEntpEnterprise();
        gxpEntpEnterprise.setEnterpriseId(enterpriseId);
        String statusCode = entpEnterpriseService.selectEnterPrise(null,gxpEntpEnterprise,1,1).get(0).getStatusCode();
        String msg = null;
        try {
            msg = service.validateThenSubmit(requestCtx,dto);
        } catch (Exception e) {
            msg = e.getMessage();
            message.setMessage(msg);
            message.setSuccess(false);
            e.printStackTrace();
        }
        if(msg.trim().equals("")||msg==null){
            message.setSuccess(true);
            message.setMessage(msg);
        }
       if("REVOKED".equals(statusCode)||"REJECTED".equals(statusCode)||"APPROVED".equals(statusCode)) {
            gxpEntpEnterprise.setStatusCode("ALTER");
            entpEnterpriseService.updateByPrimaryKeySelective(requestCtx,gxpEntpEnterprise);
        }
    }
  • html
    将grid的保存按钮的点击事件改为自定义的saveFunction()
    saveFunction()中
    1.为grid中更新的行数据对象添加一个值为'update'的__status字段
    2.为grid中新增的行数据对象添加一个值为'add'的__status字段
    3.将所有有变动的数据行发送到后台,并根据后台返回的结果来弹出不同的弹框
var viewModel = kendo.observable({
        model: {},
        createFunction: function () {
            $('#purchaserAuthGrid').data('kendoGrid').addRow();
        },
        saveFunction: function () {
            var dataSource = $('#purchaserAuthGrid').data('kendoGrid').dataSource;
            if($('#purchaserAuthGrid').data('kendoGrid').validate()){
                var created = dataSource.created();
                var updated = dataSource.updated();
                $.each(created,function (i,r) {
                    r['__status'] = 'add';
                    created[i].purchaserId = purchaserId;
                        });
                $.each(updated,function (i,r) {
                    r['__status'] = 'update';
                });
                var total = created.concat(updated);
                if((total!=null)&&(total!=[])&&(total.length!==0)){
                    $.ajax({
                        url: '${base.contextPath}' + "/cux/gxp/entp/purchaser/auth/submit/"+enterpriseId,
                        type:"POST",
                        async:false,
                        dataType:"json",
                        contentType:"application/json",
                        data:kendo.stringify(total),
                        success:function (args) {
                            if (args.success==true){
                                kendo.ui.showInfoDialog({
                                    message:'保存成功!'
                                });
                                dataSource.page(1);
                            }else {
                                kendo.ui.showErrorDialog({
                                    message:args.message
                                });
                            }
                        }
                    })
                }
            }
        },
        queryResource: function (e) {
            $('#purchaserAuthGrid').data('kendoGrid').dataSource.page(1);
        }
    });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容