diff --git a/pom.xml b/pom.xml index 37732db..3b8e75f 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.xiang xservice-basic - 1.0-SNAPSHOT + 1.1 com.xiang @@ -30,68 +30,29 @@ com.xiang xservice-common - 1.0-snapshot + 1.2 com.xiang - xservice-third-part - 1.0-snapshot - - diff --git a/script/pom.xml b/script/pom.xml index 9d1de9c..88fb10f 100644 --- a/script/pom.xml +++ b/script/pom.xml @@ -11,12 +11,12 @@ com.xiang - 1.0-SNAPSHOT + 1.0 jar script - 1.8 + 17 UTF-8 diff --git a/script/src/main/java/com/xiang/ServiceScriptApplication.java b/script/src/main/java/com/xiang/ServiceScriptApplication.java index 835c988..5791f5c 100644 --- a/script/src/main/java/com/xiang/ServiceScriptApplication.java +++ b/script/src/main/java/com/xiang/ServiceScriptApplication.java @@ -1,7 +1,9 @@ package com.xiang; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.ConfigurationPropertiesScan; import org.springframework.scheduling.annotation.EnableScheduling; /** @@ -10,6 +12,14 @@ import org.springframework.scheduling.annotation.EnableScheduling; */ @SpringBootApplication @EnableScheduling +@MapperScan(basePackages = { + "com.xiang.xservice.fwd.mapper", + "com.xiang.xservice.glados.repository", + "com.xiang.xservice.xb.repository" +}) +@ConfigurationPropertiesScan(basePackages = { + "com.xiang.xservice.config" +}) public class ServiceScriptApplication { public static void main(String[] args) { SpringApplication.run(ServiceScriptApplication.class, args); diff --git a/script/src/main/java/com/xiang/xservice/IndexController.java b/script/src/main/java/com/xiang/xservice/IndexController.java index 482378a..a2bbe3d 100644 --- a/script/src/main/java/com/xiang/xservice/IndexController.java +++ b/script/src/main/java/com/xiang/xservice/IndexController.java @@ -1,7 +1,9 @@ package com.xiang.xservice; import com.xiang.xservice.basic.common.resp.Result; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -12,8 +14,11 @@ import org.springframework.web.bind.annotation.RestController; */ @RestController @RequestMapping("/system/demo") +@RequiredArgsConstructor public class IndexController { + private final RedisTemplate redisTemplate; + @Value("${spring.profiles.active}") private String env; @@ -28,4 +33,11 @@ public class IndexController { String msg = "已激活环境:" + env + ",web端口启用:" + port + "使用datasource:" + url; return Result.success(msg); } + + @GetMapping("/redisTest") + private Result redisTest() { + redisTemplate.opsForValue().set("2222", "231"); + + return Result.success("redis获取到key为test的值为:" + redisTemplate.opsForValue().get("2222")); + } } diff --git a/script/src/main/java/com/xiang/xservice/config/DingTalkRobotScriptConfig.java b/script/src/main/java/com/xiang/xservice/config/DingTalkRobotScriptConfig.java new file mode 100644 index 0000000..8e6d91a --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/config/DingTalkRobotScriptConfig.java @@ -0,0 +1,22 @@ +package com.xiang.xservice.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-08-07 10:46 + */ +@Getter +@Setter +@ConfigurationProperties(prefix = "dingtalk.robot.script") +public class DingTalkRobotScriptConfig { + + private String token; + private String secret; + private List users; + +} diff --git a/script/src/main/java/com/xiang/xservice/config/DingTalkRobotXbConfig.java b/script/src/main/java/com/xiang/xservice/config/DingTalkRobotXbConfig.java new file mode 100644 index 0000000..979ba8a --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/config/DingTalkRobotXbConfig.java @@ -0,0 +1,22 @@ +package com.xiang.xservice.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-08-07 10:46 + */ +@Getter +@Setter +@ConfigurationProperties(prefix = "dingtalk.robot.xb") +public class DingTalkRobotXbConfig { + + private String token; + private String secret; + private List users; + +} diff --git a/script/src/main/java/com/xiang/xservice/domain/service/DingTalkScriptDomainService.java b/script/src/main/java/com/xiang/xservice/domain/service/DingTalkScriptDomainService.java new file mode 100644 index 0000000..8acc72f --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/domain/service/DingTalkScriptDomainService.java @@ -0,0 +1,33 @@ +package com.xiang.xservice.domain.service; + +import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService; +import com.xiang.xservice.config.DingTalkRobotScriptConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @Author: xiang + * @Date: 2025-08-07 10:30 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class DingTalkScriptDomainService { + + private final DingTalkService dingTalkService; + private final DingTalkRobotScriptConfig dingTalkRobotScriptConfig; + + /** + * 发送脚本消息 + * @param msg 消息 + */ + public void sendScriptMsg(String msg) { + try { + dingTalkService.sendRobotMessage(dingTalkRobotScriptConfig.getSecret(), dingTalkRobotScriptConfig.getToken(), + dingTalkRobotScriptConfig.getUsers(), msg); + } catch (Exception e) { + log.error("信息发送异常, 信息:{}", msg, e); + } + } +} diff --git a/script/src/main/java/com/xiang/xservice/domain/service/IDomainServiceImpl.java b/script/src/main/java/com/xiang/xservice/domain/service/IDomainServiceImpl.java index 92e2cdd..7376c7f 100644 --- a/script/src/main/java/com/xiang/xservice/domain/service/IDomainServiceImpl.java +++ b/script/src/main/java/com/xiang/xservice/domain/service/IDomainServiceImpl.java @@ -8,11 +8,9 @@ import com.aliyun.alidns20150109.models.DescribeSubDomainRecordsResponse; import com.aliyun.alidns20150109.models.DescribeSubDomainRecordsResponseBody; import com.aliyun.alidns20150109.models.UpdateDomainRecordRequest; import com.aliyun.teaopenapi.models.Config; -import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService; import com.xiang.xservice.domain.config.AliyunDnsPropertyConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.List; @@ -38,10 +36,7 @@ public class IDomainServiceImpl implements IDomainService { private final AliyunDnsPropertyConfig aliyunDnsPropertyConfig; private static final String TYPE = "A"; - private final DingTalkService dingTalkService; - @Value("${DingTalk.chatId}") - private String chatId; - + private final DingTalkScriptDomainService dingTalkService; @Override public void dynamicDomainAnalysis(String publicIp) throws Exception { Client client = createClient(); @@ -58,14 +53,14 @@ public class IDomainServiceImpl implements IDomainService { if (records.isEmpty()) { log.info("未找到记录,添加记录..., ip:{}", publicIp); addDnsRecord(client, publicIp, rr); - dingTalkService.sendChatMessage(chatId, "动态解析公网ip成功,域名:" + rr + "." + DOMAIN_NAME + ", 新ip:" + publicIp); + dingTalkService.sendScriptMsg("动态解析公网ip成功,域名:" + rr + "." + DOMAIN_NAME + ", 新ip:" + publicIp); } else { String recordId = records.get(0).getRecordId(); String currentValue = records.get(0).getValue(); if (!publicIp.equals(currentValue)) { log.info("IP变更,更新记录...,ip:{}", publicIp); updateDnsRecord(client, recordId, publicIp, rr); - dingTalkService.sendChatMessage(chatId, "动态解析公网ip成功,域名:" + rr + "." + DOMAIN_NAME + ", 新ip:" + publicIp); + dingTalkService.sendScriptMsg("动态解析公网ip成功,域名:" + rr + "." + DOMAIN_NAME + ", 新ip:" + publicIp); } else { log.info("ip未变更,无需修改,ip:{}", publicIp); } diff --git a/script/src/main/java/com/xiang/xservice/fwd/constants/CodeConstants.java b/script/src/main/java/com/xiang/xservice/fwd/constants/CodeConstants.java new file mode 100644 index 0000000..39c160b --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/constants/CodeConstants.java @@ -0,0 +1,6 @@ +package com.xiang.xservice.fwd.constants; + +public class CodeConstants { + public static final Integer SUCCESS = 10000; + public static final Integer LIMIT = 47009; +} 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 new file mode 100644 index 0000000..c3af89a --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/constants/UrlConstants.java @@ -0,0 +1,40 @@ +package com.xiang.xservice.fwd.constants; + +public class UrlConstants { + + public static final String token = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJjdCI6MTc1MjYzODAwNTUxNywic3ViIjoiTDIxMTQzMjU2NDEiLCJhdWQiOiJMSVZFTEFCIiwiaXNzIjoiVElDS0VUIiwibWlkIjoxNzU4ODA4NTcxMzgzNjcxNTUzLCJ0eXBlIjoiYXBwbGV0IiwiaWF0IjoxNzUyNjM4MDA1LCJkaWQiOiI2RTRDMDQ5RS00RkFBLTQ0NDMtQjI3NC1DNjRBMjZEMUFGNTkiLCJrZXkiOiJMSVZFTEFCIn0.iw1u3LyCYlxYCI1gMwTeuJlPdv-rQKCVlO2ySF_UrJ-lrEH6fm5lGo4wGalLn1qGkyqZaxuTx1K6X7Oy7sHgBA"; + + /** + * 芬玩岛的基础URL + */ + public final static String BASE_URL = "https://api.livelab.com.cn"; + + /** + * 全部演出列表URL + */ + public final static String PROJECTS_URL = BASE_URL + "/appShow/app/homepage/projects"; + + /** + * 查询演出详情URL + */ + public final static String PROJECTS_INFO_URL = BASE_URL + "/performance/app/project/get_project_info"; + + /** + * 查询演出具体票务信息 + */ + public final static String PERFORMS_URL = BASE_URL + "/performance/app/project/get_performs"; + /** + * 创建订单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"; + + /** + * 查询观影人列表 + */ + public final static String PROJECT_AUDIENCE_MEMBER_INFO = BASE_URL + "/member/member/bearer/app/list"; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/param/FwdOrderTaskParam.java b/script/src/main/java/com/xiang/xservice/fwd/entity/param/FwdOrderTaskParam.java new file mode 100644 index 0000000..cfaee02 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/param/FwdOrderTaskParam.java @@ -0,0 +1,13 @@ +package com.xiang.xservice.fwd.entity.param; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FwdOrderTaskParam { + private Long projectId; + private Long taskId; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FAudienceConfig.java b/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FAudienceConfig.java new file mode 100644 index 0000000..164e480 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FAudienceConfig.java @@ -0,0 +1,19 @@ +package com.xiang.xservice.fwd.entity.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FAudienceConfig { + private Long id; + private Integer status; + private Long frequentId; + private String frequentName; + private String frequentNo; + private String frequentPhone; + private Integer delFlag; + private Long userId; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FPerformConfig.java b/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FPerformConfig.java new file mode 100644 index 0000000..ebfe9e5 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FPerformConfig.java @@ -0,0 +1,17 @@ +package com.xiang.xservice.fwd.entity.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FPerformConfig { + private Long id; + private Long projectId; + private LocalDateTime time; + private Integer delFlag; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FPerformProjectInfo.java b/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FPerformProjectInfo.java new file mode 100644 index 0000000..a8ee3f2 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FPerformProjectInfo.java @@ -0,0 +1,57 @@ +package com.xiang.xservice.fwd.entity.pojo; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FPerformProjectInfo { + private Long id; + + private String projectName; + + private String nameDisplay; + + private Integer status; + + private String projectSource; + + private Integer isHasSeat; + + private Integer isChoiceSeat; + + private Long bizId; + + private Long projectId; + + private String tagName; + + private String tagRemark; + + private String projectCity; + + private String shortCity; + + private String venueName; + + private BigDecimal lowestPrice; + + private BigDecimal highestPrice; + + private BigDecimal projectPrice; + + private LocalDate projectStartDate; + + private LocalDate projectEndDate; + + private String subClassifyName; + + private LocalDateTime preSaleTime; +} 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 new file mode 100644 index 0000000..ed8eaf1 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FPerformSeatInfo.java @@ -0,0 +1,143 @@ +package com.xiang.xservice.fwd.entity.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @Author: xiang + * @Date: 2025-07-25 10:36 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FPerformSeatInfo implements Serializable { + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 座位计划id + */ + private Long seatPlanId; + + /** + * 座位计划名称 + */ + private String seatPlanName; + + /** + * 演出id + */ + private Long performId; + + /** + * 演出名称 + */ + private String performName; + + /** + * 停止销售 + */ + private Integer stopSale; + + /** + * shelf_status + */ + private Integer shelfStatus; + + /** + * 价格 + */ + private BigDecimal price; + + /** + * 折扣价 + */ + private BigDecimal discountPrice; + + /** + * sub_status + */ + private Integer subStatus; + + /** + * quantity + */ + private Integer quantity; + + /** + * status + */ + private Integer status; + + /** + * max_sell_stock + */ + private Integer maxSellStock; + + /** + * sold_stock + */ + private Integer soldStock; + + /** + * left_stock + */ + private Integer leftStock; + + /** + * able_sale_quantity + */ + private Integer ableSaleQuantity; + + /** + * ash_show + */ + private Integer ashShow; + + /** + * ash_show_desc + */ + private String ashShowDesc; + + /** + * selectable + */ + private Integer selectable; + + /** + * display + */ + private Integer display; + + /** + * available_ticket_quantity + */ + private Integer availableTicketQuantity; + + /** + * available_all_ticket_quantity + */ + private Integer availableAllTicketQuantity; + + /** + * sale_time + */ + private LocalDateTime saleTime; + + /** + * 演出id(总) + */ + private Long projectId; + + /** + * 是否售罄 + * 0:否 1:是 + */ + private Integer soldOut; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FUserConfig.java b/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FUserConfig.java new file mode 100644 index 0000000..d3d2d8c --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/pojo/FUserConfig.java @@ -0,0 +1,15 @@ +package com.xiang.xservice.fwd.entity.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FUserConfig { + private Long id; + private String name; + private String token; + private Integer status; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/req/PrivilegeCode.java b/script/src/main/java/com/xiang/xservice/fwd/entity/req/PrivilegeCode.java new file mode 100644 index 0000000..074a2c0 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/req/PrivilegeCode.java @@ -0,0 +1,12 @@ +package com.xiang.xservice.fwd.entity.req; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.checkerframework.checker.units.qual.N; + +@Data +@AllArgsConstructor +public class PrivilegeCode { + +} 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 new file mode 100644 index 0000000..22fd97e --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/req/ProjectOrderCreateReq.java @@ -0,0 +1,28 @@ +package com.xiang.xservice.fwd.entity.req; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ProjectOrderCreateReq { + private Integer deliveryType; + private String contactName; + private String contactPhone; + private BigDecimal payment; + private BigDecimal totalPrice; + private Long performId; + private String projectId; + private List privilegeCodeList; + private Integer audienceCount; + private List frequentIds; + private List seatPlanIds; + private String blackBox; + private String combineTicketVos; + private String ordinaryTicketVos; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/BaseResult.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/BaseResult.java new file mode 100644 index 0000000..04900da --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/BaseResult.java @@ -0,0 +1,18 @@ +package com.xiang.xservice.fwd.entity.resp; + +public class BaseResult { + /** + * 响应码 10000成功 + */ + private Long code; + + /** + * 消息 + */ + private String msg; + + /** + * 数据 + */ + private T data; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/audience/AudienceMemberInfo.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/audience/AudienceMemberInfo.java new file mode 100644 index 0000000..071f427 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/audience/AudienceMemberInfo.java @@ -0,0 +1,18 @@ +package com.xiang.xservice.fwd.entity.resp.http.audience; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AudienceMemberInfo { + private Long frequentContactsId; + private String name; + private String idTypeCode; + private String idType; + private String idTypeDesc; + private String idCard; + private String phone; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/DeductionRuleDTO.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/DeductionRuleDTO.java new file mode 100644 index 0000000..460ae8d --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/DeductionRuleDTO.java @@ -0,0 +1,18 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DeductionRuleDTO { + private BigDecimal commonRatio; + private BigDecimal commonMinUnit; + private BigDecimal commonThreshold; + private List specialRefundBeanRuleDtoList; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Delivery.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Delivery.java new file mode 100644 index 0000000..6358c63 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Delivery.java @@ -0,0 +1,14 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Delivery { + private Integer deliveryType; + private String beforeDays; + private String address; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Notice.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Notice.java new file mode 100644 index 0000000..cfc3a44 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Notice.java @@ -0,0 +1,32 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Notice { + private String searchValue; + private String createBy; + private LocalDateTime createTime; + private String updateBy; + private LocalDateTime updateTime; + private String remark; + private List params; + private Long id; + private Long projectId; + private String name; + private Integer choose; + private String content; + private String tag; + private Integer type; + private Integer enhanced; + private String description; + private Integer sort; + private String delFlag; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Perform.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Perform.java new file mode 100644 index 0000000..4719973 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Perform.java @@ -0,0 +1,19 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Perform { + private Long projectId; + private Integer purchaseLimitationOnce; + private String limitationPrompt; + private Integer showDate; + private List dates; + private List performInfos; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/PerformDetail.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/PerformDetail.java new file mode 100644 index 0000000..b6197e7 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/PerformDetail.java @@ -0,0 +1,44 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PerformDetail { + private Long id; + private String name; + private Integer status; + private String beginTime; + private String endTime; + private String beginDate; + private String endDate; + private String validityPeriod; + private Integer includeSpecial; + private String specialDate; + private Integer isOneOrderOneCard; + private Integer isOneTicketOneCard; + private String cardType; + private Integer performType; + private List delivery; + private String isChoiceSeat; + private Integer ashShow; + private String ashShowDesc; + private Integer selectable; + private List tags; + private List tagsCustom; + private String subStatus; + private List seatPlans; + private String expressFeeStr; + private String saleTime; + private Integer allowAppointment; + private Integer enableNoTicketLabel; + private String standbyChannel; + private Integer sort; + private String openLabel; + private String label; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/PerformInfo.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/PerformInfo.java new file mode 100644 index 0000000..384df72 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/PerformInfo.java @@ -0,0 +1,15 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PerformInfo { + private String dateStr; + private List performInfo; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectInfoResp.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectInfoResp.java new file mode 100644 index 0000000..c35ddc4 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectInfoResp.java @@ -0,0 +1,67 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ProjectInfoResp { + private Long projectId; + private String projectName; + private String nameDisplay; + private Integer status; + private String projectSource; + private Integer isHasSeat; + private Integer isChoiceSeat; + private String poster; + private BigDecimal highPrice; + private BigDecimal lowPrice; + private String projectPrice; + private String projectStartDate; + private String projectEndDate; + private String timeDisplay; + private String projectCity; + private String subClassifyName; + private List projectServices; + private Integer showFlag; + private String preSaleTime; + private String saleStartTime; + private Long lastTime; + private Integer buttonStatus; + private String deliveryType; + private String details; + private VenueInfo venueInfo; + private List ticketNotices; + private List watchNotices; + private List standByNotices; + private String bkImg; + private Integer dialogFlag; + private String dialogTitle; + private String dialogContent; + private Integer isPrivilegeCode; + private Integer canBuyQuantity; + private String dialogButtonContent; + private List projectNoticeList; + private String dialogChangeTime; + private Integer dialogAlwayShow; + private Integer serviceSettingSwitch; + private String calendarRemindersTitle; + private String calendarRemindersContent; + private String dyProductId; + private Boolean showCalendar; + private Integer dyShelfStatus; + private String venueUnderlayUrl; + private String changeDialogContent; + private String licenseInfo; + private Integer isPreview; + private Boolean existGrabTicketActivity; + private Boolean existMoreTicketActivity; + private DeductionRuleDTO deductionRuleDto; + private RefundBeanRuleDTO refundBeanRuleDto; + private Boolean likesShowFlag; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectList.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectList.java new file mode 100644 index 0000000..8b33a7c --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectList.java @@ -0,0 +1,39 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 全部演出列表 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ProjectList { + private Long id; + + private String name; + + private Long bizId; + + private Long projectId; + + private String tagName; + + private String tagRemark; + + private String city; + + private String shortCity; + + private String venueName; + + private BigDecimal lowestPrice; + + private String projectPrice; + + private String dateRange; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectOrderCreateResp.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectOrderCreateResp.java new file mode 100644 index 0000000..851045f --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectOrderCreateResp.java @@ -0,0 +1,37 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ProjectOrderCreateResp { + private String orderNo; + private String totalPrice; + private Integer cancelTimestamp; + private List tickets; + private Integer deliveryType; + private String expressFee; + private BigDecimal price; + private String projectName; + private String poster; + private String projectCity; + private String performStartTime; + private String performEndTime; + private Integer performType; + private String venueName; + private String repeatBeardIds; + private Long projectId; + private Long performId; + private Long orderId; + private DeductionRuleDTO deductionRuleDto; + private RefundBeanRuleDTO refundBeanRuleDto; + private Integer refundBeanNum; + private Integer deductBeanNum; + private Integer sourceType; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectService.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectService.java new file mode 100644 index 0000000..b188d0b --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectService.java @@ -0,0 +1,18 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ProjectService { + private String title; + private Integer type; + private List description; + private List refundRuleList; + +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectsResp.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectsResp.java new file mode 100644 index 0000000..5978a66 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/ProjectsResp.java @@ -0,0 +1,45 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data@NoArgsConstructor +@AllArgsConstructor +public class ProjectsResp { + private Integer total; + + private List list; + + private Integer pageNum; + + private Integer pageSize; + + private Integer startRow; + + private Integer endRow; + + private Integer pages; + + private Integer prePage; + + private Integer nextPage; + + private Boolean isFirstPage; + + private Boolean isLastPage; + + private Boolean hasPreviousPage; + + private Boolean hasNextPage; + + private Integer navigatePages; + + private Integer navigatepageNums; + + private Integer navigateFirstPage; + + private Integer navigateLastPage; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/RefundBeanRuleDTO.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/RefundBeanRuleDTO.java new file mode 100644 index 0000000..0eaaf18 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/RefundBeanRuleDTO.java @@ -0,0 +1,16 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RefundBeanRuleDTO { + private BigDecimal commonRatio; + private List specialRefundBeanRuleDtoList; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/RefundRule.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/RefundRule.java new file mode 100644 index 0000000..650436a --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/RefundRule.java @@ -0,0 +1,18 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RefundRule { + private String performId; + private String performName; + private String performStartTime; + private List refundRules; + private String refundRuleUndeterminedStr; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/RefundRuleInfo.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/RefundRuleInfo.java new file mode 100644 index 0000000..f3d3c9a --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/RefundRuleInfo.java @@ -0,0 +1,17 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RefundRuleInfo { + private String entrances; + private String sourceTypes; + private String startTime; + private String endTime; + private String procedureFeeRatio; + private String expressFeeFlag; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/SeatPlan.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/SeatPlan.java new file mode 100644 index 0000000..4ab4c9b --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/SeatPlan.java @@ -0,0 +1,41 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SeatPlan { + private Long seatPlanId; + private String seatPlanName; + private Long performId; + private String performName; + private Integer stopSale; + private Integer type; + private Integer ableSell; + private Integer shelfStatus; + private BigDecimal price; + private BigDecimal discountPrice; + private Integer subStatus; + private Integer quantity; + private Integer status; + private Integer maxSellStock; + private Integer soldStock; + private Integer leftStock; + private Integer ableSaleQuantity; + private Integer ashShow; + private String ashShowDesc; + private Integer selectable; + private Integer display; + private List tags; + private List tagsCustom; + private Integer availableTicketQuantity; + private Integer availableAllTicketQuantity; + private BigDecimal standbyServiceFeeRate; + private String saleTime; +} 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..e0e7891 --- /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 Long seatPlanId; + private Long performId; + private Boolean soldOutFlag; + private Integer enableNoTicketLabel; + private Integer standbyStatus; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/StandByNotice.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/StandByNotice.java new file mode 100644 index 0000000..46a7e34 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/StandByNotice.java @@ -0,0 +1,4 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +public class StandByNotice { +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Tags.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Tags.java new file mode 100644 index 0000000..e2155c8 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Tags.java @@ -0,0 +1,18 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: xiang + * @Date: 2025-07-25 10:13 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Tags { + private int type; + + private String tag; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Ticket.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Ticket.java new file mode 100644 index 0000000..6cda740 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/Ticket.java @@ -0,0 +1,18 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Ticket { + private Integer seatPlanType; + private String seatPlanName; + private Integer seatPlanQuantity; + private BigDecimal seatPlanPrice; + private Long seatPlanId; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/TicketNotice.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/TicketNotice.java new file mode 100644 index 0000000..20bcd45 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/TicketNotice.java @@ -0,0 +1,32 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TicketNotice { + private String searchValue; + private String createBy; + private LocalDateTime createTime; + private String updateBy; + private LocalDateTime updateTime; + private String remark; + private List params; + private Long id; + private Long projectId; + private String name; + private Integer choose; + private String content; + private String tag; + private Integer type; + private Integer enhanced; + private String description; + private Integer sort; + private String delFlag; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/VenueInfo.java b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/VenueInfo.java new file mode 100644 index 0000000..e9f4501 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/entity/resp/http/perform/VenueInfo.java @@ -0,0 +1,39 @@ +package com.xiang.xservice.fwd.entity.resp.http.perform; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor + +public class VenueInfo { + private String searchValue; + private String createBy; + private LocalDateTime createTime; + private String updateBy; + private LocalDateTime updateTime; + private String remark; + private List params; + private Integer id; + private String name; + private String province; + private String city; + private String area; + private String address; + private String planeImage; + private String panoramicImage; + private String contactsName; + private String contactsPhone; + private Integer enable; + private String code; + private Integer delFlag; + private BigDecimal lng; + private BigDecimal lat; + private Integer externalId; +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdAudienceConfigMapper.java b/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdAudienceConfigMapper.java new file mode 100644 index 0000000..fc150da --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdAudienceConfigMapper.java @@ -0,0 +1,17 @@ +package com.xiang.xservice.fwd.mapper; + +import com.xiang.xservice.fwd.entity.pojo.FAudienceConfig; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Mapper +@Repository +public interface FwdAudienceConfigMapper { + + List getAudienceByUserId(Long userId); + + int batchSave(List list); + int delByUserId(Long userId); +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdPerformConfigMapper.java b/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdPerformConfigMapper.java new file mode 100644 index 0000000..4c1eed3 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdPerformConfigMapper.java @@ -0,0 +1,18 @@ +package com.xiang.xservice.fwd.mapper; + +import com.xiang.xservice.fwd.entity.pojo.FPerformConfig; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@Mapper +public interface FwdPerformConfigMapper { + + List getAvailablePerform(); + + int delPerforms(); + + int insertPerforms(List list); +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdPerformProjectInfoMapper.java b/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdPerformProjectInfoMapper.java new file mode 100644 index 0000000..22ea850 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdPerformProjectInfoMapper.java @@ -0,0 +1,25 @@ +package com.xiang.xservice.fwd.mapper; + +import com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-07-24 17:22 + */ +@Repository +@Mapper +public interface FwdPerformProjectInfoMapper { + FPerformProjectInfo getProjectByProjectId(Long projectId); + + int insert(FPerformProjectInfo fPerformProjectInfo); + + int update(FPerformProjectInfo fPerformProjectInfo); + + List getPreSaleTodayData(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); +} 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 new file mode 100644 index 0000000..dbd2b19 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdPerformSeatInfoMapper.java @@ -0,0 +1,29 @@ +package com.xiang.xservice.fwd.mapper; + +import com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-07-25 10:53 + */ +@Repository +@Mapper +public interface FwdPerformSeatInfoMapper { + int batchSave(List fPerformSeatInfos); + + int update(FPerformSeatInfo fPerformSeatInfo); + + List getPerformSeatInfoBySeatIds(@Param("list") List seatIds); + + FPerformSeatInfo getPerformSeatInfoBySeatIdAndPerformIdAndProjectId( + @Param("seatId") Long seatId, @Param("performId") Long performId, @Param("projectId") Long projectId); + + List getPerformSeatByProjectId(Long projectId); + + FPerformSeatInfo getBySeatPlanId(@Param("id") Long seatPlanId); +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdUserConfigMapper.java b/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdUserConfigMapper.java new file mode 100644 index 0000000..45b09e3 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/mapper/FwdUserConfigMapper.java @@ -0,0 +1,41 @@ +package com.xiang.xservice.fwd.mapper; + +import com.xiang.xservice.fwd.entity.pojo.FUserConfig; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@Mapper +public interface FwdUserConfigMapper { + + /** + * 查询可用配置用户 + * @return + */ + List getAvailableUser(); + + /** + * 根据用户名查询用户 + * @param name + * @return + */ + FUserConfig getUserByName(String name); + + /** + * 更新用户token + * @param name + * @param token + * @return + */ + int updateTokenByName(@Param("name") String name, @Param("token") String token); + + /** + * 新增用户token + * @param userConfig + * @return + */ + int insert(FUserConfig userConfig); +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/schedule/FwdImportantMsgJob.java b/script/src/main/java/com/xiang/xservice/fwd/schedule/FwdImportantMsgJob.java new file mode 100644 index 0000000..2693c5f --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/schedule/FwdImportantMsgJob.java @@ -0,0 +1,243 @@ +package com.xiang.xservice.fwd.schedule; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Maps; +import com.xiang.xservice.basic.utils.DateUtils; +import com.xiang.xservice.basic.utils.PrimaryKeyUtils; +import com.xiang.xservice.fwd.entity.param.FwdOrderTaskParam; +import com.xiang.xservice.fwd.entity.pojo.FPerformConfig; +import com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo; +import com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo; +import com.xiang.xservice.fwd.entity.resp.http.perform.Perform; +import com.xiang.xservice.fwd.entity.resp.http.perform.PerformDetail; +import com.xiang.xservice.fwd.entity.resp.http.perform.PerformInfo; +import com.xiang.xservice.fwd.entity.resp.http.perform.SeatPlan; +import com.xiang.xservice.fwd.entity.resp.http.perform.SeatPlanStatus; +import com.xiang.xservice.fwd.mapper.FwdAudienceConfigMapper; +import com.xiang.xservice.fwd.mapper.FwdPerformConfigMapper; +import com.xiang.xservice.fwd.mapper.FwdPerformProjectInfoMapper; +import com.xiang.xservice.fwd.mapper.FwdUserConfigMapper; +import com.xiang.xservice.fwd.service.DingTalkScriptFWDService; +import com.xiang.xservice.fwd.service.IPerformService; +import com.xiang.xservice.fwd.service.IPerformServiceHttp; +import com.xiang.xservice.schedule.core.DynamicTaskScheduler; +import com.xiang.xservice.schedule.entity.ScheduledTaskEntity; +import com.xiang.xservice.schedule.entity.TaskConfig; +import com.xiang.xservice.schedule.enums.TaskGroupEnum; +import com.xiang.xservice.schedule.enums.TaskStatusEnum; +import com.xiang.xservice.schedule.service.IDynamicTaskSchedulerService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.PostConstruct; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @Author: xiang + * @Date: 2025-07-25 14:13 + */ +@Component +@RequiredArgsConstructor +@Slf4j +@RestController +@RequestMapping("/system/job/fwd") +public class FwdImportantMsgJob { + + private final FwdPerformProjectInfoMapper performProjectInfoMapper; + private final FwdPerformConfigMapper performConfigMapper; + private final DynamicTaskScheduler dynamicTaskScheduler; + private final DingTalkScriptFWDService dingTalkScriptFWDService; + private final FwdUserConfigMapper fwdUserConfigMapper; + private final FwdAudienceConfigMapper fwdAudienceConfigMapper; + private final IPerformService iPerformService; + private final IDynamicTaskSchedulerService dynamicTaskSchedulerService; + private final IPerformServiceHttp iPerformServiceHttp; + + @PostConstruct + public void init() { + log.info("xs-fwd任务调度系统初始化!"); + ScheduledTaskEntity scheduledTaskEntity = new ScheduledTaskEntity(); + scheduledTaskEntity.setTaskGroup(TaskGroupEnum.SERVICE_FWD_SCHEDULE.getCode()); + scheduledTaskEntity.setStatus(TaskStatusEnum.UN_START.getCode()); + List taskList = dynamicTaskSchedulerService.getTaskList(scheduledTaskEntity); + for (ScheduledTaskEntity taskEntity : taskList) { + HashMap params = com.alibaba.fastjson2.JSON.parseObject(taskEntity.getParameters(), HashMap.class); + FwdOrderTaskParam param = MapUtils.isEmpty(params) ? new FwdOrderTaskParam(null, taskEntity.getId()) : new FwdOrderTaskParam((Long) params.get("projectId"), taskEntity.getId()); + LocalDateTime runTime = taskEntity.getRunTime().isBefore(LocalDateTime.now()) ? LocalDateTime.now().plusMinutes(1) : taskEntity.getRunTime(); + dynamicTaskScheduler.schedule( + new TaskConfig(taskEntity.getId(), taskEntity.getTaskName(), taskEntity.getTaskGroup(), runTime, params), + new TicketGrabTask(fwdUserConfigMapper, fwdAudienceConfigMapper, iPerformService, param, dynamicTaskSchedulerService) + ); + } + } + + @Scheduled(cron = "0 0 8 1/1 * ?") + @PostMapping("/preSaleReminderJob") + public void preSaleReminderJob() throws Exception { + log.info("【芬玩岛】演唱会预售定时任务开始!time:{}", System.currentTimeMillis()); + + // 删除配置表里面今日配置的项目信息 + performConfigMapper.delPerforms(); + + // 查询所有即将今天预售的演唱会信息 + LocalDate now = LocalDate.now(); + List saleTodayData = performProjectInfoMapper.getPreSaleTodayData(now.atTime(0, 0, 0), now.atTime(23, 59, 59)); + if (CollectionUtils.isEmpty(saleTodayData)) { + log.info("【芬玩岛】 今天:{}暂无预售的演唱会门票信息.", now); + return; + } + log.info("【芬玩岛】 即将:{}预售的演唱会门票信息:{}", now, JSONObject.toJSONString(saleTodayData)); + List addList = saleTodayData.stream().map(data -> { + FPerformConfig performConfig = new FPerformConfig(); + performConfig.setTime(data.getPreSaleTime()); + performConfig.setProjectId(data.getProjectId()); + performConfig.setDelFlag(0); + return performConfig; + }).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(addList)) { + performConfigMapper.insertPerforms(addList); + } + + StringBuilder msg = new StringBuilder("今日" + now + "演唱会门票预售信息:\n"); + for (FPerformProjectInfo data : saleTodayData) { + msg.append("演唱会名称:").append(data.getProjectName()).append("预售时间:").append(DateUtils.getDateTimeFromDateTime(data.getPreSaleTime())).append("\n"); + long taskId = PrimaryKeyUtils.snowflakeId(); + Map params = Maps.newHashMap(); + params.put("projectId", data.getProjectId()); + LocalDateTime runTime = data.getPreSaleTime().isBefore(LocalDateTime.now()) ? LocalDateTime.now().plusMinutes(1) : data.getPreSaleTime(); + dynamicTaskScheduler.schedule( + new TaskConfig(taskId, "芬玩岛演唱会抢票-【" + data.getProjectName() + "】", TaskGroupEnum.SERVICE_FWD_SCHEDULE.getCode(), + runTime, params), + new TicketGrabTask(fwdUserConfigMapper, fwdAudienceConfigMapper, iPerformService, + new FwdOrderTaskParam(data.getProjectId(), taskId), dynamicTaskSchedulerService)); + savaTask(data, taskId, params); + } + msg.append("请注意进行数据库配置的更改!"); + dingTalkScriptFWDService.sendScriptMsg(msg.toString()); + log.info("【芬玩岛】演唱会预售定时任务结束!time:{}", System.currentTimeMillis()); + } + + @Scheduled(cron = "0 10 8 1/1 * ?") + @PostMapping("/presaleSeatReminderJob") + public void presaleSeatReminderJob() { + + ScheduledTaskEntity entity = new ScheduledTaskEntity(); + entity.setStatus(TaskStatusEnum.UN_START.getCode()); + List taskList = dynamicTaskSchedulerService.getTaskList(entity); + if (CollectionUtils.isEmpty(taskList)) { + log.info("今天暂无预售的演出,time:{}", LocalDateTime.now()); + return; + } + log.info("今天:{}的预售的项目信息:{}", LocalDateTime.now(), JSON.toJSONString(taskList)); + LocalDateTime todayStartTime = LocalDate.now().atTime(0, 0, 0); + LocalDateTime todayEndTime = LocalDate.now().atTime(23, 59, 59); + + StringBuffer msg = new StringBuffer(); + + taskList.forEach(taskEntity -> { + String parameters = taskEntity.getParameters(); + JSONObject jsonObject = JSON.parseObject(parameters); + Long projectId = null; + try { + projectId = (Long) jsonObject.get("projectId"); + } catch (Exception e) { + log.error("异常错误信息:{}", JSON.toJSONString(taskEntity), e); + } + if (Objects.nonNull(projectId)) { + Perform performsByProjectIdFromHttp = iPerformServiceHttp.getPerformsByProjectIdFromHttp(projectId); + if (Objects.nonNull(performsByProjectIdFromHttp)) { + for (PerformInfo performInfo : performsByProjectIdFromHttp.getPerformInfos()) { + for (PerformDetail performDetail : performInfo.getPerformInfo()) { + LocalDateTime saleTime = DateUtils.getDateTimeFromStr(performDetail.getSaleTime()); + if (saleTime.isAfter(todayStartTime) && saleTime.isBefore(todayEndTime)) { + List seatPlans = performDetail.getSeatPlans(); + Map seatPlanMap = seatPlans.stream().collect(Collectors.toMap(SeatPlan::getSeatPlanId, Function.identity(), (a, b) -> a)); + List seatPlanIds = seatPlans.stream().map(SeatPlan::getSeatPlanId).collect(Collectors.toList()); + List seatPlanStatusFromHttp = iPerformServiceHttp.getSeatPlanStatusFromHttp(seatPlanIds); + for (SeatPlanStatus seatPlanStatus : seatPlanStatusFromHttp) { + if (!seatPlanStatus.getSoldOutFlag()) { + FPerformSeatInfo seatInfoBySeatId = iPerformService.getSeatInfoBySeatId(seatPlanStatus.getSeatPlanId()); + if (Objects.nonNull(seatInfoBySeatId)) { + seatInfoBySeatId.setSoldOut(0); + iPerformService.updateSeatInfo(seatInfoBySeatId); + msg.append("演出任务名称").append(taskEntity.getTaskName()).append("的场次信息") + .append(performDetail.getName()).append("的座位信息") + .append(seatInfoBySeatId.getSeatPlanName()).append("信息已更新\n"); + } else { + if (seatPlanMap.containsKey(seatPlanStatus.getSeatPlanId())) { + SeatPlan seatPlan = seatPlanMap.get(seatPlanStatus.getSeatPlanId()); + FPerformSeatInfo fPerformSeatInfo = new FPerformSeatInfo(); + fPerformSeatInfo.setSeatPlanId(seatInfoBySeatId.getSeatPlanId()); + fPerformSeatInfo.setSeatPlanName(seatPlan.getSeatPlanName()); + fPerformSeatInfo.setPerformId(seatInfoBySeatId.getPerformId()); + fPerformSeatInfo.setPerformName(seatInfoBySeatId.getPerformName()); + fPerformSeatInfo.setStopSale(seatInfoBySeatId.getStopSale()); + fPerformSeatInfo.setShelfStatus(seatInfoBySeatId.getShelfStatus()); + fPerformSeatInfo.setPrice(seatInfoBySeatId.getPrice()); + fPerformSeatInfo.setDiscountPrice(seatInfoBySeatId.getDiscountPrice()); + fPerformSeatInfo.setSubStatus(seatInfoBySeatId.getSubStatus()); + fPerformSeatInfo.setQuantity(seatInfoBySeatId.getQuantity()); + fPerformSeatInfo.setStatus(seatInfoBySeatId.getStatus()); + fPerformSeatInfo.setMaxSellStock(seatInfoBySeatId.getMaxSellStock()); + fPerformSeatInfo.setSoldStock(seatInfoBySeatId.getSoldStock()); + fPerformSeatInfo.setLeftStock(seatInfoBySeatId.getLeftStock()); + fPerformSeatInfo.setAbleSaleQuantity(seatInfoBySeatId.getAbleSaleQuantity()); + fPerformSeatInfo.setAshShow(seatInfoBySeatId.getAshShow()); + fPerformSeatInfo.setAshShowDesc(seatInfoBySeatId.getAshShowDesc()); + fPerformSeatInfo.setSelectable(seatInfoBySeatId.getSelectable()); + fPerformSeatInfo.setDisplay(seatInfoBySeatId.getDisplay()); + fPerformSeatInfo.setAvailableTicketQuantity(seatInfoBySeatId.getAvailableTicketQuantity()); + fPerformSeatInfo.setAvailableAllTicketQuantity(seatInfoBySeatId.getAvailableAllTicketQuantity()); + fPerformSeatInfo.setSaleTime(seatInfoBySeatId.getSaleTime()); + fPerformSeatInfo.setProjectId(seatInfoBySeatId.getProjectId()); + fPerformSeatInfo.setSoldOut(seatInfoBySeatId.getSoldOut()); + iPerformService.addSeatInfo(fPerformSeatInfo); + msg.append("演出任务名称").append(taskEntity.getTaskName()).append("的场次信息") + .append(performDetail.getName()).append("的座位信息") + .append(seatPlan.getSeatPlanName()).append("信息已更新\n"); + } + } + + } else { + log.info("演出:{},座位:{},已售罄", performDetail.getName(), seatPlanStatus.getSeatPlanId()); + msg.append("演出任务名称").append(taskEntity.getTaskName()).append("的场次信息") + .append(performDetail.getName()).append("的座位信息").append("已售罄\n"); + } + } + } + } + } + } + } + }); + dingTalkScriptFWDService.sendScriptMsg(msg.toString()); + } + + private void savaTask(FPerformProjectInfo data, long taskId, Map params) { + ScheduledTaskEntity entity = new ScheduledTaskEntity(); + entity.setId(taskId); + entity.setTaskName("芬玩岛演唱会抢票-【" + data.getProjectName() + "】"); + entity.setTaskGroup(TaskGroupEnum.SERVICE_FWD_SCHEDULE.getCode()); + entity.setRunTime(data.getPreSaleTime()); + entity.setStatus(TaskStatusEnum.UN_START.getCode()); + entity.setParameters(JSON.toJSONString(params)); + entity.setCreatedTime(LocalDateTime.now()); + entity.setUpdatedTime(LocalDateTime.now()); + dynamicTaskSchedulerService.saveTask(entity); + } +} 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 new file mode 100644 index 0000000..96db816 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/schedule/PullDataFromFWDJob.java @@ -0,0 +1,292 @@ +package com.xiang.xservice.fwd.schedule; + +import com.google.common.collect.Lists; +import com.xiang.xservice.basic.common.req.BaseRequest; +import com.xiang.xservice.basic.config.MyThreadFactory; +import com.xiang.xservice.basic.utils.DateUtils; +import com.xiang.xservice.fwd.entity.pojo.FAudienceConfig; +import com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo; +import com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo; +import com.xiang.xservice.fwd.entity.pojo.FUserConfig; +import com.xiang.xservice.fwd.entity.resp.http.audience.AudienceMemberInfo; +import com.xiang.xservice.fwd.entity.resp.http.perform.Perform; +import com.xiang.xservice.fwd.entity.resp.http.perform.PerformDetail; +import com.xiang.xservice.fwd.entity.resp.http.perform.PerformInfo; +import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectInfoResp; +import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectList; +import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectsResp; +import com.xiang.xservice.fwd.entity.resp.http.perform.SeatPlan; +import com.xiang.xservice.fwd.entity.resp.http.perform.SeatPlanStatus; +import com.xiang.xservice.fwd.mapper.FwdAudienceConfigMapper; +import com.xiang.xservice.fwd.mapper.FwdPerformConfigMapper; +import com.xiang.xservice.fwd.mapper.FwdPerformProjectInfoMapper; +import com.xiang.xservice.fwd.mapper.FwdPerformSeatInfoMapper; +import com.xiang.xservice.fwd.mapper.FwdUserConfigMapper; +import com.xiang.xservice.fwd.service.IPerformServiceHttp; +import com.xiang.xservice.http.helper.HttpRequestHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 芬玩岛拉取数据定时任务 + * + * @Author: xiang + * @Date: 2025-07-24 17:19 + */ +@Component +@RequiredArgsConstructor +@Slf4j +@RestController +public class PullDataFromFWDJob { + + private final IPerformServiceHttp performServiceHttp; + private final FwdPerformProjectInfoMapper performProjectInfoMapper; + private final FwdPerformConfigMapper performConfigMapper; + private final FwdPerformSeatInfoMapper performSeatInfoMapper; + private final FwdUserConfigMapper userConfigMapper; + private final FwdAudienceConfigMapper audienceConfigMapper; + private final HttpRequestHelper httpRequestHelper; + + private final ExecutorService es = + new ThreadPoolExecutor( + 5, + 10, + 1000, + TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(), + new MyThreadFactory("fwd-pull-data-http", Boolean.TRUE), + new ThreadPoolExecutor.AbortPolicy()); + + private void saveProjectInfo(ProjectList project, ProjectInfoResp projectInfoFromHttp) { + FPerformProjectInfo fPerformProjectInfo = new FPerformProjectInfo(); + fPerformProjectInfo.setNameDisplay(projectInfoFromHttp.getNameDisplay()); + fPerformProjectInfo.setStatus(projectInfoFromHttp.getStatus()); + fPerformProjectInfo.setProjectSource(projectInfoFromHttp.getProjectSource()); + fPerformProjectInfo.setIsHasSeat(projectInfoFromHttp.getIsHasSeat()); + fPerformProjectInfo.setIsChoiceSeat(projectInfoFromHttp.getIsChoiceSeat()); + fPerformProjectInfo.setHighestPrice(projectInfoFromHttp.getHighPrice()); + if (StringUtils.isNotBlank(projectInfoFromHttp.getProjectStartDate())) { + fPerformProjectInfo.setProjectStartDate(DateUtils.getDateFromStr(projectInfoFromHttp.getProjectStartDate(), "yyyy/MM/dd")); + } + if (StringUtils.isNotBlank(projectInfoFromHttp.getProjectEndDate())) { + fPerformProjectInfo.setProjectEndDate(DateUtils.getDateFromStr(projectInfoFromHttp.getProjectEndDate(), "yyyy/MM/dd")); + } + fPerformProjectInfo.setSubClassifyName(projectInfoFromHttp.getSubClassifyName()); + + fPerformProjectInfo.setProjectName(project.getName()); + fPerformProjectInfo.setBizId(project.getBizId()); + fPerformProjectInfo.setProjectId(project.getProjectId()); + fPerformProjectInfo.setTagName(project.getTagName()); + fPerformProjectInfo.setTagRemark(project.getTagRemark()); + fPerformProjectInfo.setProjectCity(project.getCity()); + fPerformProjectInfo.setShortCity(project.getShortCity()); + fPerformProjectInfo.setVenueName(project.getVenueName()); + fPerformProjectInfo.setLowestPrice(project.getLowestPrice()); + if (StringUtils.isNotBlank(projectInfoFromHttp.getPreSaleTime())) { + fPerformProjectInfo.setPreSaleTime(DateUtils.getDateTimeFromStr(projectInfoFromHttp.getPreSaleTime(), "yyyy/MM/dd HH:mm:ss")); + } + performProjectInfoMapper.insert(fPerformProjectInfo); + } + + /** + * 每月拉取观影人数据更新 + */ + @Scheduled(cron = "0 0 0 1 1/1 ? ") + public void pullAudienceMemberInfo() { + List availableUser = userConfigMapper.getAvailableUser(); + if (CollectionUtils.isEmpty(availableUser)) { + return; + } + availableUser.forEach(user -> { + List audienceMemberInfo = performServiceHttp.getAudienceMemberInfo(user.getToken()); + if (CollectionUtils.isNotEmpty(audienceMemberInfo)) { + List list = audienceMemberInfo.stream().map(audience -> { + FAudienceConfig info = new FAudienceConfig(); + info.setDelFlag(0); + info.setFrequentId(audience.getFrequentContactsId()); + info.setFrequentNo(audience.getIdCard()); + info.setFrequentName(audience.getName()); + info.setStatus(1); + info.setFrequentPhone(audience.getPhone()); + info.setUserId(user.getId()); + return info; + }).collect(Collectors.toList()); + audienceConfigMapper.delByUserId(user.getId()); + audienceConfigMapper.batchSave(list); + } + }); + } + + @PostMapping("/pullPerformDataJob") + @Scheduled(cron = "0 0 1 1/1 * ?") + public void pullPerformDataJob() { + int pageNum = 0; + while (true) { + pageNum++; + BaseRequest baseRequest = new BaseRequest(); + baseRequest.setCurrent(pageNum); + baseRequest.setPageSize(50); + // 查询所有的演出 + ProjectsResp projectsResp = httpRequestHelper.fetchWithRetry(() -> performServiceHttp.getShowProjectsFromHttp(baseRequest), "fetch-projects"); + if (Objects.isNull(projectsResp)) { + break; + } + List projectLists = projectsResp.getList(); + if (CollectionUtils.isEmpty(projectLists)) { + break; + } + for (ProjectList projectList : projectLists) { + // 查询演出的详情 + ProjectInfoResp projectInfoFromHttp = httpRequestHelper.fetchWithRetry(() -> performServiceHttp.getProjectInfoFromHttp(projectList.getProjectId()), "fetch-project-info"); + if (Objects.isNull(projectInfoFromHttp)) { + continue; + } + // 查询演出信息 + Perform performsByProjectIdFromHttp = httpRequestHelper.fetchWithRetry(() -> performServiceHttp.getPerformsByProjectIdFromHttp(projectList.getProjectId()), "fetch-perform-by-project-id"); + if (Objects.isNull(performsByProjectIdFromHttp)) { + continue; + } + + // 查询数据库 + FPerformProjectInfo projectInfo = performProjectInfoMapper.getProjectByProjectId(performsByProjectIdFromHttp.getProjectId()); + if (Objects.isNull(projectInfo)) { + // 不存在则新增 + saveProjectInfo(projectList, projectInfoFromHttp); + } else { + // 存在则更新 + buildUpdateProjectInfo(projectList, projectInfo, projectInfoFromHttp); + performProjectInfoMapper.update(projectInfo); + } + + // 查询演出信息 + List performInfos = performsByProjectIdFromHttp.getPerformInfos(); + if (CollectionUtils.isEmpty(performInfos)) { + continue; + } + // 查询演出座位档次信息 + List insertList = Lists.newCopyOnWriteArrayList(); + List updateList = Lists.newCopyOnWriteArrayList(); + for (PerformInfo performInfo : performInfos) { + List performs = performInfo.getPerformInfo(); + if (CollectionUtils.isEmpty(performs)) { + continue; + } + for (PerformDetail perform : performs) { + if (CollectionUtils.isEmpty(perform.getSeatPlans())) { + continue; + } + List seatPlanIds = perform.getSeatPlans().stream().map(SeatPlan::getSeatPlanId).collect(Collectors.toList()); + List seatPlanStatusList = httpRequestHelper.fetchWithRetry(() -> performServiceHttp.getSeatPlanStatusFromHttp(seatPlanIds), "fetch-seat-plan-status"); + if (CollectionUtils.isEmpty(seatPlanStatusList)) { + continue; + } + Map map = seatPlanStatusList.stream().collect(Collectors.toMap(SeatPlanStatus::getSeatPlanId, Function.identity(), (a, b) -> a)); + Map existSeatMap = performSeatInfoMapper.getPerformSeatInfoBySeatIds(seatPlanIds) + .stream() + .collect(Collectors.toMap(FPerformSeatInfo::getSeatPlanId, Function.identity(), (a, b) -> a)); + for (SeatPlan seatPlan : perform.getSeatPlans()) { + if (map.containsKey(seatPlan.getSeatPlanId())) { + SeatPlanStatus value = map.get(seatPlan.getSeatPlanId()); + if (existSeatMap.containsKey(seatPlan.getSeatPlanId())) { + // 更新 + FPerformSeatInfo performSeatInfo = existSeatMap.get(seatPlan.getSeatPlanId()); + performSeatInfo.setSoldStock(value.getSoldOutFlag() ? 1 : 0); + updateList.add(performSeatInfo); + } else { + // 新增 + saveSeatInfo(projectList, seatPlan.getSeatPlanId(), value, seatPlan, insertList); + } + } + } + } + } + if (!CollectionUtils.isEmpty(insertList)) { + performSeatInfoMapper.batchSave(insertList); + } + if (!CollectionUtils.isEmpty(updateList)) { + for (FPerformSeatInfo seatInfo : updateList) { + performSeatInfoMapper.update(seatInfo); + } + } + } + } + } + + private static void saveSeatInfo(ProjectList projectList, Long seatPlanId, SeatPlanStatus seatPlanStatus, SeatPlan seatPlan, List insertList) { + FPerformSeatInfo fPerformSeatInfo = new FPerformSeatInfo(); + fPerformSeatInfo.setSeatPlanId(seatPlanId); + fPerformSeatInfo.setSeatPlanName(seatPlan.getSeatPlanName()); + fPerformSeatInfo.setPerformId(seatPlan.getPerformId()); + fPerformSeatInfo.setPerformName(seatPlan.getPerformName()); + fPerformSeatInfo.setStopSale(seatPlan.getStopSale()); + fPerformSeatInfo.setShelfStatus(seatPlan.getShelfStatus()); + fPerformSeatInfo.setPrice(seatPlan.getPrice()); + fPerformSeatInfo.setDiscountPrice(seatPlan.getDiscountPrice()); + fPerformSeatInfo.setSubStatus(seatPlan.getSubStatus()); + fPerformSeatInfo.setQuantity(seatPlan.getQuantity()); + fPerformSeatInfo.setStatus(seatPlan.getStatus()); + fPerformSeatInfo.setMaxSellStock(seatPlan.getMaxSellStock()); + fPerformSeatInfo.setSoldStock(seatPlan.getSoldStock()); + fPerformSeatInfo.setLeftStock(seatPlan.getLeftStock()); + fPerformSeatInfo.setAbleSaleQuantity(seatPlan.getAbleSaleQuantity()); + fPerformSeatInfo.setAshShow(seatPlan.getAshShow()); + fPerformSeatInfo.setAshShowDesc(seatPlan.getAshShowDesc()); + fPerformSeatInfo.setSelectable(seatPlan.getSelectable()); + fPerformSeatInfo.setDisplay(seatPlan.getDisplay()); + fPerformSeatInfo.setAvailableTicketQuantity(seatPlan.getAvailableTicketQuantity()); + fPerformSeatInfo.setAvailableAllTicketQuantity(seatPlan.getAvailableAllTicketQuantity()); + if (StringUtils.isNotBlank(seatPlan.getSaleTime())) { + fPerformSeatInfo.setSaleTime(DateUtils.getDateTimeFromStr(seatPlan.getSaleTime())); + } + fPerformSeatInfo.setProjectId(projectList.getProjectId()); + if (!seatPlanStatus.getSoldOutFlag() && seatPlanStatus.getStandbyStatus().equals(10)) { + fPerformSeatInfo.setSoldOut(0); + } else { + fPerformSeatInfo.setSoldOut(1); + } + insertList.add(fPerformSeatInfo); + } + + private static void buildUpdateProjectInfo(ProjectList projectList, FPerformProjectInfo projectInfo, ProjectInfoResp projectInfoFromHttp) { + projectInfo.setNameDisplay(projectInfoFromHttp.getNameDisplay()); + projectInfo.setStatus(projectInfoFromHttp.getStatus()); + projectInfo.setProjectSource(projectInfoFromHttp.getProjectSource()); + projectInfo.setIsHasSeat(projectInfoFromHttp.getIsHasSeat()); + projectInfo.setIsChoiceSeat(projectInfoFromHttp.getIsChoiceSeat()); + projectInfo.setHighestPrice(projectInfoFromHttp.getHighPrice()); + if (StringUtils.isNotBlank(projectInfoFromHttp.getProjectStartDate())) { + projectInfo.setProjectStartDate(DateUtils.getDateFromStr(projectInfoFromHttp.getProjectStartDate(), "yyyy/MM/dd")); + } + if (StringUtils.isNotBlank(projectInfoFromHttp.getProjectEndDate())) { + projectInfo.setProjectEndDate(DateUtils.getDateFromStr(projectInfoFromHttp.getProjectEndDate(), "yyyy/MM/dd")); + } + projectInfo.setSubClassifyName(projectInfoFromHttp.getSubClassifyName()); + projectInfo.setProjectName(projectList.getName()); + projectInfo.setBizId(projectList.getBizId()); + projectInfo.setTagName(projectList.getTagName()); + projectInfo.setTagRemark(projectList.getTagRemark()); + projectInfo.setProjectCity(projectList.getCity()); + projectInfo.setShortCity(projectList.getShortCity()); + projectInfo.setVenueName(projectList.getVenueName()); + projectInfo.setLowestPrice(projectList.getLowestPrice()); + if (StringUtils.isNotBlank(projectInfoFromHttp.getPreSaleTime())) { + projectInfo.setPreSaleTime(DateUtils.getDateTimeFromStr(projectInfoFromHttp.getPreSaleTime(), "yyyy/MM/dd HH:mm:ss")); + } + } +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/schedule/TicketGrabTask.java b/script/src/main/java/com/xiang/xservice/fwd/schedule/TicketGrabTask.java new file mode 100644 index 0000000..88eee70 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/schedule/TicketGrabTask.java @@ -0,0 +1,60 @@ +package com.xiang.xservice.fwd.schedule; + +import com.alibaba.fastjson.JSON; +import com.xiang.xservice.fwd.entity.param.FwdOrderTaskParam; +import com.xiang.xservice.fwd.entity.pojo.FAudienceConfig; +import com.xiang.xservice.fwd.entity.pojo.FUserConfig; +import com.xiang.xservice.fwd.mapper.FwdAudienceConfigMapper; +import com.xiang.xservice.fwd.mapper.FwdUserConfigMapper; +import com.xiang.xservice.fwd.service.IPerformService; +import com.xiang.xservice.schedule.service.IDynamicTaskSchedulerService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +public class TicketGrabTask implements Runnable { + + private final FwdUserConfigMapper userConfigMapper; + private final FwdAudienceConfigMapper audienceConfigMapper; + private final IPerformService performService; + private final FwdOrderTaskParam param; + private final IDynamicTaskSchedulerService dynamicTaskSchedulerService; + + public TicketGrabTask(FwdUserConfigMapper userConfigMapper, FwdAudienceConfigMapper audienceConfigMapper, + IPerformService performService, FwdOrderTaskParam param, + IDynamicTaskSchedulerService dynamicTaskSchedulerService) { + this.userConfigMapper = userConfigMapper; + this.audienceConfigMapper = audienceConfigMapper; + this.performService = performService; + this.param = param; + this.dynamicTaskSchedulerService = dynamicTaskSchedulerService; + } + + @Override + public void run() { + try { + log.info("【TicketGrabTask】 run start. 获取到参数:{}", JSON.toJSONString(param)); + dynamicTaskSchedulerService.updateProcess(param.getTaskId()); + List availableUser = userConfigMapper.getAvailableUser(); + if (CollectionUtils.isEmpty(availableUser)) { + return; + } + for (FUserConfig userConfig : availableUser) { + List audiences = audienceConfigMapper.getAudienceByUserId(userConfig.getId()); + try { + performService.createProjectOrder(param.getProjectId(), audiences.stream().map(FAudienceConfig::getFrequentId).collect(Collectors.toList())); + dynamicTaskSchedulerService.finishTask(param.getTaskId()); + } catch (Exception e) { + log.error("创建订单失败", e); + dynamicTaskSchedulerService.errTask(param.getTaskId()); + } + } + } catch (Exception e) { + log.error("任务调度运行失败", e); + dynamicTaskSchedulerService.errTask(param.getTaskId()); + } + } +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/server/FwdDataController.java b/script/src/main/java/com/xiang/xservice/fwd/server/FwdDataController.java new file mode 100644 index 0000000..50bbb6c --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/server/FwdDataController.java @@ -0,0 +1,104 @@ +package com.xiang.xservice.fwd.server; + +import com.xiang.xservice.basic.common.resp.Result; +import com.xiang.xservice.basic.utils.DateUtils; +import com.xiang.xservice.fwd.entity.pojo.FPerformConfig; +import com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo; +import com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo; +import com.xiang.xservice.fwd.entity.resp.http.perform.*; +import com.xiang.xservice.fwd.service.IPerformService; +import com.xiang.xservice.fwd.service.IPerformServiceHttp; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/system/fwd") +@RequiredArgsConstructor +public class FwdDataController { + + private final IPerformService performService; + private final IPerformServiceHttp performServiceHttp; + + @PostMapping("/refreshData") + public Result refreshData() { + List availablePerforms = performService.getAvailablePerform(); + for (FPerformConfig availablePerform : availablePerforms) { + ProjectInfoResp info = performServiceHttp.getProjectInfoFromHttp(availablePerform.getProjectId()); + Perform performsByProjectIdFromHttp = performServiceHttp.getPerformsByProjectIdFromHttp(availablePerform.getProjectId()); + FPerformProjectInfo performByProjectId = performService.getPerformByProjectId(availablePerform.getProjectId()); + performByProjectId.setStatus(info.getStatus()); + performByProjectId.setPreSaleTime(DateUtils.getDateTimeFromStr(info.getPreSaleTime())); + performService.updateProjectInfo(performByProjectId); + List performInfos = performsByProjectIdFromHttp.getPerformInfos(); + if (CollectionUtils.isEmpty(performInfos)) { + continue; + } + for (PerformInfo performInfo : performInfos) { + List performInfo1 = performInfo.getPerformInfo(); + if (CollectionUtils.isEmpty(performInfo1)) { + continue; + } + for (PerformDetail performDetail : performInfo1) { + List seatPlans = performDetail.getSeatPlans(); + if (CollectionUtils.isEmpty(seatPlans)) { + continue; + } + List seatIds = seatPlans.stream().map(SeatPlan::getSeatPlanId).collect(Collectors.toList()); + List seatPlanStatusFromHttp = performServiceHttp.getSeatPlanStatusFromHttp(seatIds); + if (CollectionUtils.isEmpty(seatPlanStatusFromHttp)) { + continue; + } + Map map = seatPlanStatusFromHttp.stream().collect(Collectors.toMap(SeatPlanStatus::getSeatPlanId, Function.identity(), (a, b) -> a)); + for (SeatPlan seatPlan : seatPlans) { + FPerformSeatInfo seatInfoBySeatId = performService.getSeatInfoBySeatId(seatPlan.getSeatPlanId()); + if (Objects.isNull(seatInfoBySeatId)) { + FPerformSeatInfo fPerformSeatInfo = new FPerformSeatInfo(); + fPerformSeatInfo.setSeatPlanId(seatPlan.getSeatPlanId()); + fPerformSeatInfo.setSeatPlanName(seatPlan.getSeatPlanName()); + fPerformSeatInfo.setPerformId(seatPlan.getPerformId()); + fPerformSeatInfo.setPerformName(seatPlan.getPerformName()); + fPerformSeatInfo.setStopSale(seatPlan.getStopSale()); + fPerformSeatInfo.setShelfStatus(seatPlan.getShelfStatus()); + fPerformSeatInfo.setPrice(seatPlan.getPrice()); + fPerformSeatInfo.setDiscountPrice(seatPlan.getDiscountPrice()); + fPerformSeatInfo.setSubStatus(seatPlan.getSubStatus()); + fPerformSeatInfo.setQuantity(seatPlan.getQuantity()); + fPerformSeatInfo.setStatus(seatPlan.getStatus()); + fPerformSeatInfo.setMaxSellStock(seatPlan.getMaxSellStock()); + fPerformSeatInfo.setSoldStock(seatPlan.getSoldStock()); + fPerformSeatInfo.setLeftStock(seatPlan.getLeftStock()); + fPerformSeatInfo.setAbleSaleQuantity(seatPlan.getAbleSaleQuantity()); + fPerformSeatInfo.setAshShow(seatPlan.getAshShow()); + fPerformSeatInfo.setAshShowDesc(seatPlan.getAshShowDesc()); + fPerformSeatInfo.setSelectable(seatPlan.getSelectable()); + fPerformSeatInfo.setDisplay(seatPlan.getDisplay()); + fPerformSeatInfo.setAvailableTicketQuantity(seatPlan.getAvailableTicketQuantity()); + fPerformSeatInfo.setAvailableAllTicketQuantity(seatPlan.getAvailableAllTicketQuantity()); + fPerformSeatInfo.setSaleTime(DateUtils.getDateTimeFromStr(seatPlan.getSaleTime(), "yyyy/MM/dd HH:mm:ss")); + fPerformSeatInfo.setProjectId(availablePerform.getProjectId()); + fPerformSeatInfo.setSoldOut(seatPlan.getSoldStock()); + performService.addSeatInfo(fPerformSeatInfo); + } else { + SeatPlanStatus seatPlanStatus = map.get(seatPlan.getSeatPlanId()); + if (Objects.isNull(seatPlanStatus)) { + continue; + } + seatInfoBySeatId.setSoldStock(seatPlanStatus.getSoldOutFlag() ? 1 : 0); + performService.updateSeatInfo(seatInfoBySeatId); + } + } + } + } + } + return Result.success("success"); + } +} 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 new file mode 100644 index 0000000..15035aa --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/server/FwdOuterController.java @@ -0,0 +1,66 @@ +package com.xiang.xservice.fwd.server; + +import com.xiang.xservice.basic.common.req.BaseRequest; +import com.xiang.xservice.basic.common.resp.Result; +import com.xiang.xservice.fwd.entity.resp.http.perform.Perform; +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.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-07-24 16:55 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/system/fwd/outer") +public class FwdOuterController { + + private final IPerformServiceHttp performServiceHttp; + private final IPerformService performService; + private static final List FREQUENT_IDS = List.of(50438548L, 35320661L, 50436621L, 50442739L); + + + @GetMapping("/getShowProjects") + public Result getShowProjects() { + ProjectsResp showProjectsFromHttp = performServiceHttp.getShowProjectsFromHttp(new BaseRequest()); + return Result.success("查询成功!", showProjectsFromHttp); + } + + @GetMapping("/getProjectInfo/{id}") + public Result getProjectInfo(@PathVariable("id") Long id) { + Perform performsByProjectIdFromHttp = performServiceHttp.getPerformsByProjectIdFromHttp(id); + return Result.success("查询成功!", performsByProjectIdFromHttp); + } + + @GetMapping("/getPerformsByProjectIdFromHttp/{id}") + public Result getPerformsByProjectIdFromHttp(@PathVariable("id") Long id) { + Perform performsByProjectIdFromHttp = performServiceHttp.getPerformsByProjectIdFromHttp(id); + return Result.success("查询成功!", performsByProjectIdFromHttp); + } + + @PostMapping("/createOrder") + public Result createOrder(Long projectId) throws Exception { + if (performService.createProjectOrder(projectId, FREQUENT_IDS)) { + return Result.success("下单成功!"); + } + 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/server/FwdUserController.java b/script/src/main/java/com/xiang/xservice/fwd/server/FwdUserController.java new file mode 100644 index 0000000..9dec7a3 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/server/FwdUserController.java @@ -0,0 +1,46 @@ +package com.xiang.xservice.fwd.server; + +import com.alibaba.fastjson.JSON; +import com.xiang.xservice.basic.common.resp.Result; +import com.xiang.xservice.fwd.service.DingTalkScriptFWDService; +import com.xiang.xservice.fwd.service.IPerformService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * @Author: xiang + * @Date: 2025-08-06 10:41 + */ +@Slf4j +@RestController +@RequestMapping("/open/fwd/user") +@RequiredArgsConstructor +public class FwdUserController { + + private final IPerformService performService; + private final DingTalkScriptFWDService dingTalkService; + + @GetMapping("/token") + public Result updateUserTokenFromHttpProxy(@RequestParam Map params) { + String name = params.get("name"); + String token = params.get("token"); + log.info("接收到的参数有===>{}, name:{}, token:{}", JSON.toJSONString(params), name, token); + Boolean b = performService.updateTokenByName(name, token); + if (b) { + String msg = "用户:" + name + "的token更新成功!"; + try { + dingTalkService.sendScriptMsg(msg); + } catch (Exception e) { + log.error("消息发送失败", e); + return Result.error("消息发送失败"); + } + } + return Result.success(); + } +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/service/DingTalkScriptFWDService.java b/script/src/main/java/com/xiang/xservice/fwd/service/DingTalkScriptFWDService.java new file mode 100644 index 0000000..2d7bd1f --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/service/DingTalkScriptFWDService.java @@ -0,0 +1,32 @@ +package com.xiang.xservice.fwd.service; + +import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService; +import com.xiang.xservice.config.DingTalkRobotScriptConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @Author: xiang + * @Date: 2025-08-07 10:30 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class DingTalkScriptFWDService { + + private final DingTalkService dingTalkService; + private final DingTalkRobotScriptConfig dingTalkRobotConfig; + + /** + * 发送脚本消息 + * @param msg 消息 + */ + public void sendScriptMsg(String msg) { + try { + dingTalkService.sendRobotMessage(dingTalkRobotConfig.getSecret(), dingTalkRobotConfig.getToken(), dingTalkRobotConfig.getUsers(), msg); + } catch (Exception e) { + log.error("信息发送异常, 信息:{}", msg, e); + } + } +} 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..83c53d7 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/service/IPerformService.java @@ -0,0 +1,32 @@ +package com.xiang.xservice.fwd.service; + +import com.xiang.xservice.fwd.entity.pojo.FPerformConfig; +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, List frequentIds) throws Exception; + + List getAvailablePerform(); + + Boolean updateProjectInfo(FPerformProjectInfo projectInfo); + + FPerformSeatInfo getSeatInfoBySeatId(Long seatId); + + Boolean updateSeatInfo(FPerformSeatInfo seatInfoBySeatId); + + Boolean addSeatInfo(FPerformSeatInfo fPerformSeatInfo); + + Boolean updateTokenByName(String name, String token); +} 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 new file mode 100644 index 0000000..fe88a32 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/service/IPerformServiceHttp.java @@ -0,0 +1,58 @@ +package com.xiang.xservice.fwd.service; + +import com.xiang.xservice.basic.common.req.BaseRequest; +import com.xiang.xservice.fwd.entity.req.ProjectOrderCreateReq; +import com.xiang.xservice.fwd.entity.resp.http.audience.AudienceMemberInfo; +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 { + + /** + * http请求查询全部演出列表 + * @return ProjectsResp + */ + ProjectsResp getShowProjectsFromHttp(BaseRequest request); + + /** + * http请求根据projectId查询演出详情 + * @param projectId projectId + * @return ProjectInfoResp + */ + ProjectInfoResp getProjectInfoFromHttp(Long projectId); + + /** + * http请求创建演出订单 + * @param req 创建请求参数 + * @return ProjectOrderCreateResp + */ + ProjectOrderCreateResp createProjectOrder(ProjectOrderCreateReq req, String token); + + /** + * http请求查询演出票务信息 + * @param projectId + * @return + */ + Perform getPerformsByProjectIdFromHttp(Long projectId); + + /** + * http请求获取座位状态信息 + * @param seatPlanIds + * @return + */ + List getSeatPlanStatusFromHttp(List seatPlanIds); + + /** + * http请求查询观影人信息 + * @param token + * @return + */ + List getAudienceMemberInfo(String token); + + +} 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 new file mode 100644 index 0000000..9749518 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceHttpServiceImpl.java @@ -0,0 +1,189 @@ +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.common.req.BaseRequest; +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; +import com.xiang.xservice.fwd.entity.resp.http.audience.AudienceMemberInfo; +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; + +@Service +@Slf4j +@RequiredArgsConstructor +public class PerformServiceHttpServiceImpl implements IPerformServiceHttp { + + @Override + public ProjectsResp getShowProjectsFromHttp(BaseRequest request) { + Map params = Maps.newHashMap(); + params.put("projectModuleId", "7"); + if (Objects.isNull(request.getCurrent())) { + params.put("pageNum", String.valueOf(1)); + } else { + params.put("pageNum", String.valueOf(request.getCurrent())); + } + if (Objects.isNull(request.getPageSize())) { + params.put("pageSize", String.valueOf(10)); + } else { + params.put("pageSize", String.valueOf(request.getPageSize())); + } + String respStr = HttpUtils.doGet(UrlConstants.PROJECTS_URL, buildFWDHeaders(null), params); + if (StringUtils.isBlank(respStr)) { + return null; + } + log.info("【Http请求】 http请求查询演出列表结果:{}", respStr); + JSONObject resp = JSON.parseObject(respStr); + Integer code = (Integer) resp.get("code"); + if (Objects.nonNull(code) && Objects.equals(code, CodeConstants.SUCCESS)) { + ProjectsResp projectsResp = JSON.parseObject(resp.get("data").toString(), ProjectsResp.class); + if (Objects.isNull(projectsResp)) { + return null; + } + return projectsResp; + } + return null; + } + + @Override + public ProjectInfoResp getProjectInfoFromHttp(Long projectId) { + Map params = Maps.newHashMap(); + params.put("project_id", String.valueOf(projectId)); + String respStr = HttpUtils.doGet(UrlConstants.PROJECTS_INFO_URL, buildFWDHeaders(UrlConstants.token), params); + if (StringUtils.isBlank(respStr)) { + return null; + } + log.info("【Http请求】 根据projectId:{},http请求查询演出信息结果:{}", projectId, respStr); + JSONObject resp = JSON.parseObject(respStr); + Integer code = (Integer) resp.get("code"); + if (Objects.nonNull(code) && Objects.equals(code, CodeConstants.SUCCESS)) { + ProjectInfoResp projectInfoResp = JSON.parseObject(resp.get("data").toString(), ProjectInfoResp.class); + if (Objects.isNull(projectInfoResp)) { + return null; + } + return projectInfoResp; + } + return null; + } + + @Override + public ProjectOrderCreateResp createProjectOrder(ProjectOrderCreateReq req, String token) { + String respStr = HttpUtils.doPost(UrlConstants.PROJECT_ORDER_CREATE_URL, buildFWDHeaders(token), JsonUtils.toJsonString(req)); + if (StringUtils.isBlank(respStr)) { + return null; + } + log.info("【Http请求】 http请求创建订单结果:{}", respStr); + JSONObject resp = JSON.parseObject(respStr); + Integer code = (Integer) resp.get("code"); + if (Objects.nonNull(code) && Objects.equals(code, CodeConstants.SUCCESS)) { + ProjectOrderCreateResp projectOrderCreateResp = JSON.parseObject(resp.get("data").toString(), ProjectOrderCreateResp.class); + if (Objects.isNull(projectOrderCreateResp)) { + return null; + } + return projectOrderCreateResp; + } + return null; + } + + @Override + public Perform getPerformsByProjectIdFromHttp(Long projectId) { + Map params = Maps.newHashMap(); + params.put("project_id", String.valueOf(projectId)); + String respStr = HttpUtils.doGet(UrlConstants.PERFORMS_URL, buildFWDHeaders(UrlConstants.token), params); + if (StringUtils.isBlank(respStr)) { + return null; + } + log.info("【Http请求】 根据projectId:{}http请求查询演出票务信息结果:{}", projectId, respStr); + JSONObject resp = JSON.parseObject(respStr); + Integer code = (Integer) resp.get("code"); + if (Objects.nonNull(code) && Objects.equals(code, CodeConstants.SUCCESS)) { + Perform projectInfoResp = JSON.parseObject(resp.get("data").toString(), Perform.class); + if (Objects.isNull(projectInfoResp)) { + return null; + } + return projectInfoResp; + } + return null; + } + + @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(); + } + + @Override + public List getAudienceMemberInfo(String token) { + Map params = Maps.newHashMap(); + String respStr = HttpUtils.doGet(UrlConstants.PROJECT_AUDIENCE_MEMBER_INFO, buildFWDHeaders(token), params); + if (StringUtils.isBlank(respStr)) { + return Lists.newArrayList(); + } + log.info("【Http请求】 根据token:{}http请求查询观影人信息结果:{}", token, 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(), AudienceMemberInfo.class); + if (CollectionUtils.isEmpty(data)) { + return Lists.newArrayList(); + } + return data; + } + return Lists.newArrayList(); + } + + private Map buildFWDHeaders(String token) { + Map headers = Maps.newHashMap(); + headers.put("Host", "api.livelab.com.cn"); + headers.put("Connection", "keep-alive"); + headers.put("platform-type", "%E7%BA%B7%E7%8E%A9%E5%B2%9B%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F"); + headers.put("content-type", "application/json"); + headers.put("x-fwd-anonymousId", "ocXac5C25MY5O3UM_EfL0oTgm7Jw"); + headers.put("platform-version", "3.12.0"); + if (StringUtils.isNotBlank(token)) { + headers.put("Authorization", token); + } + headers.put("Accept-Encoding", "gzip,compress,br,deflate"); + headers.put("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.61(0x18003d30) NetType/4G Language/zh_CN"); + headers.put("Referer", "https://servicewechat.com/wx5a8f481d967649eb/114/page-frame.html"); + return headers; + } +} 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..23f7cf2 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceImpl.java @@ -0,0 +1,156 @@ +package com.xiang.xservice.fwd.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.xiang.xservice.basic.config.MyThreadFactory; +import com.xiang.xservice.fwd.entity.pojo.FPerformConfig; +import com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo; +import com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo; +import com.xiang.xservice.fwd.entity.pojo.FUserConfig; +import com.xiang.xservice.fwd.entity.req.ProjectOrderCreateReq; +import com.xiang.xservice.fwd.entity.resp.http.perform.ProjectOrderCreateResp; +import com.xiang.xservice.fwd.mapper.FwdPerformConfigMapper; +import com.xiang.xservice.fwd.mapper.FwdPerformProjectInfoMapper; +import com.xiang.xservice.fwd.mapper.FwdPerformSeatInfoMapper; +import com.xiang.xservice.fwd.mapper.FwdUserConfigMapper; +import com.xiang.xservice.fwd.service.DingTalkScriptFWDService; +import com.xiang.xservice.fwd.service.IPerformService; +import com.xiang.xservice.fwd.service.IPerformServiceHttp; +import com.xiang.xservice.http.helper.HttpRequestHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +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; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @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 FwdPerformConfigMapper fwdPerformConfigMapper; + private final IPerformServiceHttp performServiceHttp; + private final DingTalkScriptFWDService dingTalkService; + private final FwdUserConfigMapper fwdUserConfigMapper; + private final HttpRequestHelper httpRequestHelper; + private final ExecutorService es = + new ThreadPoolExecutor( + 10, + 20, + 1000, + TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(), + new MyThreadFactory("ticket-", Boolean.TRUE), + new ThreadPoolExecutor.AbortPolicy()); + + @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, List frequentIds) throws Exception { + List availableUser = fwdUserConfigMapper.getAvailableUser(); + if (CollectionUtils.isEmpty(availableUser)) { + return Boolean.FALSE; + } + 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) { + if (1 == fPerformSeatInfo.getSoldOut()) { + continue; + } + ProjectOrderCreateReq projectOrderCreateReq = new ProjectOrderCreateReq(); + projectOrderCreateReq.setDeliveryType(1); + projectOrderCreateReq.setContactName("朱吉祥"); + projectOrderCreateReq.setContactPhone("15858717571"); + projectOrderCreateReq.setPayment(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(frequentIds.size())).setScale(2)); + projectOrderCreateReq.setTotalPrice(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(frequentIds.size())).setScale(2, BigDecimal.ROUND_HALF_UP)); + projectOrderCreateReq.setPerformId(fPerformSeatInfo.getPerformId()); + projectOrderCreateReq.setProjectId(projectId.toString()); + projectOrderCreateReq.setPrivilegeCodeList(new ArrayList<>()); + projectOrderCreateReq.setAudienceCount(frequentIds.size()); + projectOrderCreateReq.setFrequentIds(frequentIds); + projectOrderCreateReq.setSeatPlanIds(Collections.singletonList(fPerformSeatInfo.getSeatPlanId())); + projectOrderCreateReq.setBlackBox("0"); + projectOrderCreateReq.setCombineTicketVos(null); + projectOrderCreateReq.setOrdinaryTicketVos(null); + for (int i = 1; i <= 10; i++) { + ProjectOrderCreateResp projectOrder = httpRequestHelper.fetchWithRetry(() -> performServiceHttp.createProjectOrder(projectOrderCreateReq, availableUser.get(0).getToken()), "create-project-order"); + if (Objects.nonNull(projectOrder)) { + log.info("下单成功,订单信息:{}", JSONObject.toJSONString(projectOrder)); + String msg = "【芬玩岛】下单成功✅✅✅,演出名称:" + performByProjectId.getProjectName() + ",请在2分钟内完成付款!"; + dingTalkService.sendScriptMsg(msg); + return Boolean.TRUE; + } + } + } + return Boolean.FALSE; + } + + @Override + public List getAvailablePerform() { + return fwdPerformConfigMapper.getAvailablePerform(); + } + + @Override + public Boolean updateProjectInfo(FPerformProjectInfo projectInfo) { + return fwdPerformProjectInfoMapper.update(projectInfo) > 0; + } + + @Override + public FPerformSeatInfo getSeatInfoBySeatId(Long seatId) { + return fwdPerformSeatInfoMapper.getBySeatPlanId(seatId); + } + + @Override + public Boolean updateSeatInfo(FPerformSeatInfo seatInfoBySeatId) { + return fwdPerformSeatInfoMapper.update(seatInfoBySeatId) > 0; + } + + @Override + public Boolean addSeatInfo(FPerformSeatInfo fPerformSeatInfo) { + return fwdPerformSeatInfoMapper.batchSave(Collections.singletonList(fPerformSeatInfo)) > 0; + } + + @Override + public Boolean updateTokenByName(String name, String token) { + FUserConfig userByName = fwdUserConfigMapper.getUserByName(name); + if (Objects.isNull(userByName)) { + FUserConfig fUserConfig = new FUserConfig(); + fUserConfig.setName(name); + fUserConfig.setToken(token); + fUserConfig.setStatus(1); + return fwdUserConfigMapper.insert(fUserConfig) > 0; + } else { + return fwdUserConfigMapper.updateTokenByName(name, token) > 0; + } + } +} diff --git a/script/src/main/java/com/xiang/xservice/glados/schedule/GladosCheckInJob.java b/script/src/main/java/com/xiang/xservice/glados/schedule/GladosCheckInJob.java index 02d76bf..631df26 100644 --- a/script/src/main/java/com/xiang/xservice/glados/schedule/GladosCheckInJob.java +++ b/script/src/main/java/com/xiang/xservice/glados/schedule/GladosCheckInJob.java @@ -20,7 +20,6 @@ public class GladosCheckInJob { private final GLaDOSService glaDOSService; @Scheduled(cron = "0 0 8,16 1/1 * ?") -// @Scheduled(cron = "0 0/1 * * * ?") public void checkInJon() { log.info("[job] Glados Check In Job start, time:{}", LocalDateTime.now()); glaDOSService.checkIn(); diff --git a/script/src/main/java/com/xiang/xservice/glados/service/DingTalkScriptGladosService.java b/script/src/main/java/com/xiang/xservice/glados/service/DingTalkScriptGladosService.java new file mode 100644 index 0000000..646eccf --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/glados/service/DingTalkScriptGladosService.java @@ -0,0 +1,33 @@ +package com.xiang.xservice.glados.service; + +import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService; +import com.xiang.xservice.config.DingTalkRobotScriptConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @Author: xiang + * @Date: 2025-08-07 10:30 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class DingTalkScriptGladosService { + + private final DingTalkService dingTalkService; + private final DingTalkRobotScriptConfig dingTalkRobotScriptConfig; + + /** + * 发送脚本消息 + * @param msg 消息 + */ + public void sendScriptMsg(String msg) { + try { + dingTalkService.sendRobotMessage(dingTalkRobotScriptConfig.getSecret(), dingTalkRobotScriptConfig.getToken(), + dingTalkRobotScriptConfig.getUsers(), msg); + } catch (Exception e) { + log.error("信息发送异常, 信息:{}", msg, e); + } + } +} diff --git a/script/src/main/java/com/xiang/xservice/glados/service/GLaDOSServiceImpl.java b/script/src/main/java/com/xiang/xservice/glados/service/GLaDOSServiceImpl.java index 18fbb0f..1e470ef 100644 --- a/script/src/main/java/com/xiang/xservice/glados/service/GLaDOSServiceImpl.java +++ b/script/src/main/java/com/xiang/xservice/glados/service/GLaDOSServiceImpl.java @@ -3,16 +3,14 @@ package com.xiang.xservice.glados.service; import com.alibaba.fastjson2.JSONObject; import com.google.common.collect.Maps; import com.xiang.xservice.basic.utils.HttpUtils; -import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService; import com.xiang.xservice.glados.common.GladosConstants; import com.xiang.xservice.glados.common.URLConstants; import com.xiang.xservice.glados.entity.GladosRunLog; -import com.xiang.xservice.xb.entity.pojo.User; import com.xiang.xservice.glados.entity.resp.GLaDOSResponse; import com.xiang.xservice.glados.repository.GladosMapper; +import com.xiang.xservice.xb.entity.pojo.User; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -33,13 +31,7 @@ public class GLaDOSServiceImpl implements GLaDOSService{ private final GladosMapper gladosMapper; - private final DingTalkService dingTalkService; - - @Value("${DingTalk.userList}") - private String userList; - - @Value("${DingTalk.chatId}") - private String chatId; + private final DingTalkScriptGladosService dingTalkService; /** * 签到 @@ -84,7 +76,7 @@ public class GLaDOSServiceImpl implements GLaDOSService{ log.info("签到成功, 签到积分:{}, 签到消息:{}", gLaDOSResponse.getPoints(), gLaDOSResponse.getMessage()); sb.append(user.getEmail()).append("签到成功,获得积分:").append(gLaDOSResponse.getPoints()).append("\n"); try { - dingTalkService.sendChatMessage(chatId, "[时间:" + LocalDateTime.now() + "] 用户: " + + dingTalkService.sendScriptMsg("[时间:" + LocalDateTime.now() + "] 用户: " + user.getEmail() + "签到成功,获得积分:" + gLaDOSResponse.getPoints()); } catch (Exception e) { log.error("发送钉钉消息失败", e); @@ -98,7 +90,7 @@ public class GLaDOSServiceImpl implements GLaDOSService{ log.warn("签到失败,用户:{}, cookie过期:{}", user.getEmail(), gLaDOSResponse.getMessage()); String message = "[时间:" + LocalDateTime.now() + "] 用户: " + user.getEmail() + ",签到消息: " + gLaDOSResponse.getMessage(); try { - dingTalkService.sendChatMessage(chatId, message); + dingTalkService.sendScriptMsg(message); } catch (Exception e) { log.error("发送钉钉消息失败", e); } diff --git a/script/src/main/java/com/xiang/xservice/jntyzx/service/JntyzxServiceImpl.java b/script/src/main/java/com/xiang/xservice/jntyzx/service/JntyzxServiceImpl.java index ce5e291..cdbf235 100644 --- a/script/src/main/java/com/xiang/xservice/jntyzx/service/JntyzxServiceImpl.java +++ b/script/src/main/java/com/xiang/xservice/jntyzx/service/JntyzxServiceImpl.java @@ -33,7 +33,7 @@ public class JntyzxServiceImpl implements JntyzxService{ private final DingTalkService dingTalkService; - @Value("${DingTalk.chatId}") + @Value("${dingtalk.chatId}") private String chatId; @Override diff --git a/script/src/main/java/com/xiang/xservice/xb/schedule/jntyzx/QueryVenueJob.java b/script/src/main/java/com/xiang/xservice/xb/schedule/jntyzx/QueryVenueJob.java deleted file mode 100644 index 4bd7e10..0000000 --- a/script/src/main/java/com/xiang/xservice/xb/schedule/jntyzx/QueryVenueJob.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.xiang.xservice.xb.schedule.jntyzx; - -import com.xiang.xservice.jntyzx.service.JntyzxService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * @Author: xiang - * @Date: 2025-05-14 15:34 - */ -@Component -@RequiredArgsConstructor -@Slf4j -public class QueryVenueJob { - private final JntyzxService jntyzxService; - -// @Scheduled(cron = "0 0 14 1/1 * ?") - public void query() throws Exception{ - log.info("[查询场地] 查询当天场地定时任务启动!"); - jntyzxService.queryAvailable(); - log.info("[查询场地] 查询当天场地定时任务结束!"); - } -} diff --git a/script/src/main/java/com/xiang/xservice/xb/schedule/xb/FundCountJob.java b/script/src/main/java/com/xiang/xservice/xb/schedule/xb/FundCountJob.java index 0cc9e02..04f7b32 100644 --- a/script/src/main/java/com/xiang/xservice/xb/schedule/xb/FundCountJob.java +++ b/script/src/main/java/com/xiang/xservice/xb/schedule/xb/FundCountJob.java @@ -2,16 +2,15 @@ package com.xiang.xservice.xb.schedule.xb; import com.alibaba.fastjson2.JSONObject; import com.google.common.collect.Lists; -import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService; import com.xiang.xservice.xb.entity.pojo.xb.XbFundCount; import com.xiang.xservice.xb.entity.pojo.xb.XbFundList; import com.xiang.xservice.xb.entity.response.xbyj.fund.FundList; +import com.xiang.xservice.xb.service.DingTalkRobotService; import com.xiang.xservice.xb.service.FundService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -37,9 +36,7 @@ import java.util.stream.Collectors; public class FundCountJob { private final FundService fundService; - private final DingTalkService dingTalkService; - @Value("${DingTalk.chatId}") - private String chatId; + private final DingTalkRobotService dingTalkService; @Scheduled(cron = "0 0 22 * * ?") public void countFundJob() { // 周六周日过滤 @@ -61,7 +58,7 @@ public class FundCountJob { xbFundCount.setLId(xbFundList.getId()); xbFundCount.setCode(xbFundList.getCode()); xbFundCount.setName(xbFundList.getName()); - xbFundCount.setChange(fund.get(0).getChange()); + xbFundCount.setChange(fund.get(0).getChange().multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP)); xbFundCount.setUpdateTime(LocalDateTime.now()); counts.add(xbFundCount); } @@ -96,7 +93,7 @@ public class FundCountJob { sb.append("【").append(fundCounts.get(0).getName()).append("】本周平均涨跌幅为:").append(avg).append("\n"); }); if (StringUtils.isNotBlank(sb)) { - dingTalkService.sendChatMessage(chatId, sb.toString()); + dingTalkService.sendXbMsg(sb.toString()); } log.info("==========================[基金统计] 基金本周涨跌幅消息发送定时任务结束!=========================="); } diff --git a/script/src/main/java/com/xiang/xservice/xb/schedule/xb/FundInfoQueryJob.java b/script/src/main/java/com/xiang/xservice/xb/schedule/xb/FundInfoQueryJob.java index 2999aaf..207b33b 100644 --- a/script/src/main/java/com/xiang/xservice/xb/schedule/xb/FundInfoQueryJob.java +++ b/script/src/main/java/com/xiang/xservice/xb/schedule/xb/FundInfoQueryJob.java @@ -25,7 +25,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; -import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -59,113 +58,13 @@ public class FundInfoQueryJob { new ThreadPoolExecutor.AbortPolicy()); @Value("${xiaobei.codeArr}") private String codeArr; - @Value("${DingTalk.chatId}") + @Value("${dingtalk.chatId}") private String chatId; - /** - * 基金增长定时任务查询 - * 半个小时一次 9点开始到3.30结束 - */ - @Scheduled(cron = "0 1,31 9,10,11,13,14 * * ? ") - public void queryFundJob() throws Exception { - // 周六周日过滤 - if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || - Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { - return; - } - log.info("==========================[基金查询] 基金查询定时任务启动!=========================="); - List result = queryFund(1); - if (CollectionUtils.isEmpty(result)) { - return; - } - log.info("查询的基金涨跌幅数据:{}", JSONObject.toJSONString(result)); - result = result.stream().sorted(Comparator.comparing(FundMessage::getChange)).collect(Collectors.toList()); - StringBuilder sb = new StringBuilder("今天的A股行情:"); - for (FundMessage fundMessage : result) { - sb.append("基金名称:") - .append(fundMessage.getName()) - .append("于") - .append(fundMessage.getUpdate()) - .append("更新涨跌幅:") - .append(fundMessage.getChange() - .multiply(new BigDecimal("100")) - .setScale(2, RoundingMode.HALF_UP).toString()) - .append("%\n"); - } - dingTalkService.sendChatMessage(chatId, sb.toString()); - log.info("==========================[基金查询] 基金查询定时任务结束!=========================="); - } - /** - * 基金增长定时任务查询 - * 半个小时一次 9点开始到3.30结束 - */ - @Scheduled(cron = "0 0 9 * * ? ") - public void queryFundJob3() throws Exception { - // 周六周日过滤 - if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || - Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { - return; - } - log.info("==========================[基金查询] 基金查询定时任务启动!=========================="); - List result = queryFund(3); - if (CollectionUtils.isEmpty(result)) { - return; - } - log.info("查询的美股基金涨跌幅数据:{}", JSONObject.toJSONString(result)); - result = result.stream().sorted(Comparator.comparing(FundMessage::getChange)).collect(Collectors.toList()); - StringBuilder sb = new StringBuilder("今天的美股行情:\n"); - for (FundMessage fundMessage : result) { - sb.append("基金名称:") - .append(fundMessage.getName()) - .append("于") - .append(fundMessage.getUpdate()) - .append("更新涨跌幅:") - .append(fundMessage.getChange() - .multiply(new BigDecimal("100")) - .setScale(2, RoundingMode.HALF_UP).toString()) - .append("%\n"); - } - dingTalkService.sendChatMessage(chatId, sb.toString()); - log.info("==========================[基金查询] 基金查询定时任务结束!=========================="); - } - /** - * 基金增长定时任务查询 - * 半个小时一次 9点开始到3.30结束 - */ - @Scheduled(cron = "0 1,31 9,10,11,13,14,15 * * ? ") - public void queryFundJob2() throws Exception { - // 周六周日过滤 - if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || - Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { - return; - } - log.info("==========================[基金查询] 基金查询定时任务启动!=========================="); - List result = queryFund(2); - if (CollectionUtils.isEmpty(result)) { - return; - } - log.info("查询的港股基金涨跌幅数据:{}", JSONObject.toJSONString(result)); - result = result.stream().sorted(Comparator.comparing(FundMessage::getChange)).collect(Collectors.toList()); - StringBuilder sb = new StringBuilder("今天的美股行情:\n"); - for (FundMessage fundMessage : result) { - sb.append("基金名称:") - .append(fundMessage.getName()) - .append("于") - .append(fundMessage.getUpdate()) - .append("更新涨跌幅:") - .append(fundMessage.getChange() - .multiply(new BigDecimal("100")) - .setScale(2, RoundingMode.HALF_UP).toString()) - .append("%\n"); - } - dingTalkService.sendChatMessage(chatId, sb.toString()); - log.info("==========================[基金查询] 基金查询定时任务结束!=========================="); - } - /** * 基金涨跌幅5分钟超过2%重点通知 */ - @Scheduled(cron = "0 0/5 * * * ? ") + @Scheduled(cron = "0 0/5 9,10,11,13,14,15 * * ? ") public void queryFundEmergencyJob() throws Exception { // 周六周日过滤 if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || diff --git a/script/src/main/java/com/xiang/xservice/xb/schedule/xb/FundMsgReportJob.java b/script/src/main/java/com/xiang/xservice/xb/schedule/xb/FundMsgReportJob.java new file mode 100644 index 0000000..f28f36b --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/xb/schedule/xb/FundMsgReportJob.java @@ -0,0 +1,144 @@ +package com.xiang.xservice.xb.schedule.xb; + +import com.alibaba.fastjson.JSON; +import com.xiang.xservice.xb.entity.pojo.xb.XbFundList; +import com.xiang.xservice.xb.entity.response.xbyj.fund.FundList; +import com.xiang.xservice.xb.service.DingTalkRobotService; +import com.xiang.xservice.xb.service.FundService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @Author: xiang + * @Date: 2025-07-31 18:10 + */ +@Component +@Slf4j +@RestController +@RequiredArgsConstructor +public class FundMsgReportJob { + + private final FundService fundService; + private final DingTalkRobotService dingTalkService; + private static final Integer TYPE_A = 1; + private static final Integer TYPE_M = 3; + private static final Integer TYPE_G = 2; + + @Scheduled(cron = "0 1,31 9,10,11,13,14 * * ?") + @PostMapping("/asdasda") + public void fundReport4A() { + log.info("===========A股基金变化通知!==========="); + // 周六周日过滤 + if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || + Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { + log.info("当前时间为:{}", LocalDateTime.now()); + return; + } + List fundLists = fundService.queryFundList(TYPE_A); + if (CollectionUtils.isEmpty(fundLists)) { + log.info("查询配置的A股信息为空"); + return; + } + Map fundMap = fundLists.stream().collect(Collectors.toMap(XbFundList::getCode, Function.identity(), (a, b) -> a)); + String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + List funds = fundService.queryTodayList(date, "2", Boolean.TRUE, new ArrayList<>(fundMap.keySet())); + if (CollectionUtils.isEmpty(funds)) { + log.info("http请求查询基金信息为空"); + return; + } + log.info("http查询基金信息:{}", JSON.toJSONString(funds)); + StringBuilder msg = new StringBuilder(date).append("===》A股基金变化通知:\n"); + buildMsg(funds, fundMap, msg); + dingTalkService.sendXbMsg(msg.toString()); + } + + @Scheduled(cron = "0 1,31 9,10,11,13,14,15 * * ?") + public void fundReport4G() { + log.info("===========港股基金变化通知!==========="); + // 周六周日过滤 + if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || + Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { + log.info("当前时间为:{}", LocalDateTime.now()); + return; + } + List fundLists = fundService.queryFundList(TYPE_G); + if (CollectionUtils.isEmpty(fundLists)) { + log.info("查询配置的港股信息为空"); + return; + } + Map fundMap = fundLists.stream().collect(Collectors.toMap(XbFundList::getCode, Function.identity(), (a, b) -> a)); + String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + List funds = fundService.queryTodayList(date, "2", Boolean.TRUE, new ArrayList<>(fundMap.keySet())); + if (CollectionUtils.isEmpty(funds)) { + log.info("http请求查询基金信息为空"); + return; + } + log.info("http查询港股基金信息:{}", JSON.toJSONString(funds)); + StringBuilder msg = new StringBuilder(date).append("===》港股基金变化通知:\n"); + buildMsg(funds, fundMap, msg); + dingTalkService.sendXbMsg(msg.toString()); + } + + @Scheduled(cron = "0 0 9 * * ?") + public void fundReport4M() { + log.info("===========美股基金变化通知!==========="); + // 周六周日过滤 + if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || + Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { + log.info("当前时间为:{}", LocalDateTime.now()); + return; + } + List fundLists = fundService.queryFundList(TYPE_M); + if (CollectionUtils.isEmpty(fundLists)) { + log.info("查询配置的美股信息为空"); + return; + } + Map fundMap = fundLists.stream().collect(Collectors.toMap(XbFundList::getCode, Function.identity(), (a, b) -> a)); + String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + List funds = fundService.queryTodayList(date, "2", Boolean.TRUE, new ArrayList<>(fundMap.keySet())); + if (CollectionUtils.isEmpty(funds)) { + log.info("http请求查询基金信息为空"); + return; + } + log.info("http查询美股基金信息:{}", JSON.toJSONString(funds)); + StringBuilder msg = new StringBuilder(date).append("===》美股基金变化通知:\n"); + buildMsg(funds, fundMap, msg); + dingTalkService.sendXbMsg(msg.toString()); + } + + private static void buildMsg(List funds, Map fundMap, StringBuilder msg) { + funds = funds.stream().sorted(Comparator.comparing(FundList::getChange).reversed()) + .collect(Collectors.toList()); + for (FundList fund : funds) { + if (fundMap.containsKey(fund.getCode())) { + XbFundList fundList = fundMap.get(fund.getCode()); + msg.append("基金名称:") + .append(fundList.getName()) + .append("涨跌幅:") + .append(fund.getChange() + .multiply(new BigDecimal("100")) + .setScale(2, RoundingMode.HALF_UP)) + .append("\n"); + } + } + } +} diff --git a/script/src/main/java/com/xiang/xservice/xb/service/DingTalkRobotService.java b/script/src/main/java/com/xiang/xservice/xb/service/DingTalkRobotService.java new file mode 100644 index 0000000..69d41b4 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/xb/service/DingTalkRobotService.java @@ -0,0 +1,31 @@ +package com.xiang.xservice.xb.service; + +import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService; +import com.xiang.xservice.config.DingTalkRobotXbConfig; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @Author: xiang + * @Date: 2025-08-07 11:02 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class DingTalkRobotService { + private final DingTalkService dingTalkService; + private final DingTalkRobotXbConfig dingTalkRobotConfig; + + /** + * 发送脚本消息 + * @param msg 消息 + */ + public void sendXbMsg(String msg) { + try { + dingTalkService.sendRobotMessage(dingTalkRobotConfig.getSecret(), dingTalkRobotConfig.getToken(), dingTalkRobotConfig.getUsers(), msg); + } catch (Exception e) { + log.error("信息发送异常, 信息:{}", msg, e); + } + } +} diff --git a/script/src/main/java/com/xiang/xservice/xb/service/FundServiceImpl.java b/script/src/main/java/com/xiang/xservice/xb/service/FundServiceImpl.java index d43e741..fd0fb75 100644 --- a/script/src/main/java/com/xiang/xservice/xb/service/FundServiceImpl.java +++ b/script/src/main/java/com/xiang/xservice/xb/service/FundServiceImpl.java @@ -65,7 +65,7 @@ public class FundServiceImpl implements FundService{ if (StringUtils.isNotBlank(resp)) { QueryFundListResponse response = JSONObject.parseObject(resp, QueryFundListResponse.class); if (Objects.nonNull(response)) { - if (Objects.equals(SUCCESS_0, response.getCode())) { + if (Objects.equals(SUCCESS_200, response.getCode())) { return response.getData(); } } diff --git a/script/src/main/resources/application-local.yml b/script/src/main/resources/application-local.yml index f30a80e..49718f7 100644 --- a/script/src/main/resources/application-local.yml +++ b/script/src/main/resources/application-local.yml @@ -1,8 +1,8 @@ spring: datasource: - url: jdbc:mysql://120.27.153.87:3306/xservice-script-test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true + url: jdbc:mysql://rm-bp1j371yx9d9894ewbo.mysql.rds.aliyuncs.com:3306/xservice-script-test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true username: root - password: 123456 + password: xb#UWqnhH24&XpX driver-class-name: com.mysql.cj.jdbc.Driver redis: host: r-bp1dqqbzlfw04fldp3pd.redis.rds.aliyuncs.com @@ -16,7 +16,25 @@ spring: max-idle: 8 min-idle: 0 max-wait: 1000 + aliyun: dns: RR: - local + +dingtalk: + # 钉钉消息用户,用逗号隔开 + userList: "450841600726084717" + # 钉钉消息群ID,需要调用/chat/create api创建群返回 + chatId: "chatd16d8daeea33b36b73588c676d508096" + robot: + script: + token: 797be7f32062e31dec1d567f8b490a5649a5366083618e236c7a1263df1f4af3 + secret: SEC9aca642c0c29c9da261462869c464d34623247583d98fc82343a0a4464abbe91 + users: + - 450841600726084717 + xb: + token: ad21ead99f0fdc63aa00d6732b7b0888c17590f7612c68297edfcb71844d1437 + secret: SECc09d8aad6635f1a4cbadb7c0ab365523c46299f138438cd885e445e0f5f4d730 + users: + - 450841600726084717 \ No newline at end of file diff --git a/script/src/main/resources/application-prod.yml b/script/src/main/resources/application-prod.yml index 30da4e8..fe4c04d 100644 --- a/script/src/main/resources/application-prod.yml +++ b/script/src/main/resources/application-prod.yml @@ -21,4 +21,21 @@ aliyun: dns: RR: - client - - file \ No newline at end of file + - file + +DingTalk: + # 钉钉消息用户,用逗号隔开 + userList: "450841600726084717" + # 钉钉消息群ID,需要调用/chat/create api创建群返回 + chatId: "chatd16d8daeea33b36b73588c676d508096" + robot: + script: + token: 4709b708d961846e0aee523c5abc3b67e8fa424ee292501d85efd4e504f15a8b + secret: SEC768ed578c0fb31a9aec84b1c1db4f195f5aca203985bbb9d549e23e41c8874d1 + userIds: + - 450841600726084717 + xb: + token: 340a9d39a5b0b6a52ba2262f9c27179cf50e3c8cfe6883ca082649d306038f41 + secret: ad21ead99f0fdc63aa00d6732b7b0888c17590f7612c68297edfcb71844d1437 + userIds: + - 450841600726084717 \ No newline at end of file diff --git a/script/src/main/resources/application-test.yml b/script/src/main/resources/application-test.yml index 297b5fd..380b989 100644 --- a/script/src/main/resources/application-test.yml +++ b/script/src/main/resources/application-test.yml @@ -1,8 +1,8 @@ spring: datasource: - url: jdbc:mysql://172.28.159.213:3306/xservice-script?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true + url: jdbc:mysql://rm-bp1j371yx9d9894ewbo.mysql.rds.aliyuncs.com:3306/xservice-script-test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true username: root - password: 123456 + password: xb#UWqnhH24&XpX driver-class-name: com.mysql.cj.jdbc.Driver redis: host: r-bp1dqqbzlfw04fldp3pd.redis.rds.aliyuncs.com @@ -20,4 +20,21 @@ spring: aliyun: dns: RR: - - test \ No newline at end of file + - test + +DingTalk: + # 钉钉消息用户,用逗号隔开 + userList: "450841600726084717" + # 钉钉消息群ID,需要调用/chat/create api创建群返回 + chatId: "chatd16d8daeea33b36b73588c676d508096" + robot: + script: + token: 797be7f32062e31dec1d567f8b490a5649a5366083618e236c7a1263df1f4af3 + secret: SEC9aca642c0c29c9da261462869c464d34623247583d98fc82343a0a4464abbe91 + userIds: + - 450841600726084717 + xb: + token: ad21ead99f0fdc63aa00d6732b7b0888c17590f7612c68297edfcb71844d1437 + secret: SECc09d8aad6635f1a4cbadb7c0ab365523c46299f138438cd885e445e0f5f4d730 + userIds: + - 450841600726084717 \ No newline at end of file diff --git a/script/src/main/resources/application.yml b/script/src/main/resources/application.yml index cdfd58a..9d81df6 100644 --- a/script/src/main/resources/application.yml +++ b/script/src/main/resources/application.yml @@ -1,15 +1,10 @@ mybatis: mapper-locations: - classpath*:mapper/*/*.xml + - classpath*:mapper/*.xml configuration: map-underscore-to-camel-case: true -DingTalk: - # 钉钉消息用户,用逗号隔开 - userList: "450841600726084717" - # 钉钉消息群ID,需要调用/chat/create api创建群返回 - chatId: "chatd16d8daeea33b36b73588c676d508096" - xiaobei: unionId: o896o5y8bJZYMh2gdKhDdmUKc0Wk codeArr: "010364, 022150, 013224, 008960, 013841, 015528, 012414, 020412, 014662, 016814, 014422, 015596, 007844, @@ -21,4 +16,8 @@ server: spring: profiles: - active: local \ No newline at end of file + active: local + +http: + maxAttempts: 10 + sleepMs: 200 \ No newline at end of file diff --git a/script/src/main/resources/mapper/fwd/FwdAudienceConfigMapper.xml b/script/src/main/resources/mapper/fwd/FwdAudienceConfigMapper.xml new file mode 100644 index 0000000..3215229 --- /dev/null +++ b/script/src/main/resources/mapper/fwd/FwdAudienceConfigMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + id, frequent_id, frequent_name, status,frequent_no,frequent_phone,del_flag,user_id + + + + delete + from fwd_audience_config + where user_id = #{user_id} + + + + INSERT INTO fwd_audience_config ( + status, + frequent_id, + frequent_name, + frequent_no, + frequent_phone, + del_flag, + user_id + ) + VALUES + + ( + #{item.status}, + #{item.frequentId}, + #{item.frequentName}, + #{item.frequentNo}, + #{item.frequentPhone}, + #{item.delFlag}, + #{item.userId} + ) + + + + + \ No newline at end of file diff --git a/script/src/main/resources/mapper/fwd/FwdPerformConfigMapper.xml b/script/src/main/resources/mapper/fwd/FwdPerformConfigMapper.xml new file mode 100644 index 0000000..dd55130 --- /dev/null +++ b/script/src/main/resources/mapper/fwd/FwdPerformConfigMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + id, project_id, time, del_flag + + + + update fwd_perform_config set del_flag = 1 where 1=1 + + + + insert into fwd_perform_config(project_id, time, del_flag) + values + + (#{item.projectId}, #{item.time}, #{item.delFlag}) + + + + + \ No newline at end of file diff --git a/script/src/main/resources/mapper/fwd/FwdPerformProjectInfoMapper.xml b/script/src/main/resources/mapper/fwd/FwdPerformProjectInfoMapper.xml new file mode 100644 index 0000000..3bbbb70 --- /dev/null +++ b/script/src/main/resources/mapper/fwd/FwdPerformProjectInfoMapper.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, project_name, + status, + project_source, + is_has_seat, + is_choice_seat, + biz_id, + project_id, + tag_name, + tag_remark, + project_city, + short_city, + venue_name, + lowest_price, + highest_price, + project_price, + project_start_date, + project_end_date, + sub_classify_name, + pre_sale_time + + + + INSERT INTO fwd_perform_project_info + + + project_name, + + + status, + + + project_source, + + + is_has_seat, + + + is_choice_seat, + + + biz_id, + + + project_id, + + + tag_name, + + + tag_remark, + + + project_city, + + + short_city, + + + venue_name, + + + lowest_price, + + + highest_price, + + + project_price, + + + project_start_date, + + + project_end_date, + + + sub_classify_name, + + + pre_sale_time + + + + + #{projectName}, + + + #{status}, + + + #{projectSource}, + + + #{isHasSeat}, + + + #{isChoiceSeat}, + + + #{bizId}, + + + #{projectId}, + + + #{tagName}, + + + #{tagRemark}, + + + #{projectCity}, + + + #{shortCity}, + + + #{venueName}, + + + #{lowestPrice}, + + + #{highestPrice}, + + + #{projectPrice}, + + + #{projectStartDate}, + + + #{projectEndDate}, + + + #{subClassifyName}, + + + #{preSaleTime} + + + + + + UPDATE fwd_perform_project_info + + project_name = #{projectName}, + status = #{status}, + project_source = #{projectSource}, + is_has_seat = #{isHasSeat}, + is_choice_seat = #{isChoiceSeat}, + biz_id = #{bizId}, + project_id = #{projectId}, + tag_name = #{tagName}, + tag_remark = #{tagRemark}, + project_city = #{projectCity}, + short_city = #{shortCity}, + venue_name = #{venueName}, + lowest_price = #{lowestPrice}, + highest_price = #{highestPrice}, + project_price = #{projectPrice}, + project_start_date = #{projectStartDate}, + project_end_date = #{projectEndDate}, + sub_classify_name = #{subClassifyName}, + pre_sale_time = #{preSaleTime} + + WHERE id = #{id} + + + + + + \ No newline at end of file diff --git a/script/src/main/resources/mapper/fwd/FwdPerformProjectSeatInfoMapper.xml b/script/src/main/resources/mapper/fwd/FwdPerformProjectSeatInfoMapper.xml new file mode 100644 index 0000000..4d14ee9 --- /dev/null +++ b/script/src/main/resources/mapper/fwd/FwdPerformProjectSeatInfoMapper.xml @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, seat_plan_id, + seat_plan_name, + perform_id, + perform_name, + stop_sale, + shelf_status, + price, + discount_price, + sub_status, + quantity, + 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, + sold_out + + + + INSERT INTO fwd_perform_seat_info + + + seat_plan_id, + + + seat_plan_name, + + + perform_id, + + + perform_name, + + + stop_sale, + + + shelf_status, + + + price, + + + discount_price, + + + sub_status, + + + quantity, + + + 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, + + + sold_out + + + + + #{seatPlanId}, + + + #{seatPlanName}, + + + #{performId}, + + + #{performName}, + + + #{stopSale}, + + + #{shelfStatus}, + + + #{price}, + + + #{discountPrice}, + + + #{subStatus}, + + + #{quantity}, + + + #{status}, + + + #{maxSellStock}, + + + #{soldStock}, + + + #{leftStock}, + + + #{ableSaleQuantity}, + + + #{ashShow}, + + + #{ashShowDesc}, + + + #{selectable}, + + + #{display}, + + + #{availableTicketQuantity}, + + + #{availableAllTicketQuantity}, + + + #{saleTime}, + + + #{projectId}, + + + #{soldOut}, + + + + + INSERT INTO fwd_perform_seat_info + ( + seat_plan_id, seat_plan_name, perform_id, perform_name, stop_sale, + shelf_status, price, discount_price, sub_status, quantity, + 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, sold_out + ) + VALUES + + ( + #{item.seatPlanId}, #{item.seatPlanName}, #{item.performId}, #{item.performName}, #{item.stopSale}, + #{item.shelfStatus}, #{item.price}, #{item.discountPrice}, #{item.subStatus}, #{item.quantity}, + #{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.soldOut} + ) + + + + + + + UPDATE fwd_perform_seat_info + + seat_plan_id = #{seatPlanId}, + seat_plan_name = #{seatPlanName}, + perform_id = #{performId}, + perform_name = #{performName}, + stop_sale = #{stopSale}, + shelf_status = #{shelfStatus}, + price = #{price}, + discount_price = #{discountPrice}, + sub_status = #{subStatus}, + quantity = #{quantity}, + status = #{status}, + max_sell_stock = #{maxSellStock}, + sold_stock = #{soldStock}, + left_stock = #{leftStock}, + able_sale_quantity = #{ableSaleQuantity}, + ash_show = #{ashShow}, + ash_show_desc = #{ashShowDesc}, + selectable = #{selectable}, + display = #{display}, + available_ticket_quantity = #{availableTicketQuantity}, + available_all_ticket_quantity = #{availableAllTicketQuantity}, + sale_time = #{saleTime}, + project_id = #{projectId}, + sold_out = #{soldOut} + + WHERE id = #{id} + + + + + + + \ No newline at end of file diff --git a/script/src/main/resources/mapper/fwd/FwdUserConfigMapper.xml b/script/src/main/resources/mapper/fwd/FwdUserConfigMapper.xml new file mode 100644 index 0000000..3c3913d --- /dev/null +++ b/script/src/main/resources/mapper/fwd/FwdUserConfigMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + id, name, token, status + + + insert into fwd_user_config (name, token, status) values (#{name}, #{token}, #{status}); + + + update fwd_user_config set token = #{token} where name = #{name} + + + + + + + + \ No newline at end of file