From 49726442d0bad78c9211b7ea13d688c03b916ff6 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期二, 03 九月 2024 17:40:18 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master-v2' into master-v2 --- src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java | 2 src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java | 5 - src/main/java/com/mzl/flower/web/v2/coupon/CouponRecordController.java | 2 src/main/resources/mapper/coupon/CouponRecordMapper.xml | 1 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplatePointDTO.java | 4 - src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordResultVO.java | 60 ++++++++++++++ src/main/java/com/mzl/flower/schedule/ScheduleService.java | 20 +++++ src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateVipController.java | 1 src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java | 1 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateUserDTO.java | 4 - src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponRecordDTO.java | 3 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordAppDTO.java | 21 +++++ src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVipVO.java | 6 + src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java | 11 ++ src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateActivyController.java | 1 src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java | 22 +++++ src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateUserController.java | 1 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateDTO.java | 7 - src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java | 2 src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml | 5 + src/main/resources/mapper/coupon/CouponTemplateMapperCustom.xml | 3 21 files changed, 150 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordAppDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordAppDTO.java new file mode 100644 index 0000000..e8f6a9d --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordAppDTO.java @@ -0,0 +1,21 @@ +package com.mzl.flower.dto.request.coupon; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +@Data +public class CreateCouponRecordAppDTO { + + /** + * 优惠券ID + */ + @ApiModelProperty(value = "优惠券ID") + @NotEmpty(message = "优惠券ID不能为空") + private String couponId; + + @ApiModelProperty(value = "商户ID",hidden = true) + private Long customerId; + +} diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateDTO.java index 972d056..546ea4a 100644 --- a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateDTO.java +++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateDTO.java @@ -2,9 +2,6 @@ import com.fasterxml.jackson.annotation.JsonFormat; -import com.mzl.flower.base.BaseAutoEntity; -import com.mzl.flower.base.BaseEntity; -import com.mzl.flower.base.annotation.DictTrans; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -13,7 +10,6 @@ import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.List; @Data public class CreateCouponTemplateDTO { @@ -139,9 +135,6 @@ @NotNull(message = "每人限领不能为空") private Integer getLimit; - - @ApiModelProperty(value = "领取后有效类型名称") - private String usageTimeTypeName; } diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplatePointDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplatePointDTO.java index 975ff1a..94472c3 100644 --- a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplatePointDTO.java +++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplatePointDTO.java @@ -87,8 +87,4 @@ - @ApiModelProperty(value = "领取后有效类型名称") - private String usageTimeTypeName; - - } diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateUserDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateUserDTO.java index 6f428ff..5d34ca0 100644 --- a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateUserDTO.java +++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateUserDTO.java @@ -74,8 +74,4 @@ @NotNull(message = "指定的用户列表id不能为空") private List<Long> pointCostomIdList; - - @ApiModelProperty(value = "领取后有效类型名称") - private String usageTimeTypeName; - } diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponRecordDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponRecordDTO.java index 817f790..f745ccc 100644 --- a/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponRecordDTO.java +++ b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponRecordDTO.java @@ -35,4 +35,7 @@ @ApiModelProperty(value = "领取用户类型-全部用户,指定用户") private String getUserType; + @ApiModelProperty(value = "优惠券模版ID") + private String couponId; + } diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordResultVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordResultVO.java index 6584d80..ea2c370 100644 --- a/src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordResultVO.java +++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordResultVO.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.mzl.flower.base.AbstractTransDTO; import com.mzl.flower.base.annotation.DictTrans; -import com.mzl.flower.entity.coupon.CouponTemplateDO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -125,5 +124,64 @@ @ApiModelProperty(value = "订单号") private String orderNo; + /** + * 优惠券ID + */ + @ApiModelProperty(value = "优惠券ID") + private String couponId; + + /** + * 用户id + */ + @ApiModelProperty(value = "用户id") + private String userId; + + /** + * 商户ID + */ + @ApiModelProperty(value = "商户ID") + private Long customerId; + + /** + * 使用订单 + */ + @ApiModelProperty(value = "使用订单") + private String orderId; + + /** + * 使用时间 + */ + @ApiModelProperty(value = "使用时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8") + @DateTimeFormat + private LocalDateTime usedTime; + + /** + * 优惠券种类(活动优惠券、用户优惠券、会员优惠券,积分优惠券) + */ + @ApiModelProperty(value = "优惠券种类(活动优惠券、用户优惠券、会员优惠券,积分优惠券)") + @DictTrans(target = "categoryName",codeType = "COUPON_CATEGORY") + private String category; + + /** + * 优惠券代码 + */ + @ApiModelProperty(value = "优惠券代码") + private String couponCode; + + /** + * 积分数量 + */ + @ApiModelProperty(value = "积分数量") + private Integer point; + + /** + * 会员等级 + */ + @ApiModelProperty(value = "会员等级") + private Integer memberId; + + @ApiModelProperty(value = "优惠券种类名称") + private String categoryName; } diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVipVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVipVO.java index 7ed7135..f09c079 100644 --- a/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVipVO.java +++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVipVO.java @@ -147,4 +147,10 @@ @ApiModelProperty(value = "每人限领") private Integer getLimit; + /** + * 发放数量 + */ + @ApiModelProperty(value = "发放数量") + private Integer couponAmount; + } diff --git a/src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java b/src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java index cfc3594..bc19ba0 100644 --- a/src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java +++ b/src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java @@ -100,11 +100,6 @@ private Integer point; /** - * 订单号 - */ - private String orderNo; - - /** * 会员等级 */ private Integer memberId; diff --git a/src/main/java/com/mzl/flower/schedule/ScheduleService.java b/src/main/java/com/mzl/flower/schedule/ScheduleService.java index f4b6603..1cf21b0 100644 --- a/src/main/java/com/mzl/flower/schedule/ScheduleService.java +++ b/src/main/java/com/mzl/flower/schedule/ScheduleService.java @@ -9,6 +9,7 @@ import com.mzl.flower.mapper.flower.FlowerCategoryMapper; import com.mzl.flower.mapper.partner.PartnerMapper; import com.mzl.flower.mapper.payment.OrderMapper; +import com.mzl.flower.service.coupon.CouponRecordService; import com.mzl.flower.service.flower.FlowerCategoryService; import com.mzl.flower.service.flower.FlowerService; import com.mzl.flower.service.menber.impl.GrowthValueDealService; @@ -61,6 +62,9 @@ @Autowired private GrowthValueDealService growthValueDealService; + + @Autowired + private CouponRecordService couponRecordService; @Scheduled(cron = "1 0/20 * * * ?") public void calculateAvePrice() { @@ -210,4 +214,20 @@ log.info("成长值扣除结束:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); } + + @Scheduled(cron = "0 30 0 1 * ?") + public void grantVipCouponRecordList() { + log.info("会员优惠券开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); + couponRecordService.grantVipCouponRecordList(); + log.info("会员优惠券结束:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); + } + + @Scheduled(cron = "0 30 0 1 * ?") + public void expiredCouponRecordLastMon() { + log.info("会员优惠券开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); + couponRecordService.expiredCouponRecordLastMon(); + log.info("会员优惠券结束:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); + } + + } diff --git a/src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java b/src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java index accb4a5..9482623 100644 --- a/src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java +++ b/src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java @@ -41,7 +41,7 @@ * 根据当月日期设置上个月的日期的优惠券过期 * @return */ - boolean expiredCouponRecordByListCurMonth(); + boolean expiredCouponRecordLastMon(); Integer statisCouponTemplateCount(QueryCouponStatisticsBO queryCouponStatisticsBO); diff --git a/src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java index 18e029a..9a58724 100644 --- a/src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java @@ -292,6 +292,9 @@ couponTemplateDO.setGetStartDate(firstDayStart); couponTemplateDO.setGetEndDate(lastDayEnd); + // 设置总数为当前会员的人数 + couponTemplateDO.setCouponAmount(CollectionUtils.isNotEmpty(customerList)?customerList.size():0); + // 设置默认类型固定 couponTemplateDO.setUsageType(CouponUsageTypeEnum.FIXED.getType()); @@ -311,7 +314,7 @@ } @Override - public boolean expiredCouponRecordByListCurMonth() { + public boolean expiredCouponRecordLastMon() { try{ LocalDateTime now = LocalDateTime.now(); @@ -461,9 +464,11 @@ public boolean cancelCouponUsage(String couponId, String orderId) { // 查询订单使用的优惠券 final CouponRecordDO couponRecordDO = getCouponByOrderId(orderId); - // TODO + couponRecordDO.setStatus(CouponUsedStatusEnum.UNUSED.getType()); + couponRecordDO.setUsedTime(null); + couponRecordDO.setOrderId(null); - return false; + return baseMapper.updateById(couponRecordDO)>0; } @Override diff --git a/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java b/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java index a1c8bef..ce2b9af 100644 --- a/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java +++ b/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java @@ -132,6 +132,8 @@ final List<CouponTemplateCustomerDO> couponCustomList = dto.getPointCostomIdList().stream().map(customId -> { CouponTemplateCustomerDO customReDO = new CouponTemplateCustomerDO(); + // 解决本地不加ID不报错,线上报错问题 + customReDO.setId(IdUtil.simpleUUID()); customReDO.setCouponId(couponTemplateDO.getId()); customReDO.setCustomId(customId); return customReDO; diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponRecordController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponRecordController.java index e7cdb4f..4bc4d77 100644 --- a/src/main/java/com/mzl/flower/web/v2/coupon/CouponRecordController.java +++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponRecordController.java @@ -42,7 +42,6 @@ private CouponTemplateService2 couponTemplateService; - @PostMapping("") @ApiOperation(value = "新增", notes = "新增") public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateCouponRecordDTO dto) { @@ -58,7 +57,6 @@ if(StringUtils.isNotBlank(couponTemplateDO.getStatus()) && couponTemplateDO.getStatus().equals(CouponStatusEnum.EXPIRED.getStatus())){ throw new ValidationException("优惠券已下架"); } - couponRecordService.createCouponRecord(dto); return returnData(R.SUCCESS.getCode(), null); diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateActivyController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateActivyController.java index 9b7109e..e14979b 100644 --- a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateActivyController.java +++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateActivyController.java @@ -78,6 +78,7 @@ } CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO(); + BeanUtils.copyProperties(couponTemplateDO,couponTemplateBO); BeanUtils.copyProperties(dto, couponTemplateBO); // 设置成积分优惠券 diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java index 7658080..547b8af 100644 --- a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java +++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java @@ -7,22 +7,26 @@ import com.mzl.flower.base.ReturnDataDTO; import com.mzl.flower.config.exception.ValidationException; import com.mzl.flower.config.security.SecurityUtils; +import com.mzl.flower.dto.request.coupon.CreateCouponRecordAppDTO; import com.mzl.flower.dto.request.coupon.CreateCouponRecordDTO; import com.mzl.flower.dto.request.coupon.QueryActivityEffectCouponDTO; import com.mzl.flower.dto.request.coupon.QueryMineCouponRecordDTO; import com.mzl.flower.dto.response.coupon.CouponTemplateAppVO; import com.mzl.flower.dto.response.coupon.CouponTemplateVO; +import com.mzl.flower.dto.response.customer.CustomerDTO; import com.mzl.flower.entity.coupon.CouponTemplateDO; import com.mzl.flower.enums.CouponCategoryEnum; import com.mzl.flower.enums.CouponGetTypeEnum; import com.mzl.flower.enums.CouponStatusEnum; import com.mzl.flower.enums.CouponUsedStatusEnum; +import com.mzl.flower.mapper.customer.CustomerMapper; import com.mzl.flower.service.coupon.CouponRecordService; import com.mzl.flower.service.coupon.CouponTemplateService2; import com.mzl.flower.utils.ConverterUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; @@ -44,6 +48,10 @@ @Autowired CouponRecordService couponRecordService; + + + @Autowired + CustomerMapper customerMapper; @GetMapping("/home/list") @ApiOperation(value = "查询-首页弹框", notes = "查询-首页弹框") @@ -117,7 +125,7 @@ @PostMapping("/receive") @ApiOperation(value = "优惠券领取", notes = "优惠券领取") - public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateCouponRecordDTO dto) { + public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateCouponRecordAppDTO dto) { final CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getCouponId()); if(null==couponTemplateDO){ @@ -131,8 +139,18 @@ throw new ValidationException("优惠券已下架"); } + // 根据当前获取获取商户的ID + CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(SecurityUtils.getUserId()); + if(null==currentCustomer){ + throw new ValidationException("当前登录的用户记录不存在"); + } + // 设置当前用户为登录用户 + dto.setCustomerId(currentCustomer.getId()); - couponRecordService.createCouponRecord(dto); + CreateCouponRecordDTO dtoTrans=new CreateCouponRecordDTO(); + BeanUtils.copyProperties(dto,dtoTrans); + + couponRecordService.createCouponRecord(dtoTrans); return returnData(R.SUCCESS.getCode(), null); } diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java index 9817a86..50a553a 100644 --- a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java +++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java @@ -76,6 +76,7 @@ } CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO(); + BeanUtils.copyProperties(couponTemplateDO,couponTemplateBO); BeanUtils.copyProperties(dto, couponTemplateBO); // 设置成积分优惠券 diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateUserController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateUserController.java index 5b9f19d..13d7bd7 100644 --- a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateUserController.java +++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateUserController.java @@ -94,6 +94,7 @@ } CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO(); + BeanUtils.copyProperties(couponTemplateDO,couponTemplateBO); BeanUtils.copyProperties(dto, couponTemplateBO); // 设置成指定用户 diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateVipController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateVipController.java index be32580..762b64a 100644 --- a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateVipController.java +++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateVipController.java @@ -75,6 +75,7 @@ } CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO(); + BeanUtils.copyProperties(couponTemplateDO,couponTemplateBO); BeanUtils.copyProperties(dto, couponTemplateBO); // 设置成积分优惠券 diff --git a/src/main/resources/mapper/coupon/CouponRecordMapper.xml b/src/main/resources/mapper/coupon/CouponRecordMapper.xml index d020e58..a5fe497 100644 --- a/src/main/resources/mapper/coupon/CouponRecordMapper.xml +++ b/src/main/resources/mapper/coupon/CouponRecordMapper.xml @@ -25,7 +25,6 @@ <result column="coupon_name" property="couponName" /> <result column="point" property="point" /> - <result column="order_no" property="orderNo" /> </resultMap> diff --git a/src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml b/src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml index 820cc2d..4b1c2e9 100644 --- a/src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml +++ b/src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml @@ -28,7 +28,6 @@ <result column="get_user_type" property="getUserType" /> <result column="point" property="point" /> - <result column="order_no" property="orderNo" /> </resultMap> <update id="checkCouponExpired"> @@ -116,6 +115,10 @@ AND (t.customerName like concat('%', #{param.keyword},'%') or t.user_id like concat('%', #{param.keyword},'%') ) </if> + <if test="param.couponId != null and param.couponId != ''"> + and t.coupon_id = #{param.couponId} + </if> + order by t.create_time desc </sql> diff --git a/src/main/resources/mapper/coupon/CouponTemplateMapperCustom.xml b/src/main/resources/mapper/coupon/CouponTemplateMapperCustom.xml index 1972404..66f2f6f 100644 --- a/src/main/resources/mapper/coupon/CouponTemplateMapperCustom.xml +++ b/src/main/resources/mapper/coupon/CouponTemplateMapperCustom.xml @@ -34,8 +34,9 @@ <result column="status" property="status" /> <result column="point" property="point" /> <result column="member_id" property="memberId" /> - </resultMap> + + <update id="activeBatchCouponTemplate"> update t_coupon_template set status='active',update_by=#{param.updateBy},update_time=now() where id in <foreach collection="param.idList" item="item" open="(" separator="," close=")"> -- Gitblit v1.9.3