From 044ab25c2a92dca3d239925b341b1cda33c1de10 Mon Sep 17 00:00:00 2001 From: Zhujx Date: Fri, 25 Jul 2025 16:21:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=9F=A5=E8=AF=A2=E5=BA=A7=E4=BD=8D?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/pom.xml | 2 +- .../xservice/fwd/constants/UrlConstants.java | 5 ++ .../fwd/entity/pojo/FPerformSeatInfo.java | 6 ++ .../fwd/entity/req/ProjectOrderCreateReq.java | 2 +- .../resp/http/perform/SeatPlanStatus.java | 20 +++++ .../fwd/mapper/FwdPerformSeatInfoMapper.java | 2 + .../fwd/schedule/PullDataFromFWDJob.java | 2 + .../fwd/server/FwdOuterController.java | 29 +++--- .../xservice/fwd/service/IPerformService.java | 19 ++++ .../fwd/service/IPerformServiceHttp.java | 12 +++ .../impl/PerformServiceHttpServiceImpl.java | 32 ++++++- .../fwd/service/impl/PerformServiceImpl.java | 89 +++++++++++++++++++ .../fwd/FwdPerformProjectSeatInfoMapper.xml | 26 ++++-- 13 files changed, 223 insertions(+), 23 deletions(-) create mode 100644 script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/SeatPlanStatus.java create mode 100644 script/src/main/java/com/xiang/xservice/fwd/service/IPerformService.java create mode 100644 script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceImpl.java diff --git a/script/pom.xml b/script/pom.xml index 9d1de9c..a67ab6b 100644 --- a/script/pom.xml +++ b/script/pom.xml @@ -16,7 +16,7 @@ script - 1.8 + 17 UTF-8 diff --git a/script/src/main/java/com/xiang/xservice/fwd/constants/UrlConstants.java b/script/src/main/java/com/xiang/xservice/fwd/constants/UrlConstants.java index 66fbf29..8a91e17 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/constants/UrlConstants.java +++ b/script/src/main/java/com/xiang/xservice/fwd/constants/UrlConstants.java @@ -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"; } diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FPerformSeatInfo.java b/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FPerformSeatInfo.java index 6c72f2b..5a9a0f2 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FPerformSeatInfo.java +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FPerformSeatInfo.java @@ -134,4 +134,10 @@ public class FPerformSeatInfo implements Serializable { * 演出id(总) */ private Long projectId; + + /** + * 是否售罄 + * 0:否 1:是 + */ + private Integer soldOut; } diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/req/ProjectOrderCreateReq.java b/script/src/main/java/com/xiang/xservice/fwd/entity/req/ProjectOrderCreateReq.java index 05b95c2..22fd97e 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/entity/req/ProjectOrderCreateReq.java +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/req/ProjectOrderCreateReq.java @@ -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; diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/SeatPlanStatus.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/SeatPlanStatus.java new file mode 100644 index 0000000..8a84210 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/SeatPlanStatus.java @@ -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; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdPerformSeatInfoMapper.java b/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdPerformSeatInfoMapper.java index 6013485..d784cd0 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdPerformSeatInfoMapper.java +++ b/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdPerformSeatInfoMapper.java @@ -22,4 +22,6 @@ public interface FwdPerformSeatInfoMapper { FPerformSeatInfo getPerformSeatInfoBySeatIdAndPerformIdAndProjectId( @Param("seatId") Long seatId, @Param("performId") Long performId, @Param("projectId") Long projectId); + + List getPerformSeatByProjectId(Long projectId); } diff --git a/script/src/main/java/com/xiang/xservice/fwd/schedule/PullDataFromFWDJob.java b/script/src/main/java/com/xiang/xservice/fwd/schedule/PullDataFromFWDJob.java index 31c2b82..272807a 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/schedule/PullDataFromFWDJob.java +++ b/script/src/main/java/com/xiang/xservice/fwd/schedule/PullDataFromFWDJob.java @@ -106,6 +106,8 @@ public class PullDataFromFWDJob { if (CollectionUtils.isNotEmpty(performInfo.getPerformInfo())) { for (PerformDetail performDetail : performInfo.getPerformInfo()) { if (CollectionUtils.isNotEmpty(performDetail.getSeatPlans())) { + List seatPlanIds = performDetail.getSeatPlans().stream().map(SeatPlan::getSeatPlanId).toList(); + for (SeatPlan seatPlan : performDetail.getSeatPlans()) { FPerformSeatInfo fPerformSeatInfo = new FPerformSeatInfo(); fPerformSeatInfo.setSeatPlanId(seatPlan.getSeatPlanId()); diff --git a/script/src/main/java/com/xiang/xservice/fwd/server/FwdOuterController.java b/script/src/main/java/com/xiang/xservice/fwd/server/FwdOuterController.java index 3dbe3ac..828e3c0 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/server/FwdOuterController.java +++ b/script/src/main/java/com/xiang/xservice/fwd/server/FwdOuterController.java @@ -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 getShowProjects() { @@ -47,16 +47,17 @@ public class FwdOuterController { } @PostMapping("/createOrder") - public Result 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 createOrder(Long projectId) throws Exception { + if (performService.createProjectOrder(projectId)) { + return Result.success("下单成功!"); } - return Result.success("下单失败!", null); + return Result.error("下单失败!"); + } + + @GetMapping("/getSeatPlanStatus") + public Result getSeatPlanStatu (@RequestParam List ids) { + List seatPlanStatusFromHttp = performServiceHttp.getSeatPlanStatusFromHttp(ids); + return Result.success("查询成功!", seatPlanStatusFromHttp); } } diff --git a/script/src/main/java/com/xiang/xservice/fwd/service/IPerformService.java b/script/src/main/java/com/xiang/xservice/fwd/service/IPerformService.java new file mode 100644 index 0000000..0453b7c --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/service/IPerformService.java @@ -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 getPerformSeatInfoByProjectId(Long projectId); + + Boolean createProjectOrder(Long projectId) throws Exception; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/service/IPerformServiceHttp.java b/script/src/main/java/com/xiang/xservice/fwd/service/IPerformServiceHttp.java index a70ad2e..f292f92 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/service/IPerformServiceHttp.java +++ b/script/src/main/java/com/xiang/xservice/fwd/service/IPerformServiceHttp.java @@ -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 getSeatPlanStatusFromHttp(List seatPlanIds); + + } diff --git a/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceHttpServiceImpl.java b/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceHttpServiceImpl.java index 68fe3ac..0f3d895 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceHttpServiceImpl.java +++ b/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceHttpServiceImpl.java @@ -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 getSeatPlanStatusFromHttp(List seatPlanIds) { + StringBuilder seatIds = new StringBuilder(); + for (Long seatPlanId : seatPlanIds) { + seatIds.append(seatPlanId).append(","); + } + Map 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 data = JSON.parseArray(resp.get("data").toString(), SeatPlanStatus.class); + if (CollectionUtils.isEmpty(data)) { + return Lists.newArrayList(); + } + return data; + } + return Lists.newArrayList(); + } private Map buildFWDHeaders(String token) { Map headers = Maps.newHashMap(); diff --git a/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceImpl.java b/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceImpl.java new file mode 100644 index 0000000..0df6fc7 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceImpl.java @@ -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 FREQUENT_IDS = List.of(50438548L, 35320661L, 50436621L, 50442739L); + private static final List FREQUENT_IDS = List.of(50438548L, 35320661L); + @Override + public FPerformProjectInfo getPerformByProjectId(Long projectId) { + return fwdPerformProjectInfoMapper.getProjectByProjectId(projectId); + } + + @Override + public List 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 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; + } +} diff --git a/script/src/main/resources/mapper/fwd/FwdPerformProjectSeatInfoMapper.xml b/script/src/main/resources/mapper/fwd/FwdPerformProjectSeatInfoMapper.xml index 4c55f39..3015f1d 100644 --- a/script/src/main/resources/mapper/fwd/FwdPerformProjectSeatInfoMapper.xml +++ b/script/src/main/resources/mapper/fwd/FwdPerformProjectSeatInfoMapper.xml @@ -28,6 +28,7 @@ + @@ -53,7 +54,8 @@ available_ticket_quantity, available_all_ticket_quantity, sale_time, - project_id + project_id, + sold_out @@ -126,7 +128,10 @@ sale_time, - project_id + project_id, + + + sold_out @@ -197,7 +202,10 @@ #{saleTime}, - #{projectId} + #{projectId}, + + + #{soldOut}, @@ -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 @@ -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} ) @@ -251,7 +259,8 @@ available_ticket_quantity = #{availableTicketQuantity}, available_all_ticket_quantity = #{availableAllTicketQuantity}, sale_time = #{saleTime}, - project_id = #{projectId} + project_id = #{projectId}, + sold_out = #{soldOut} WHERE id = #{id} @@ -269,5 +278,10 @@ from fwd_perform_seat_info where seat_plan_id = #{seatId} and perform_id = #{performId} and project_id = #{projectId} + \ No newline at end of file