feat:查询座位信息

This commit is contained in:
Zhujx
2025-07-25 16:21:26 +08:00
parent 19add26e64
commit 044ab25c2a
13 changed files with 223 additions and 23 deletions

View File

@@ -16,7 +16,7 @@
<artifactId>script</artifactId>
<properties>
<java.version>1.8</java.version>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

View File

@@ -27,4 +27,9 @@ public class UrlConstants {
* 创建订单URL
*/
public final static String PROJECT_ORDER_CREATE_URL = BASE_URL + "/order/app/center/v3/create";
/**
* 获取演出座位信息
*/
public final static String PROJECT_SEAT_STATUS_URL = BASE_URL + "/performance/app/project/seatPlanStatus";
}

View File

@@ -134,4 +134,10 @@ public class FPerformSeatInfo implements Serializable {
* 演出id
*/
private Long projectId;
/**
* 是否售罄
* 0:否 1:是
*/
private Integer soldOut;
}

View File

@@ -14,7 +14,7 @@ public class ProjectOrderCreateReq {
private Integer deliveryType;
private String contactName;
private String contactPhone;
private Integer payment;
private BigDecimal payment;
private BigDecimal totalPrice;
private Long performId;
private String projectId;

View File

@@ -0,0 +1,20 @@
package com.xiang.xservice.fwd.entity.resp.http.perform;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: xiang
* @Date: 2025-07-25 16:10
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SeatPlanStatus {
private Integer seatPlanId;
private Integer performId;
private Boolean soldOutFlag;
private Integer enableNoTicketLabel;
private Integer standbyStatus;
}

View File

@@ -22,4 +22,6 @@ public interface FwdPerformSeatInfoMapper {
FPerformSeatInfo getPerformSeatInfoBySeatIdAndPerformIdAndProjectId(
@Param("seatId") Long seatId, @Param("performId") Long performId, @Param("projectId") Long projectId);
List<FPerformSeatInfo> getPerformSeatByProjectId(Long projectId);
}

View File

@@ -106,6 +106,8 @@ public class PullDataFromFWDJob {
if (CollectionUtils.isNotEmpty(performInfo.getPerformInfo())) {
for (PerformDetail performDetail : performInfo.getPerformInfo()) {
if (CollectionUtils.isNotEmpty(performDetail.getSeatPlans())) {
List<Long> seatPlanIds = performDetail.getSeatPlans().stream().map(SeatPlan::getSeatPlanId).toList();
for (SeatPlan seatPlan : performDetail.getSeatPlans()) {
FPerformSeatInfo fPerformSeatInfo = new FPerformSeatInfo();
fPerformSeatInfo.setSeatPlanId(seatPlan.getSeatPlanId());

View File

@@ -1,21 +1,20 @@
package com.xiang.xservice.fwd.server;
import com.xiang.xservice.basic.common.resp.Result;
import com.xiang.xservice.fwd.entity.req.ProjectOrderCreateReq;
import com.xiang.xservice.fwd.entity.resp.http.perform.Perform;
import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectOrderCreateResp;
import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectsResp;
import com.xiang.xservice.fwd.entity.resp.http.perform.SeatPlanStatus;
import com.xiang.xservice.fwd.service.IPerformService;
import com.xiang.xservice.fwd.service.IPerformServiceHttp;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
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.RestController;
import javax.validation.Valid;
import java.util.Objects;
import java.util.List;
/**
* @Author: xiang
@@ -27,6 +26,7 @@ import java.util.Objects;
public class FwdOuterController {
private final IPerformServiceHttp performServiceHttp;
private final IPerformService performService;
@GetMapping("/getShowProjects")
public Result<ProjectsResp> getShowProjects() {
@@ -47,16 +47,17 @@ public class FwdOuterController {
}
@PostMapping("/createOrder")
public Result<ProjectOrderCreateResp> createOrder(@RequestBody @Valid ProjectOrderCreateReq req) {
req.setDeliveryType(1);
req.setBlackBox("0");
req.setContactName("朱吉祥");
req.setContactPhone("15858717571");
ProjectOrderCreateResp projectOrder = performServiceHttp.createProjectOrder(req);
if (Objects.nonNull(projectOrder)) {
return Result.success("下单成功!", projectOrder);
public Result<Void> createOrder(Long projectId) throws Exception {
if (performService.createProjectOrder(projectId)) {
return Result.success("下单成功!");
}
return Result.success("下单失败", null);
return Result.error("下单失败!");
}
@GetMapping("/getSeatPlanStatus")
public Result<SeatPlanStatus> getSeatPlanStatu (@RequestParam List<Long> ids) {
List<SeatPlanStatus> seatPlanStatusFromHttp = performServiceHttp.getSeatPlanStatusFromHttp(ids);
return Result.success("查询成功!", seatPlanStatusFromHttp);
}
}

View File

@@ -0,0 +1,19 @@
package com.xiang.xservice.fwd.service;
import com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo;
import com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo;
import java.util.List;
/**
* @Author: xiang
* @Date: 2025-07-25 15:15
*/
public interface IPerformService {
FPerformProjectInfo getPerformByProjectId(Long projectId);
List<FPerformSeatInfo> getPerformSeatInfoByProjectId(Long projectId);
Boolean createProjectOrder(Long projectId) throws Exception;
}

View File

@@ -5,6 +5,9 @@ import com.xiang.xservice.fwd.entity.resp.http.perform.Perform;
import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectInfoResp;
import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectOrderCreateResp;
import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectsResp;
import com.xiang.xservice.fwd.entity.resp.http.perform.SeatPlanStatus;
import java.util.List;
public interface IPerformServiceHttp {
@@ -34,4 +37,13 @@ public interface IPerformServiceHttp {
* @return
*/
Perform getPerformsByProjectIdFromHttp(Long projectId);
/**
* http请求获取座位状态信息
* @param seatPlanIds
* @return
*/
List<SeatPlanStatus> getSeatPlanStatusFromHttp(List<Long> seatPlanIds);
}

View File

@@ -2,8 +2,10 @@ package com.xiang.xservice.fwd.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.xiang.xservice.basic.utils.HttpUtils;
import com.xiang.xservice.basic.utils.JsonUtils;
import com.xiang.xservice.fwd.constants.CodeConstants;
import com.xiang.xservice.fwd.constants.UrlConstants;
import com.xiang.xservice.fwd.entity.req.ProjectOrderCreateReq;
@@ -11,12 +13,15 @@ import com.xiang.xservice.fwd.entity.resp.http.perform.Perform;
import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectInfoResp;
import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectOrderCreateResp;
import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectsResp;
import com.xiang.xservice.fwd.entity.resp.http.perform.SeatPlanStatus;
import com.xiang.xservice.fwd.service.IPerformServiceHttp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -73,7 +78,7 @@ public class PerformServiceHttpServiceImpl implements IPerformServiceHttp {
@Override
public ProjectOrderCreateResp createProjectOrder(ProjectOrderCreateReq req) {
String respStr = HttpUtils.doPost(UrlConstants.PROJECT_ORDER_CREATE_URL, buildFWDHeaders(UrlConstants.token), JSON.toJSONString(req));
String respStr = HttpUtils.doPost(UrlConstants.PROJECT_ORDER_CREATE_URL, buildFWDHeaders(UrlConstants.token), JsonUtils.toJsonString(req));
if (StringUtils.isBlank(respStr)) {
return null;
}
@@ -111,6 +116,31 @@ public class PerformServiceHttpServiceImpl implements IPerformServiceHttp {
return new Perform();
}
@Override
public List<SeatPlanStatus> getSeatPlanStatusFromHttp(List<Long> seatPlanIds) {
StringBuilder seatIds = new StringBuilder();
for (Long seatPlanId : seatPlanIds) {
seatIds.append(seatPlanId).append(",");
}
Map<String, String> params = Maps.newHashMap();
params.put("seatPlanIds", seatIds.substring(0, seatIds.length() - 2));
params.put("type", "3");
String respStr = HttpUtils.doGet(UrlConstants.PROJECT_SEAT_STATUS_URL, buildFWDHeaders(UrlConstants.token), params);
if (StringUtils.isBlank(respStr)) {
return Lists.newArrayList();
}
log.info("【Http请求】 根据seatPlanIds:{}http请求查询演出座位信息结果:{}", seatPlanIds, respStr);
JSONObject resp = JSON.parseObject(respStr);
Integer code = (Integer) resp.get("code");
if (Objects.nonNull(code) && Objects.equals(code, CodeConstants.SUCCESS)) {
List<SeatPlanStatus> data = JSON.parseArray(resp.get("data").toString(), SeatPlanStatus.class);
if (CollectionUtils.isEmpty(data)) {
return Lists.newArrayList();
}
return data;
}
return Lists.newArrayList();
}
private Map<String, String> buildFWDHeaders(String token) {
Map<String, String> headers = Maps.newHashMap();

View File

@@ -0,0 +1,89 @@
package com.xiang.xservice.fwd.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService;
import com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo;
import com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo;
import com.xiang.xservice.fwd.entity.req.ProjectOrderCreateReq;
import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectOrderCreateResp;
import com.xiang.xservice.fwd.mapper.FwdPerformProjectInfoMapper;
import com.xiang.xservice.fwd.mapper.FwdPerformSeatInfoMapper;
import com.xiang.xservice.fwd.service.IPerformService;
import com.xiang.xservice.fwd.service.IPerformServiceHttp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
/**
* @Author: xiang
* @Date: 2025-07-25 15:16
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class PerformServiceImpl implements IPerformService {
private final FwdPerformSeatInfoMapper fwdPerformSeatInfoMapper;
private final FwdPerformProjectInfoMapper fwdPerformProjectInfoMapper;
private final IPerformServiceHttp performServiceHttp;
private final DingTalkService dingTalkService;
@Value("${DingTalk.chatId}")
private String chatId;
// private static final List<Long> FREQUENT_IDS = List.of(50438548L, 35320661L, 50436621L, 50442739L);
private static final List<Long> FREQUENT_IDS = List.of(50438548L, 35320661L);
@Override
public FPerformProjectInfo getPerformByProjectId(Long projectId) {
return fwdPerformProjectInfoMapper.getProjectByProjectId(projectId);
}
@Override
public List<FPerformSeatInfo> getPerformSeatInfoByProjectId(Long projectId) {
return fwdPerformSeatInfoMapper.getPerformSeatByProjectId(projectId);
}
@Override
public Boolean createProjectOrder(Long projectId) throws Exception {
FPerformProjectInfo performByProjectId = getPerformByProjectId(projectId);
if (Objects.isNull(performByProjectId)) {
log.info("该projectId:{}暂无演出信息", projectId);
return Boolean.FALSE;
}
List<FPerformSeatInfo> seatInfoByProjectId = getPerformSeatInfoByProjectId(projectId);
if (CollectionUtils.isEmpty(seatInfoByProjectId)) {
log.info("该projectId:{}暂无座位信息", projectId);
return Boolean.FALSE;
}
for (FPerformSeatInfo fPerformSeatInfo : seatInfoByProjectId) {
ProjectOrderCreateReq projectOrderCreateReq = new ProjectOrderCreateReq();
projectOrderCreateReq.setDeliveryType(1);
projectOrderCreateReq.setContactName("朱吉祥");
projectOrderCreateReq.setContactPhone("15858717571");
projectOrderCreateReq.setPayment(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(FREQUENT_IDS.size())).setScale(2));
projectOrderCreateReq.setTotalPrice(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(FREQUENT_IDS.size())).setScale(2, BigDecimal.ROUND_HALF_UP));
projectOrderCreateReq.setPerformId(fPerformSeatInfo.getPerformId());
projectOrderCreateReq.setProjectId(projectId.toString());
projectOrderCreateReq.setPrivilegeCodeList(new ArrayList<>());
projectOrderCreateReq.setAudienceCount(FREQUENT_IDS.size());
projectOrderCreateReq.setFrequentIds(FREQUENT_IDS);
projectOrderCreateReq.setSeatPlanIds(Collections.singletonList(fPerformSeatInfo.getSeatPlanId()));
projectOrderCreateReq.setBlackBox("0");
projectOrderCreateReq.setCombineTicketVos(null);
projectOrderCreateReq.setOrdinaryTicketVos(null);
ProjectOrderCreateResp projectOrder = performServiceHttp.createProjectOrder(projectOrderCreateReq);
if (Objects.nonNull(projectOrder)) {
log.info("下单成功,订单信息:{}", JSONObject.toJSONString(projectOrder));
dingTalkService.sendChatMessage(chatId, "订单编号:" + projectOrder.getOrderNo() + "下单成功!!!,请在两分钟之内付款");
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
}

View File

@@ -28,6 +28,7 @@
<result column="available_all_ticket_quantity" property="availableAllTicketQuantity" />
<result column="sale_time" property="saleTime" />
<result column="project_id" property="projectId" />
<result column="sold_out" property="soldOut"/>
</resultMap>
<sql id="Base_Column_List">
@@ -53,7 +54,8 @@
available_ticket_quantity,
available_all_ticket_quantity,
sale_time,
project_id
project_id,
sold_out
</sql>
<insert id="insert" useGeneratedKeys="true" keyColumn="id" keyProperty="id" parameterType="com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo">
@@ -126,7 +128,10 @@
sale_time,
</if>
<if test="null != projectId ">
project_id
project_id,
</if>
<if test="null != soldOut ">
sold_out
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -197,7 +202,10 @@
#{saleTime},
</if>
<if test="null != projectId ">
#{projectId}
#{projectId},
</if>
<if test="null != soldOut ">
#{soldOut},
</if>
</trim>
</insert>
@@ -209,7 +217,7 @@
status, max_sell_stock, sold_stock, left_stock, able_sale_quantity,
ash_show, ash_show_desc, selectable, display,
available_ticket_quantity, available_all_ticket_quantity,
sale_time, project_id
sale_time, project_id, sold_out
)
VALUES
<foreach collection="list" item="item" separator=",">
@@ -219,7 +227,7 @@
#{item.status}, #{item.maxSellStock}, #{item.soldStock}, #{item.leftStock}, #{item.ableSaleQuantity},
#{item.ashShow}, #{item.ashShowDesc}, #{item.selectable}, #{item.display},
#{item.availableTicketQuantity}, #{item.availableAllTicketQuantity},
#{item.saleTime}, #{item.projectId}
#{item.saleTime}, #{item.projectId}, #{item.soldOut}
)
</foreach>
@@ -251,7 +259,8 @@
<if test="null != availableTicketQuantity ">available_ticket_quantity = #{availableTicketQuantity},</if>
<if test="null != availableAllTicketQuantity ">available_all_ticket_quantity = #{availableAllTicketQuantity},</if>
<if test="null != saleTime ">sale_time = #{saleTime},</if>
<if test="null != projectId ">project_id = #{projectId}</if>
<if test="null != projectId ">project_id = #{projectId},</if>
<if test="null != soldOut">sold_out = #{soldOut}</if>
</set>
WHERE id = #{id}
</update>
@@ -269,5 +278,10 @@
from fwd_perform_seat_info
where seat_plan_id = #{seatId} and perform_id = #{performId} and project_id = #{projectId}
</select>
<select id="getPerformSeatByProjectId" resultType="com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo">
select <include refid="Base_Column_List"/>
from fwd_perform_seat_info
where project_id = #{projectId}
</select>
</mapper>