记得上下班打卡 | git大法好,push需谨慎

Commit 8ba80223 authored by 张国柄's avatar 张国柄

+API:迁移调整验票代码(kylin to merchant, 去除登录登出,新增权限逻辑);

parent 8bfd0036
package com.liquidnet.service.merchant.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.commons.lang.constant.LnsRegex;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.commons.lang.util.ServletUtils;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo;
import com.liquidnet.service.merchant.constant.MerchantAuthorizationConst;
import com.liquidnet.service.merchant.dto.param.MerchantStationCheckOrderParam;
import com.liquidnet.service.merchant.dto.param.MerchantStationUploadParam;
import com.liquidnet.service.merchant.dto.vo.MerchantAuthorizationPerformanceVo;
import com.liquidnet.service.merchant.dto.vo.MerchantStationCheckRefreshVo;
import com.liquidnet.service.merchant.dto.vo.MerchantStationPerformanceVo;
import com.liquidnet.service.merchant.service.impl.MerchantStationService;
import com.liquidnet.service.merchant.util.ObjectUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@ApiSupport(order = 10099)
@Api(tags = "验票")
@Slf4j
@Validated
@RestController
@RequestMapping("station")
public class MerchantStationController {
@Autowired
MongoTemplate mongoTemplate;
@Autowired
MerchantStationService merchantStationService;
/* ------------------------------------------------------------------ */
@ApiOperationSupport(order = 1)
@ApiOperation(value = "演出列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "mod", value = "模块[recent-近期的,over-历史]", allowableValues = "recent,over"),
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "match", value = "匹配字符[title|cityName|fieldName]"),
@ApiImplicitParam(type = "form", required = true, dataType = "Integer", name = "pageNo", value = "页码", example = "1"),
@ApiImplicitParam(type = "form", required = true, dataType = "Integer", name = "pageSize", value = "页记录数", example = "5"),
})
@GetMapping("performances")
public ResponseDto<PagedResult<MerchantStationPerformanceVo>> performances(@Pattern(regexp = "\\b(recent|over)\\b", message = "模块参数无效")
@RequestParam String mod,
@RequestParam(required = false) String match,
@RequestParam(defaultValue = "1", required = false) int pageNo,
@RequestParam(defaultValue = "5", required = false) int pageSize) {
PagedResult<MerchantStationPerformanceVo> pagedResult = ObjectUtil.getMerchantStationPerformanceVoPagedResult();
List<MerchantStationPerformanceVo> voList = ObjectUtil.getMerchantStationPerformanceVoArrayList();
String currentUid = CurrentUtil.getCurrentUid();
long count = 0;
try {
// 查取当前用户下关联演出ID列表
List<MerchantAuthorizationPerformanceVo> authorizationPerformanceVoList = merchantStationService.getCheckUserRelationVo(currentUid);
if (!CollectionUtils.isEmpty(authorizationPerformanceVoList)) {
if (log.isDebugEnabled()) {
log.debug("performanceRelationList:{}", JsonUtils.toJson(authorizationPerformanceVoList));
}
Map<String, MerchantAuthorizationPerformanceVo> authorizationPerformanceVoMap =
authorizationPerformanceVoList.stream().collect(Collectors.toMap(MerchantAuthorizationPerformanceVo::getPerformanceId, Function.identity()));
Object[] performanceIdArr = authorizationPerformanceVoMap.keySet().toArray();
Criteria criteria = Criteria.where("performancesId").in(performanceIdArr);
LocalDateTime tmpDt = LocalDateTime.of(LocalDate.now(), LocalTime.of(0, 0, 0, 0));
String tmpDtStr = DateUtil.format(tmpDt, DateUtil.Formatter.yyyyMMddHHmmss);
switch (mod) {
case "recent":
log.debug(":::performances/recent:{},match:{}", currentUid, match);
criteria.andOperator(Criteria.where("timeEnd").gt(tmpDtStr));
break;
// case "down":
// log.info(":::performances/down:{}", currentUid);
// break;
case "over":
log.info(":::performances/over:{}", currentUid);
criteria.andOperator(Criteria.where("timeEnd").lte(tmpDtStr));
break;
default:
log.info(":::performances/default:{}", currentUid);
return ResponseDto.success(pagedResult);
}
if (StringUtils.isNotBlank(match)) {
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("^.*" + match + ".*$", java.util.regex.Pattern.CASE_INSENSITIVE);
criteria.orOperator(
Criteria.where("title").regex(pattern), Criteria.where("cityName").regex(pattern), Criteria.where("fieldName").regex(pattern)
);
}
Query performancesVoQuery = Query.query(criteria);
count = mongoTemplate.count(performancesVoQuery, KylinPerformanceVo.class.getSimpleName());
if (count <= 0) return ResponseDto.success(pagedResult);
performancesVoQuery.with(PageRequest.of(pageNo - 1, pageSize));
performancesVoQuery.with(Sort.by(Sort.Order.asc("timeEnd"), Sort.Order.desc("sort")));
voList = mongoTemplate.find(performancesVoQuery, MerchantStationPerformanceVo.class, KylinPerformanceVo.class.getSimpleName());
if (log.isDebugEnabled()) {
log.debug("voList:{}", JsonUtils.toJson(voList));
}
// 包含`销售统计`权限的演出ID
Object[] hasSalesPerformanceIdArr = authorizationPerformanceVoList.stream()
.filter(f -> f.getPermissionIds().contains(MerchantAuthorizationConst.PerformancePermission.SALES.getId()))
.map(MerchantAuthorizationPerformanceVo::getPerformanceId).toArray();
MerchantAuthorizationPerformanceVo defaultAuthorizationPerformanceVo = MerchantAuthorizationPerformanceVo.getNew();
if (ArrayUtils.isNotEmpty(hasSalesPerformanceIdArr)) {
// 查取演出对应的订单票明细
Query orderTicketEntitiesVoQuery = Query.query(Criteria.where("performanceId").in(hasSalesPerformanceIdArr).and("isPayment").is(1));
List<KylinOrderTicketEntitiesVo> oteVoList = mongoTemplate.find(orderTicketEntitiesVoQuery, KylinOrderTicketEntitiesVo.class, KylinOrderTicketEntitiesVo.class.getSimpleName());
if (log.isDebugEnabled()) {
log.debug("oteVoList:{}", JsonUtils.toJson(oteVoList));
}
// 转换订单票明细结构为Map<performanceId, List<KylinOrderTicketEntitiesVo>>
Map<String, List<KylinOrderTicketEntitiesVo>> oteVoMap = oteVoList.stream().collect(Collectors.groupingBy(KylinOrderTicketEntitiesVo::getPerformanceId));
for (MerchantStationPerformanceVo r : voList) {
List<String> permissionIds = authorizationPerformanceVoMap.getOrDefault(r.getPerformancesId(), defaultAuthorizationPerformanceVo).getPermissionIds();
r.setPermissionIds(StringUtils.join(permissionIds.toArray(), "."));
r.setTicketTimeList(null);
MerchantAuthorizationPerformanceVo authorizationPerformanceVo = authorizationPerformanceVoMap.get(r.getPerformancesId());
if (authorizationPerformanceVo.getPermissionIds().contains(MerchantAuthorizationConst.PerformancePermission.SALES.getId())) {
// 演出的所有订单票明细
List<KylinOrderTicketEntitiesVo> performanceTicketEntitiesVoList = oteVoMap.get(r.getPerformancesId());
if (!CollectionUtils.isEmpty(performanceTicketEntitiesVoList)) {
merchantStationService.salesStatisticsSetter(r, performanceTicketEntitiesVoList);
}
}
}
} else {
voList.forEach(r -> {
List<String> permissionIds = authorizationPerformanceVoMap.getOrDefault(r.getPerformancesId(), defaultAuthorizationPerformanceVo).getPermissionIds();
r.setPermissionIds(StringUtils.join(permissionIds.toArray(), "."));
r.setTicketTimeList(null);
});
}
}
} catch (Exception e) {
log.error("验票:查取演出列表异常[station/performances]", e);
}
pagedResult.setList(voList).setTotal(count, pageSize).setPageSize(pageSize);
return ResponseDto.success(pagedResult);
}
@ApiOperationSupport(order = 2)
@ApiOperation(value = "下载验票数据")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "performanceId", value = "演出ID[64]"),
})
@GetMapping("download")
public ResponseDto<MerchantStationCheckRefreshVo> downloadTicketData(@NotBlank(message = "演出ID不能为空")
@RequestParam String performanceId) {
String currentUid = CurrentUtil.getCurrentUid();
log.info("验票:下载验票数据[UID:{},performanceId:{}]", currentUid, performanceId);
ResponseDto<MerchantStationCheckRefreshVo> responseDto = this.downloadRefreshTicketDataValid(currentUid, performanceId);
if (!responseDto.isSuccess()) {
return responseDto;
}
return ResponseDto.success(merchantStationService.downloadRefreshTicketData(performanceId, null));
}
@ApiOperationSupport(order = 3)
@ApiOperation(value = "刷新验票数据")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "performanceId", value = "演出ID[64]"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "latestUpdateAt", value = "最近更新时间[yyyy-MM-dd HH:mm:ss]"),
})
@PostMapping("refresh")
public ResponseDto<MerchantStationCheckRefreshVo> refreshTicketData(@NotBlank(message = "演出ID不能为空")
@RequestParam String performanceId,
@Pattern(regexp = LnsRegex.Valid.DATETIME_FULL, message = "时间格式有误")
@RequestParam String latestUpdateAt) {
String currentUid = CurrentUtil.getCurrentUid();
log.info("验票:刷新验票数据[UID:{},performanceId:{},latestUpdateAt:{}]", currentUid, performanceId, latestUpdateAt);
ResponseDto<MerchantStationCheckRefreshVo> responseDto = this.downloadRefreshTicketDataValid(currentUid, performanceId);
if (!responseDto.isSuccess()) {
return responseDto;
}
return ResponseDto.success(merchantStationService.downloadRefreshTicketData(performanceId, latestUpdateAt));
}
@ApiOperationSupport(order = 4)
@ApiOperation(value = "上载验票数据")
@PutMapping("upload")
public ResponseDto<Object> uploadTicketData(@Valid @RequestBody MerchantStationUploadParam parameter) {
String currentUid = CurrentUtil.getCurrentUid();
log.info("验票:上载验票数据[UID:{}]", currentUid);
HttpServletRequest request = ServletUtils.getRequest();
String agent = request.getParameter("User-Agent");
if (StringUtils.containsIgnoreCase(agent, "android")) {
parameter.setCheckClient("ANDROID");
} else if (StringUtils.containsIgnoreCase(agent, "iPhone")
|| StringUtils.containsIgnoreCase(agent, "iPod")
|| StringUtils.containsIgnoreCase(agent, "iPad")) {
parameter.setCheckClient("IOS");
} else {
parameter.setCheckClient("APP");
}
List<MerchantStationCheckOrderParam> checkOrderParamList = parameter.getCheckOrderParamList();
if (!CollectionUtils.isEmpty(checkOrderParamList)) {
merchantStationService.updateByStation(parameter);
}
return ResponseDto.success();
}
/* ------------------------------------------------------------------ */
// private static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
// Map<Object, Boolean> seen = new ConcurrentHashMap<>();
// return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
// }
/* ------------------------------------------------------------------ */
/**
* 下载、更新验票数据逻辑校验
*
* @param currentUid UID
* @param performanceId 演出ID
* @return ResponseDto<MerchantStationCheckRefreshVo>
*/
public ResponseDto<MerchantStationCheckRefreshVo> downloadRefreshTicketDataValid(String currentUid, String performanceId) {
// 查取当前用户下关联演出ID列表
List<MerchantAuthorizationPerformanceVo> authorizationPerformanceVoList = merchantStationService.getCheckUserRelationVo(currentUid);
if (CollectionUtils.isEmpty(authorizationPerformanceVoList)) {
return ResponseDto.failure(ErrorMapping.get("130901"));
}
List<MerchantAuthorizationPerformanceVo> targetAuthPerformanceVoList =
authorizationPerformanceVoList.stream().filter(r -> r.getPerformanceId().equals(performanceId)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(targetAuthPerformanceVoList)) {
return ResponseDto.failure(ErrorMapping.get("130902"));
}
// MerchantAuthorizationPerformanceVo authorizationPerformanceVo = targetAuthPerformanceVoList.get(0);
// LocalDateTime canDownDt = DateUtil.Formatter.yyyyMMddHHmmss.parse(relationParam.getCanDownTime());
// if (canDownDt.isAfter(LocalDateTime.now())) {
// return ResponseDto.failure(ErrorMapping.get("130903"));
// }
return ResponseDto.success();
}
}
package com.liquidnet.service.merchant.dto.param;
import com.liquidnet.commons.lang.constant.LnsRegex;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
@ApiModel(value = "MerchantStationCheckOrderParam", description = "上载验票入参")
@Data
public class MerchantStationCheckOrderParam implements Serializable {
private static final long serialVersionUID = -6456177634242162305L;
@ApiModelProperty(position = 10, value = "票明细ID")
@NotBlank(message = "票明细ID不能为空")
private String ticketEntitiesId;
@ApiModelProperty(position = 11, value = "验票类型:1-扫码,2-手机号")
private String checkType;
@ApiModelProperty(position = 12, value = "验票时间[yyyy-MM-dd HH:mm:ss]")
@NotBlank(message = "验票时间不能为空")
@Pattern(regexp = LnsRegex.Valid.DATETIME_FULL, message = "验票时间格式有误")
private String checkedAt;
@ApiModelProperty(position = 13, value = "验票操作人ID")
@NotBlank(message = "验票操作人不能为空")
private String checkUserId;
}
package com.liquidnet.service.merchant.dto.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import java.io.Serializable;
import java.util.List;
@ApiModel(value = "MerchantStationUploadParam", description = "上载入参")
@Data
public class MerchantStationUploadParam implements Serializable {
private static final long serialVersionUID = -7029677911036924098L;
@ApiModelProperty(position = 10, value = "票明细数据")
@Valid
List<MerchantStationCheckOrderParam> checkOrderParamList;
String checkClient;
}
package com.liquidnet.service.merchant.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@ApiModel(value = "MerchantStationCheckOrderVo", description = "下载验票-订单响应参数")
@Data
public class MerchantStationCheckOrderVo implements Serializable, Cloneable {
private static final long serialVersionUID = 7634492610346603681L;
@ApiModelProperty(position = 10, value = "ID[64]")
private String orderTicketEntitiesId;
@ApiModelProperty(position = 11, value = "演出ID[64]")
private String performanceId;
@ApiModelProperty(position = 12, value = "订单ID")
private String orderId;
@ApiModelProperty(position = 13, value = "票种ID")
private String ticketId;
@ApiModelProperty(position = 14, value = "二维身份CODE")
private String qrCode;
@ApiModelProperty(position = 15, value = "订单用户姓名")
private String userName;
@ApiModelProperty(position = 16, value = "订单用户手机号")
private String userMobile;
@ApiModelProperty(position = 17, value = "入场人姓名")
private String enterName;
@ApiModelProperty(position = 18, value = "入场人手机号")
private String enterMobile;
@ApiModelProperty(position = 19, value = "出票状态:0-未出票,1-已出票")
private Integer status;
@ApiModelProperty(position = 20, value = "支付状态:0-未支付,1-已支付,2-退款中,3-已退款")
private Integer isPayment;
@ApiModelProperty(position = 21, value = "出票端:(验票app)android/ios")
private String checkClient;
@ApiModelProperty(position = 22, value = "验票类型:1-扫码,2-手机号")
private String checkType;
@ApiModelProperty(position = 23, value = "验票时间[yyyy-MM-dd HH:mm:ss]")
private String checkedAt;
@ApiModelProperty(position = 24, value = "更新时间[yyyy-MM-dd HH:mm:ss]")
private String updatedAt;
private static final MerchantStationCheckOrderVo obj = new MerchantStationCheckOrderVo();
public static MerchantStationCheckOrderVo getNew() {
try {
return (MerchantStationCheckOrderVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new MerchantStationCheckOrderVo();
}
}
}
package com.liquidnet.service.merchant.dto.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@ApiModel(value = "MerchantStationCheckRefreshVo", description = "下载刷新验票信息响应参数")
@Data
public class MerchantStationCheckRefreshVo implements Serializable, Cloneable {
private static final long serialVersionUID = -6108305147829613655L;
private MerchantStationPerformanceVo performanceVo;
private List<MerchantStationCheckOrderVo> checkOrderVos;
private static final MerchantStationCheckRefreshVo obj = new MerchantStationCheckRefreshVo();
public static MerchantStationCheckRefreshVo getNew() {
try {
return (MerchantStationCheckRefreshVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new MerchantStationCheckRefreshVo();
}
}
}
package com.liquidnet.service.merchant.dto.vo;
import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketTimesVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@ApiModel(value = "MerchantStationPerformanceVo", description = "演出列表响应参数")
@Data
public class MerchantStationPerformanceVo implements Serializable, Cloneable {
private static final long serialVersionUID = 2904227908512047961L;
@ApiModelProperty(position = 10, value = "演出ID[64]")
private String performancesId;
@ApiModelProperty(position = 11, value = "类型[101-音乐节,102小型演出(livehouse演出),103巡演]")
private Integer type;
@ApiModelProperty(position = 12, value = "演出标题[255]")
private String title;
@ApiModelProperty(position = 13, value = "开始时间[yyyy/MM/dd]")
private String timeStart;
@ApiModelProperty(position = 14, value = "结束时间[yyyy/MM/dd]")
private String timeEnd;
@ApiModelProperty(position = 15, value = "城市名称")
private String cityName;
@ApiModelProperty(position = 16, value = "场地名称")
private String fieldName;
@ApiModelProperty(position = 17, value = "票种列表信息")
private List<MerchantStationTicketVo> ticketVoList;
@ApiModelProperty(position = 18, value = "可下载时间")
private String canDownTime;
@ApiModelProperty(position = 20, value = "票房")
private BigDecimal priceSum;
@ApiModelProperty(position = 21, value = "票量[9]")
private Integer number;
@ApiModelProperty(position = 22, value = "已验票量[9]")
private Integer checkedNum;
@ApiModelProperty(position = 23, value = "余量[9]")
private Integer remainderNum;
@ApiModelProperty(position = 29, value = "权限(多个权限以.分隔)[4-销售统计|5-验票]")
private String permissionIds;
@ApiModelProperty(position = 30, value = "#过程数据,前端无需关注")
private List<KylinTicketTimesVo> ticketTimeList;
private static final MerchantStationPerformanceVo obj = new MerchantStationPerformanceVo();
public static MerchantStationPerformanceVo getNew() {
try {
return (MerchantStationPerformanceVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new MerchantStationPerformanceVo();
}
}
}
package com.liquidnet.service.merchant.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@ApiModel(value = "MerchantStationTicketVo", description = "票种统计信息")
@Data
public class MerchantStationTicketVo implements Serializable, Cloneable {
private static final long serialVersionUID = -2995250476517713387L;
@ApiModelProperty(position = 10, value = "票种ID[64]")
private String ticketId;
@ApiModelProperty(position = 11, value = "名称[32]")
private String title;
@ApiModelProperty(position = 12, value = "单价(8,2)")
private BigDecimal price;
@ApiModelProperty(position = 13, value = "适用开始时间")
private String useStart;
@ApiModelProperty(position = 14, value = "适用结束时间")
private String useEnd;
@ApiModelProperty(position = 15, value = "票房")
private BigDecimal priceSum;
@ApiModelProperty(position = 16, value = "票量[9]")
private Integer number;
@ApiModelProperty(position = 17, value = "已验票量[9]")
private Integer checkedNum;
@ApiModelProperty(position = 18, value = "余量[9]")
private Integer remainderNum;
private static final MerchantStationTicketVo obj = new MerchantStationTicketVo();
public static MerchantStationTicketVo getNew() {
try {
return (MerchantStationTicketVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new MerchantStationTicketVo();
}
}
}
package com.liquidnet.service.merchant.service.impl;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo;
import com.liquidnet.service.merchant.constant.MerchantAuthorizationConst;
import com.liquidnet.service.merchant.dto.param.MerchantStationUploadParam;
import com.liquidnet.service.merchant.dto.vo.*;
import com.liquidnet.service.merchant.util.ObjectUtil;
import com.liquidnet.service.merchant.util.QueueUtil;
import com.mongodb.bulk.BulkWriteResult;
import com.mongodb.client.model.UpdateOneModel;
import com.mongodb.client.model.WriteModel;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Slf4j
@Service
public class MerchantStationService {
@Autowired
MongoTemplate mongoTemplate;
@Autowired
QueueUtil queueUtil;
/**
* 查取用户存在权限的演出
*
* @param checkUserId UID
* @return List<MerchantAuthorizationPerformanceVo>
*/
public List<MerchantAuthorizationPerformanceVo> getCheckUserRelationVo(String checkUserId) {
return mongoTemplate.find(
Query.query(Criteria.where("uid").is(checkUserId).and("permissionIds").in(
MerchantAuthorizationConst.PerformancePermission.SALES.getId(),
MerchantAuthorizationConst.PerformancePermission.CHECK.getId())
),
MerchantAuthorizationPerformanceVo.class, MerchantAuthorizationPerformanceVo.class.getSimpleName());
}
/**
* 销售统计数据整理
*
* @param r 演出基础信息
* @param performanceTicketEntitiesVoList 演出订单票明细:Map<performanceId, List<KylinOrderTicketEntitiesVo>>
*/
public void salesStatisticsSetter(MerchantStationPerformanceVo r, List<KylinOrderTicketEntitiesVo> performanceTicketEntitiesVoList) {
try {
List<KylinTicketVo> performanceTicketVoList = ObjectUtil.getKylinTicketVoArrayList();
r.getTicketTimeList().forEach(tt -> performanceTicketVoList.addAll(tt.getTicketList()));// 提取演出对应票种信息
// 转换票种信息结构为Map<ticketsId, ticketVo>
Map<String, KylinTicketVo> performanceTicketMap = performanceTicketVoList.stream().collect(Collectors.toMap(KylinTicketVo::getTicketsId, Function.identity(), (k1, k2) -> k2));
if (log.isDebugEnabled()) {
log.debug("performanceTicketMap:{}", JsonUtils.toJson(performanceTicketMap));
}
// 订单票明细按票种分组
Map<String, List<KylinOrderTicketEntitiesVo>> performanceTicketEntitiesVoMap =
performanceTicketEntitiesVoList.stream().collect(Collectors.groupingBy(KylinOrderTicketEntitiesVo::getTicketId));
List<MerchantStationTicketVo> ticketVoList = ObjectUtil.getMerchantStationTicketVoArrayList();
BigDecimal priceSum = BigDecimal.ZERO;
int number = 0, checkedNum = 0, remainderNum = 0;
for (Map.Entry<String, List<KylinOrderTicketEntitiesVo>> entry : performanceTicketEntitiesVoMap.entrySet()) {
KylinTicketVo ticketVo = performanceTicketMap.get(entry.getKey());
MerchantStationTicketVo stationTicketVo = MerchantStationTicketVo.getNew();
stationTicketVo.setTicketId(ticketVo.getTicketsId());
stationTicketVo.setTitle(ticketVo.getTitle());
stationTicketVo.setPrice(ticketVo.getPrice());
stationTicketVo.setUseStart(ticketVo.getUseStart());
stationTicketVo.setUseEnd(ticketVo.getUseEnd());
List<KylinOrderTicketEntitiesVo> subPerformanceTicketEntitiesVoList = entry.getValue();
// 订单票明细按出票状态分组
Map<Integer, List<KylinOrderTicketEntitiesVo>> subStatusPerformanceTicketEntitiesVoMap
= subPerformanceTicketEntitiesVoList.stream().collect(Collectors.groupingBy(KylinOrderTicketEntitiesVo::getStatus));
stationTicketVo.setNumber(subPerformanceTicketEntitiesVoList.size());
stationTicketVo.setPriceSum(stationTicketVo.getPrice().multiply(BigDecimal.valueOf(stationTicketVo.getNumber())));
List<KylinOrderTicketEntitiesVo> checkedEntitiesVoList = subStatusPerformanceTicketEntitiesVoMap.get(1);
stationTicketVo.setCheckedNum(CollectionUtils.isEmpty(checkedEntitiesVoList) ? 0 : checkedEntitiesVoList.size());
List<KylinOrderTicketEntitiesVo> remainderEntitiesVoList = subStatusPerformanceTicketEntitiesVoMap.get(0);
stationTicketVo.setRemainderNum(CollectionUtils.isEmpty(remainderEntitiesVoList) ? 0 : remainderEntitiesVoList.size());
number += stationTicketVo.getNumber();
checkedNum += stationTicketVo.getCheckedNum();
remainderNum += stationTicketVo.getRemainderNum();
priceSum = priceSum.add(stationTicketVo.getPriceSum());
ticketVoList.add(stationTicketVo);
}
r.setPriceSum(priceSum);
r.setNumber(number);
r.setCheckedNum(checkedNum);
r.setRemainderNum(remainderNum);
r.setTicketVoList(ticketVoList);
} catch (Exception e) {
log.error("验票:整合销售统计异常[station/performances],performancesId:{}", r.getPerformancesId(), e);
}
}
/**
* 上载验票数据
*
* @param parameter MerchantStationUploadParam
*/
public void updateByStation(MerchantStationUploadParam parameter) {
// // 根据验票用户ID分组
// Map<String, List<KylinStationCheckOrderParam>> checkOrderByUserIdMap = checkOrderParamList.stream().collect(Collectors.groupingBy(KylinStationCheckOrderParam::getCheckUserId));
//
// for (Map.Entry<String, List<KylinStationCheckOrderParam>> entry : checkOrderByUserIdMap.entrySet()) {
// List<KylinStationCheckOrderParam> checkOrderByUserList = entry.getValue();
//
// // 根据验票类型分组
// Map<String, List<KylinStationCheckOrderParam>> checkOrderByCheckTypeMap = checkOrderByUserList.stream().collect(Collectors.groupingBy(KylinStationCheckOrderParam::getCheckType));
// }
LocalDateTime nowDt = LocalDateTime.now();
String nowDtStr = DateUtil.format(nowDt, DateUtil.Formatter.yyyyMMddHHmmss);
LinkedList<Object[]> paramsList = CollectionUtil.linkedListObjectArr();
List<WriteModel<Document>> list = ObjectUtil.getWriteModelDocumentArrayList();
parameter.getCheckOrderParamList().forEach(r -> {
if (StringUtils.isNotBlank(r.getTicketEntitiesId())) {
KylinOrderTicketEntitiesVo updateVo = KylinOrderTicketEntitiesVo.getNew();
updateVo.setStatus(1);// 出票状态: 0未出票 1已出票
updateVo.setCheckClient(parameter.getCheckClient());
updateVo.setUpdatedAt(nowDtStr);
updateVo.setCheckType(r.getCheckType());
updateVo.setCheckedAt(r.getCheckedAt());
updateVo.setCheckUserId(r.getCheckUserId());
paramsList.add(new Object[]{1, updateVo.getCheckClient() + updateVo.getCheckType(), nowDt, r.getTicketEntitiesId()});
Document updateQuery = Query.query(Criteria.where("orderTicketEntitiesId").is(r.getTicketEntitiesId())).getQueryObject();
Document updateDoc = new Document("status", updateVo.getStatus())
.append("checkClient", updateVo.getCheckClient())
.append("updatedAt", updateVo.getUpdatedAt())
.append("checkType", updateVo.getCheckType())
.append("checkedAt", updateVo.getCheckedAt())
.append("checkUserId", updateVo.getUserId());
list.add(new UpdateOneModel<>(updateQuery, new Document("$set", updateDoc)));
}
});
BulkWriteResult bulkWriteResult = mongoTemplate.getCollection(KylinOrderTicketEntitiesVo.class.getSimpleName()).bulkWrite(list);
log.info("验票:上载验票数据[bulkWriteResult:{}]", JsonUtils.toJson(bulkWriteResult));
if (bulkWriteResult.getModifiedCount() > 0) {
queueUtil.sendMsgByRedis(MQConst.KylinQueue.SQL_STATION.getKey(),
SqlMapping.get("kylin_order_ticket_entities.update_status_bystation", paramsList));
}
}
/**
* 下载、更新验票数据
*
* @param performanceId 演出ID
* @param latestUpdateAt 最近更新时间(仅当更新时必传,下载时传null)
* @return MerchantStationCheckRefreshVo
*/
public MerchantStationCheckRefreshVo downloadRefreshTicketData(String performanceId, String latestUpdateAt) {
Criteria criteria = Criteria.where("performanceId").is(performanceId).and("isPayment").is(1);
if (StringUtils.isNotEmpty(latestUpdateAt)) {
criteria.and("updatedAt").gte(latestUpdateAt);
}
// 查取演出对应的订单票明细
Query orderTicketEntitiesVoQuery = Query.query(criteria);
List<MerchantStationCheckOrderVo> checkOrderVos = mongoTemplate.find(orderTicketEntitiesVoQuery, MerchantStationCheckOrderVo.class, KylinOrderTicketEntitiesVo.class.getSimpleName());
// 查取订单信息(orderTicketsId,userMobile,userName,qrCode)
Query query = Query.query(Criteria.where("orderTicketsId").in(checkOrderVos.stream().map(MerchantStationCheckOrderVo::getOrderId).toArray()));
query.fields().include("orderTicketsId").include("userMobile").include("userName").include("qrCode");
List<KylinOrderTicketVo> orderTicketVoList = mongoTemplate.find(query, KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
for (KylinOrderTicketVo t : orderTicketVoList) {
for (MerchantStationCheckOrderVo r : checkOrderVos) {
if (r.getOrderId().equals(t.getOrderTicketsId())) {
r.setQrCode(t.getQrCode());
r.setUserMobile(t.getUserMobile());
r.setUserName(t.getUserName());
}
}
}
MerchantStationCheckRefreshVo stationCheckRefreshVo = MerchantStationCheckRefreshVo.getNew();
stationCheckRefreshVo.setCheckOrderVos(checkOrderVos);
// 查取演出信息
MerchantStationPerformanceVo performanceVo = mongoTemplate.findOne(Query.query(Criteria.where("performancesId").is(performanceId)),
MerchantStationPerformanceVo.class, KylinPerformanceVo.class.getSimpleName());
// 提取演出对应票种信息
List<KylinTicketVo> performanceTicketVoList = ObjectUtil.getKylinTicketVoArrayList();
performanceVo.getTicketTimeList().forEach(tt -> performanceTicketVoList.addAll(tt.getTicketList()));
List<MerchantStationTicketVo> ticketVoList = ObjectUtil.getMerchantStationTicketVoArrayList();
for (KylinTicketVo r : performanceTicketVoList) {
MerchantStationTicketVo stationTicketVo = MerchantStationTicketVo.getNew();
stationTicketVo.setTicketId(r.getTicketsId());
stationTicketVo.setTitle(r.getTitle());
stationTicketVo.setPrice(r.getPrice());
stationTicketVo.setUseStart(r.getUseStart());
stationTicketVo.setUseEnd(r.getUseEnd());
ticketVoList.add(stationTicketVo);
}
performanceVo.setTicketTimeList(null);
performanceVo.setTicketVoList(ticketVoList);
stationCheckRefreshVo.setPerformanceVo(performanceVo);
return stationCheckRefreshVo;
}
}
......@@ -2,10 +2,13 @@ package com.liquidnet.service.merchant.util;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.kylin.dao.PerformancePartnerListDao;
import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformancePartnerListVo;
import com.liquidnet.service.kylin.dto.vo.partner.TicketTimesTicketCreatePartnerVo;
import com.liquidnet.service.merchant.dto.vo.*;
import com.mongodb.BasicDBObject;
import com.mongodb.client.model.WriteModel;
import org.bson.Document;
import java.util.ArrayList;
......@@ -21,13 +24,19 @@ public class ObjectUtil {
private static final PagedResult<MerchantSponsorsVo> merchantSponsorsVoPagedResult = new PagedResult<>();
private static final ArrayList<MerchantStationPerformanceVo> merchantStationPerformanceVoArrayList = new ArrayList<>();
private static final ArrayList<MerchantStationTicketVo> merchantStationTicketVoArrayList = new ArrayList<>();
private static final PagedResult<MerchantStationPerformanceVo> merchantStationPerformanceVoPagedResult = new PagedResult<>();
private static final BasicDBObject basicDBObject = new BasicDBObject();
private static final ArrayList<WriteModel<Document>> writeModelDocumentArrayList = new ArrayList<>();
private static final ArrayList<PerformancePartnerListDao> performancePartnerListDaoArrayList = new ArrayList<>();
private static final ArrayList<TicketTimesTicketCreatePartnerVo> ticketTimesTicketCreatePartnerVoList = new ArrayList<>();
private static final ArrayList<KylinPerformancePartnerListVo> performancePartnerListVo = new ArrayList<>();
private static final ArrayList<MerchantAuthorizationPerformanceVo> permissionVoList = new ArrayList<>();
private static final ArrayList<KylinTicketVo> kylinTicketVoArrayList = new ArrayList<>();
public static ArrayList<PerformancePartnerListDao> getPerformancePartnerListDaoArrayList() {
return (ArrayList<PerformancePartnerListDao>) performancePartnerListDaoArrayList.clone();
......@@ -69,7 +78,27 @@ public class ObjectUtil {
return (ArrayList<MerchantSponsorAppliesVo>) merchantSponsorAppliesVoArrayList.clone();
}
public static ArrayList<MerchantStationPerformanceVo> getMerchantStationPerformanceVoArrayList() {
return (ArrayList<MerchantStationPerformanceVo>) merchantStationPerformanceVoArrayList.clone();
}
public static ArrayList<MerchantStationTicketVo> getMerchantStationTicketVoArrayList() {
return (ArrayList<MerchantStationTicketVo>) merchantStationTicketVoArrayList.clone();
}
public static PagedResult<MerchantStationPerformanceVo> getMerchantStationPerformanceVoPagedResult() {
return merchantStationPerformanceVoPagedResult.clone();
}
public static BasicDBObject cloneBasicDBObject() {
return (BasicDBObject) basicDBObject.clone();
}
public static ArrayList<WriteModel<Document>> getWriteModelDocumentArrayList() {
return (ArrayList<WriteModel<Document>>) writeModelDocumentArrayList.clone();
}
public static ArrayList<KylinTicketVo> getKylinTicketVoArrayList() {
return (ArrayList<KylinTicketVo>) kylinTicketVoArrayList.clone();
}
}
......@@ -62,3 +62,9 @@
29999=无权限
# 专业版APP
130901=当前账号无关联演出数据
130902=当前账号未关联当前演出
130903=当前演出还未开放下载
......@@ -21,7 +21,9 @@ merchant_authorization_permissions.insert=INSERT INTO merchant_authorization_per
# ---------------------------------------------------------------------------------------------------------------------
kylin_order_ticket_entities.update_status_bystation=UPDATE kylin_order_ticket_entities SET `status`=?,check_client=?,updated_at=? WHERE order_ticket_entities_id=?
# ---------------------------------------------------------------------------------------------------------------------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment