Merge pull request 'feat/robot_dev' (#5) from feat/robot_dev into master

Reviewed-on: XiangZ/xservice-script#5
This commit is contained in:
XiangZ
2025-08-07 03:22:10 +00:00
76 changed files with 3393 additions and 226 deletions

69
pom.xml
View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>com.xiang</groupId> <groupId>com.xiang</groupId>
<artifactId>xservice-basic</artifactId> <artifactId>xservice-basic</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.1</version>
</parent> </parent>
<groupId>com.xiang</groupId> <groupId>com.xiang</groupId>
@@ -30,68 +30,29 @@
<dependency> <dependency>
<groupId>com.xiang</groupId> <groupId>com.xiang</groupId>
<artifactId>xservice-common</artifactId> <artifactId>xservice-common</artifactId>
<version>1.0-snapshot</version> <version>1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.xiang</groupId> <groupId>com.xiang</groupId>
<artifactId>xservice-third-part</artifactId> <artifactId>xservice-message-starter</artifactId>
<version>1.0-snapshot</version> <version>2.0</version>
</dependency>
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>com.xiang</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>xservice-schedule-starter</artifactId>
<version>${spring.boot.version}</version> <version>1.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>com.xiang</groupId>
<artifactId>lombok</artifactId> <artifactId>xservice-cache-starter</artifactId>
<version>1.18.32</version> <version>1.1</version>
</dependency>
<dependency>
<groupId>com.xiang</groupId>
<artifactId>xservice-http-starter</artifactId>
<version>1.1</version>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.51</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.0.1-android</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.15.0</version>
</dependency>-->
</dependencies> </dependencies>
<build> <build>

View File

@@ -11,12 +11,12 @@
</parent> </parent>
<groupId>com.xiang</groupId> <groupId>com.xiang</groupId>
<version>1.0-SNAPSHOT</version> <version>1.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<artifactId>script</artifactId> <artifactId>script</artifactId>
<properties> <properties>
<java.version>1.8</java.version> <java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>

View File

@@ -1,7 +1,9 @@
package com.xiang; package com.xiang;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
/** /**
@@ -10,6 +12,14 @@ import org.springframework.scheduling.annotation.EnableScheduling;
*/ */
@SpringBootApplication @SpringBootApplication
@EnableScheduling @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 class ServiceScriptApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(ServiceScriptApplication.class, args); SpringApplication.run(ServiceScriptApplication.class, args);

View File

@@ -1,7 +1,9 @@
package com.xiang.xservice; package com.xiang.xservice;
import com.xiang.xservice.basic.common.resp.Result; import com.xiang.xservice.basic.common.resp.Result;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value; 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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@@ -12,8 +14,11 @@ import org.springframework.web.bind.annotation.RestController;
*/ */
@RestController @RestController
@RequestMapping("/system/demo") @RequestMapping("/system/demo")
@RequiredArgsConstructor
public class IndexController { public class IndexController {
private final RedisTemplate<String, String> redisTemplate;
@Value("${spring.profiles.active}") @Value("${spring.profiles.active}")
private String env; private String env;
@@ -28,4 +33,11 @@ public class IndexController {
String msg = "已激活环境:" + env + "web端口启用" + port + "使用datasource:" + url; String msg = "已激活环境:" + env + "web端口启用" + port + "使用datasource:" + url;
return Result.success(msg); return Result.success(msg);
} }
@GetMapping("/redisTest")
private Result<Void> redisTest() {
redisTemplate.opsForValue().set("2222", "231");
return Result.success("redis获取到key为test的值为" + redisTemplate.opsForValue().get("2222"));
}
} }

View File

@@ -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<String> users;
}

View File

@@ -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<String> users;
}

View File

@@ -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);
}
}
}

View File

@@ -8,11 +8,9 @@ import com.aliyun.alidns20150109.models.DescribeSubDomainRecordsResponse;
import com.aliyun.alidns20150109.models.DescribeSubDomainRecordsResponseBody; import com.aliyun.alidns20150109.models.DescribeSubDomainRecordsResponseBody;
import com.aliyun.alidns20150109.models.UpdateDomainRecordRequest; import com.aliyun.alidns20150109.models.UpdateDomainRecordRequest;
import com.aliyun.teaopenapi.models.Config; import com.aliyun.teaopenapi.models.Config;
import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService;
import com.xiang.xservice.domain.config.AliyunDnsPropertyConfig; import com.xiang.xservice.domain.config.AliyunDnsPropertyConfig;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
@@ -38,10 +36,7 @@ public class IDomainServiceImpl implements IDomainService {
private final AliyunDnsPropertyConfig aliyunDnsPropertyConfig; private final AliyunDnsPropertyConfig aliyunDnsPropertyConfig;
private static final String TYPE = "A"; private static final String TYPE = "A";
private final DingTalkService dingTalkService; private final DingTalkScriptDomainService dingTalkService;
@Value("${DingTalk.chatId}")
private String chatId;
@Override @Override
public void dynamicDomainAnalysis(String publicIp) throws Exception { public void dynamicDomainAnalysis(String publicIp) throws Exception {
Client client = createClient(); Client client = createClient();
@@ -58,14 +53,14 @@ public class IDomainServiceImpl implements IDomainService {
if (records.isEmpty()) { if (records.isEmpty()) {
log.info("未找到记录,添加记录..., ip:{}", publicIp); log.info("未找到记录,添加记录..., ip:{}", publicIp);
addDnsRecord(client, publicIp, rr); addDnsRecord(client, publicIp, rr);
dingTalkService.sendChatMessage(chatId, "动态解析公网ip成功域名" + rr + "." + DOMAIN_NAME + ", 新ip:" + publicIp); dingTalkService.sendScriptMsg("动态解析公网ip成功域名" + rr + "." + DOMAIN_NAME + ", 新ip:" + publicIp);
} else { } else {
String recordId = records.get(0).getRecordId(); String recordId = records.get(0).getRecordId();
String currentValue = records.get(0).getValue(); String currentValue = records.get(0).getValue();
if (!publicIp.equals(currentValue)) { if (!publicIp.equals(currentValue)) {
log.info("IP变更更新记录...,ip:{}", publicIp); log.info("IP变更更新记录...,ip:{}", publicIp);
updateDnsRecord(client, recordId, publicIp, rr); updateDnsRecord(client, recordId, publicIp, rr);
dingTalkService.sendChatMessage(chatId, "动态解析公网ip成功域名" + rr + "." + DOMAIN_NAME + ", 新ip:" + publicIp); dingTalkService.sendScriptMsg("动态解析公网ip成功域名" + rr + "." + DOMAIN_NAME + ", 新ip:" + publicIp);
} else { } else {
log.info("ip未变更无需修改ip:{}", publicIp); log.info("ip未变更无需修改ip:{}", publicIp);
} }

View File

@@ -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;
}

View File

@@ -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";
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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 {
}

View File

@@ -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<PrivilegeCode> privilegeCodeList;
private Integer audienceCount;
private List<Long> frequentIds;
private List<Long> seatPlanIds;
private String blackBox;
private String combineTicketVos;
private String ordinaryTicketVos;
}

View File

@@ -0,0 +1,18 @@
package com.xiang.xservice.fwd.entity.resp;
public class BaseResult<T> {
/**
* 响应码 10000成功
*/
private Long code;
/**
* 消息
*/
private String msg;
/**
* 数据
*/
private T data;
}

View File

@@ -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;
}

View File

@@ -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<String> specialRefundBeanRuleDtoList;
}

View File

@@ -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;
}

View File

@@ -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<Object> 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;
}

View File

@@ -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<String> dates;
private List<PerformInfo> performInfos;
}

View File

@@ -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> delivery;
private String isChoiceSeat;
private Integer ashShow;
private String ashShowDesc;
private Integer selectable;
private List<String> tags;
private List<String> tagsCustom;
private String subStatus;
private List<SeatPlan> 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;
}

View File

@@ -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<PerformDetail> performInfo;
}

View File

@@ -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<ProjectService> 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<Notice> ticketNotices;
private List<Notice> watchNotices;
private List<StandByNotice> standByNotices;
private String bkImg;
private Integer dialogFlag;
private String dialogTitle;
private String dialogContent;
private Integer isPrivilegeCode;
private Integer canBuyQuantity;
private String dialogButtonContent;
private List<String> 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;
}

View File

@@ -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;
}

View File

@@ -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<Ticket> 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;
}

View File

@@ -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<String> description;
private List<RefundRule> refundRuleList;
}

View File

@@ -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<ProjectList> 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;
}

View File

@@ -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<String> specialRefundBeanRuleDtoList;
}

View File

@@ -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<RefundRuleInfo> refundRules;
private String refundRuleUndeterminedStr;
}

View File

@@ -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;
}

View File

@@ -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<String> tags;
private List<String> tagsCustom;
private Integer availableTicketQuantity;
private Integer availableAllTicketQuantity;
private BigDecimal standbyServiceFeeRate;
private String saleTime;
}

View File

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

View File

@@ -0,0 +1,4 @@
package com.xiang.xservice.fwd.entity.resp.http.perform;
public class StandByNotice {
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<Object> 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;
}

View File

@@ -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<Object> 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;
}

View File

@@ -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<FAudienceConfig> getAudienceByUserId(Long userId);
int batchSave(List<FAudienceConfig> list);
int delByUserId(Long userId);
}

View File

@@ -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<FPerformConfig> getAvailablePerform();
int delPerforms();
int insertPerforms(List<FPerformConfig> list);
}

View File

@@ -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<FPerformProjectInfo> getPreSaleTodayData(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
}

View File

@@ -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<FPerformSeatInfo> fPerformSeatInfos);
int update(FPerformSeatInfo fPerformSeatInfo);
List<FPerformSeatInfo> getPerformSeatInfoBySeatIds(@Param("list") List<Long> seatIds);
FPerformSeatInfo getPerformSeatInfoBySeatIdAndPerformIdAndProjectId(
@Param("seatId") Long seatId, @Param("performId") Long performId, @Param("projectId") Long projectId);
List<FPerformSeatInfo> getPerformSeatByProjectId(Long projectId);
FPerformSeatInfo getBySeatPlanId(@Param("id") Long seatPlanId);
}

View File

@@ -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<FUserConfig> 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);
}

View File

@@ -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<ScheduledTaskEntity> 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<FPerformProjectInfo> 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<FPerformConfig> 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<String, Object> 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<ScheduledTaskEntity> 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<SeatPlan> seatPlans = performDetail.getSeatPlans();
Map<Long, SeatPlan> seatPlanMap = seatPlans.stream().collect(Collectors.toMap(SeatPlan::getSeatPlanId, Function.identity(), (a, b) -> a));
List<Long> seatPlanIds = seatPlans.stream().map(SeatPlan::getSeatPlanId).collect(Collectors.toList());
List<SeatPlanStatus> 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<String, Object> 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);
}
}

View File

@@ -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<FUserConfig> availableUser = userConfigMapper.getAvailableUser();
if (CollectionUtils.isEmpty(availableUser)) {
return;
}
availableUser.forEach(user -> {
List<AudienceMemberInfo> audienceMemberInfo = performServiceHttp.getAudienceMemberInfo(user.getToken());
if (CollectionUtils.isNotEmpty(audienceMemberInfo)) {
List<FAudienceConfig> 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<ProjectList> 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<PerformInfo> performInfos = performsByProjectIdFromHttp.getPerformInfos();
if (CollectionUtils.isEmpty(performInfos)) {
continue;
}
// 查询演出座位档次信息
List<FPerformSeatInfo> insertList = Lists.newCopyOnWriteArrayList();
List<FPerformSeatInfo> updateList = Lists.newCopyOnWriteArrayList();
for (PerformInfo performInfo : performInfos) {
List<PerformDetail> performs = performInfo.getPerformInfo();
if (CollectionUtils.isEmpty(performs)) {
continue;
}
for (PerformDetail perform : performs) {
if (CollectionUtils.isEmpty(perform.getSeatPlans())) {
continue;
}
List<Long> seatPlanIds = perform.getSeatPlans().stream().map(SeatPlan::getSeatPlanId).collect(Collectors.toList());
List<SeatPlanStatus> seatPlanStatusList = httpRequestHelper.fetchWithRetry(() -> performServiceHttp.getSeatPlanStatusFromHttp(seatPlanIds), "fetch-seat-plan-status");
if (CollectionUtils.isEmpty(seatPlanStatusList)) {
continue;
}
Map<Long, SeatPlanStatus> map = seatPlanStatusList.stream().collect(Collectors.toMap(SeatPlanStatus::getSeatPlanId, Function.identity(), (a, b) -> a));
Map<Long, FPerformSeatInfo> 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<FPerformSeatInfo> 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"));
}
}
}

View File

@@ -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<FUserConfig> availableUser = userConfigMapper.getAvailableUser();
if (CollectionUtils.isEmpty(availableUser)) {
return;
}
for (FUserConfig userConfig : availableUser) {
List<FAudienceConfig> 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());
}
}
}

View File

@@ -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<Void> refreshData() {
List<FPerformConfig> 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<PerformInfo> performInfos = performsByProjectIdFromHttp.getPerformInfos();
if (CollectionUtils.isEmpty(performInfos)) {
continue;
}
for (PerformInfo performInfo : performInfos) {
List<PerformDetail> performInfo1 = performInfo.getPerformInfo();
if (CollectionUtils.isEmpty(performInfo1)) {
continue;
}
for (PerformDetail performDetail : performInfo1) {
List<SeatPlan> seatPlans = performDetail.getSeatPlans();
if (CollectionUtils.isEmpty(seatPlans)) {
continue;
}
List<Long> seatIds = seatPlans.stream().map(SeatPlan::getSeatPlanId).collect(Collectors.toList());
List<SeatPlanStatus> seatPlanStatusFromHttp = performServiceHttp.getSeatPlanStatusFromHttp(seatIds);
if (CollectionUtils.isEmpty(seatPlanStatusFromHttp)) {
continue;
}
Map<Long, SeatPlanStatus> 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");
}
}

View File

@@ -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<Long> FREQUENT_IDS = List.of(50438548L, 35320661L, 50436621L, 50442739L);
@GetMapping("/getShowProjects")
public Result<ProjectsResp> getShowProjects() {
ProjectsResp showProjectsFromHttp = performServiceHttp.getShowProjectsFromHttp(new BaseRequest());
return Result.success("查询成功!", showProjectsFromHttp);
}
@GetMapping("/getProjectInfo/{id}")
public Result<Perform> getProjectInfo(@PathVariable("id") Long id) {
Perform performsByProjectIdFromHttp = performServiceHttp.getPerformsByProjectIdFromHttp(id);
return Result.success("查询成功!", performsByProjectIdFromHttp);
}
@GetMapping("/getPerformsByProjectIdFromHttp/{id}")
public Result<Perform> getPerformsByProjectIdFromHttp(@PathVariable("id") Long id) {
Perform performsByProjectIdFromHttp = performServiceHttp.getPerformsByProjectIdFromHttp(id);
return Result.success("查询成功!", performsByProjectIdFromHttp);
}
@PostMapping("/createOrder")
public Result<Void> createOrder(Long projectId) throws Exception {
if (performService.createProjectOrder(projectId, FREQUENT_IDS)) {
return Result.success("下单成功!");
}
return Result.error("下单失败!");
}
@GetMapping("/getSeatPlanStatus")
public Result<SeatPlanStatus> getSeatPlanStatu (@RequestParam List<Long> ids) {
List<SeatPlanStatus> seatPlanStatusFromHttp = performServiceHttp.getSeatPlanStatusFromHttp(ids);
return Result.success("查询成功!", seatPlanStatusFromHttp);
}
}

View File

@@ -0,0 +1,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<Void> updateUserTokenFromHttpProxy(@RequestParam Map<String, String> 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();
}
}

View File

@@ -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);
}
}
}

View File

@@ -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<FPerformSeatInfo> getPerformSeatInfoByProjectId(Long projectId);
Boolean createProjectOrder(Long projectId, List<Long> frequentIds) throws Exception;
List<FPerformConfig> getAvailablePerform();
Boolean updateProjectInfo(FPerformProjectInfo projectInfo);
FPerformSeatInfo getSeatInfoBySeatId(Long seatId);
Boolean updateSeatInfo(FPerformSeatInfo seatInfoBySeatId);
Boolean addSeatInfo(FPerformSeatInfo fPerformSeatInfo);
Boolean updateTokenByName(String name, String token);
}

View File

@@ -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<SeatPlanStatus> getSeatPlanStatusFromHttp(List<Long> seatPlanIds);
/**
* http请求查询观影人信息
* @param token
* @return
*/
List<AudienceMemberInfo> getAudienceMemberInfo(String token);
}

View File

@@ -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<String, String> 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<String, String> 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<String, String> 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<SeatPlanStatus> getSeatPlanStatusFromHttp(List<Long> seatPlanIds) {
StringBuilder seatIds = new StringBuilder();
for (Long seatPlanId : seatPlanIds) {
seatIds.append(seatPlanId).append(",");
}
Map<String, String> params = Maps.newHashMap();
params.put("seatPlanIds", seatIds.substring(0, seatIds.length() - 2));
params.put("type", "3");
String respStr = HttpUtils.doGet(UrlConstants.PROJECT_SEAT_STATUS_URL, buildFWDHeaders(UrlConstants.token), params);
if (StringUtils.isBlank(respStr)) {
return Lists.newArrayList();
}
log.info("【Http请求】 根据seatPlanIds:{}http请求查询演出座位信息结果:{}", seatPlanIds, respStr);
JSONObject resp = JSON.parseObject(respStr);
Integer code = (Integer) resp.get("code");
if (Objects.nonNull(code) && Objects.equals(code, CodeConstants.SUCCESS)) {
List<SeatPlanStatus> data = JSON.parseArray(resp.get("data").toString(), SeatPlanStatus.class);
if (CollectionUtils.isEmpty(data)) {
return Lists.newArrayList();
}
return data;
}
return Lists.newArrayList();
}
@Override
public List<AudienceMemberInfo> getAudienceMemberInfo(String token) {
Map<String, String> 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<AudienceMemberInfo> data = JSON.parseArray(resp.get("data").toString(), AudienceMemberInfo.class);
if (CollectionUtils.isEmpty(data)) {
return Lists.newArrayList();
}
return data;
}
return Lists.newArrayList();
}
private Map<String, String> buildFWDHeaders(String token) {
Map<String, String> headers = Maps.newHashMap();
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;
}
}

View File

@@ -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<FPerformSeatInfo> getPerformSeatInfoByProjectId(Long projectId) {
return fwdPerformSeatInfoMapper.getPerformSeatByProjectId(projectId);
}
@Override
public Boolean createProjectOrder(Long projectId, List<Long> frequentIds) throws Exception {
List<FUserConfig> 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<FPerformSeatInfo> 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<FPerformConfig> 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;
}
}
}

View File

@@ -20,7 +20,6 @@ public class GladosCheckInJob {
private final GLaDOSService glaDOSService; private final GLaDOSService glaDOSService;
@Scheduled(cron = "0 0 8,16 1/1 * ?") @Scheduled(cron = "0 0 8,16 1/1 * ?")
// @Scheduled(cron = "0 0/1 * * * ?")
public void checkInJon() { public void checkInJon() {
log.info("[job] Glados Check In Job start, time:{}", LocalDateTime.now()); log.info("[job] Glados Check In Job start, time:{}", LocalDateTime.now());
glaDOSService.checkIn(); glaDOSService.checkIn();

View File

@@ -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);
}
}
}

View File

@@ -3,16 +3,14 @@ package com.xiang.xservice.glados.service;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.xiang.xservice.basic.utils.HttpUtils; 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.GladosConstants;
import com.xiang.xservice.glados.common.URLConstants; import com.xiang.xservice.glados.common.URLConstants;
import com.xiang.xservice.glados.entity.GladosRunLog; 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.entity.resp.GLaDOSResponse;
import com.xiang.xservice.glados.repository.GladosMapper; import com.xiang.xservice.glados.repository.GladosMapper;
import com.xiang.xservice.xb.entity.pojo.User;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@@ -33,13 +31,7 @@ public class GLaDOSServiceImpl implements GLaDOSService{
private final GladosMapper gladosMapper; private final GladosMapper gladosMapper;
private final DingTalkService dingTalkService; private final DingTalkScriptGladosService dingTalkService;
@Value("${DingTalk.userList}")
private String userList;
@Value("${DingTalk.chatId}")
private String chatId;
/** /**
* 签到 * 签到
@@ -84,7 +76,7 @@ public class GLaDOSServiceImpl implements GLaDOSService{
log.info("签到成功, 签到积分:{}, 签到消息:{}", gLaDOSResponse.getPoints(), gLaDOSResponse.getMessage()); log.info("签到成功, 签到积分:{}, 签到消息:{}", gLaDOSResponse.getPoints(), gLaDOSResponse.getMessage());
sb.append(user.getEmail()).append("签到成功,获得积分:").append(gLaDOSResponse.getPoints()).append("\n"); sb.append(user.getEmail()).append("签到成功,获得积分:").append(gLaDOSResponse.getPoints()).append("\n");
try { try {
dingTalkService.sendChatMessage(chatId, "[时间:" + LocalDateTime.now() + "] 用户: " + dingTalkService.sendScriptMsg("[时间:" + LocalDateTime.now() + "] 用户: " +
user.getEmail() + "签到成功,获得积分:" + gLaDOSResponse.getPoints()); user.getEmail() + "签到成功,获得积分:" + gLaDOSResponse.getPoints());
} catch (Exception e) { } catch (Exception e) {
log.error("发送钉钉消息失败", e); log.error("发送钉钉消息失败", e);
@@ -98,7 +90,7 @@ public class GLaDOSServiceImpl implements GLaDOSService{
log.warn("签到失败,用户:{}, cookie过期:{}", user.getEmail(), gLaDOSResponse.getMessage()); log.warn("签到失败,用户:{}, cookie过期:{}", user.getEmail(), gLaDOSResponse.getMessage());
String message = "[时间:" + LocalDateTime.now() + "] 用户: " + user.getEmail() + ",签到消息: " + gLaDOSResponse.getMessage(); String message = "[时间:" + LocalDateTime.now() + "] 用户: " + user.getEmail() + ",签到消息: " + gLaDOSResponse.getMessage();
try { try {
dingTalkService.sendChatMessage(chatId, message); dingTalkService.sendScriptMsg(message);
} catch (Exception e) { } catch (Exception e) {
log.error("发送钉钉消息失败", e); log.error("发送钉钉消息失败", e);
} }

View File

@@ -33,7 +33,7 @@ public class JntyzxServiceImpl implements JntyzxService{
private final DingTalkService dingTalkService; private final DingTalkService dingTalkService;
@Value("${DingTalk.chatId}") @Value("${dingtalk.chatId}")
private String chatId; private String chatId;
@Override @Override

View File

@@ -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("[查询场地] 查询当天场地定时任务结束!");
}
}

View File

@@ -2,16 +2,15 @@ package com.xiang.xservice.xb.schedule.xb;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.Lists; 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.XbFundCount;
import com.xiang.xservice.xb.entity.pojo.xb.XbFundList; import com.xiang.xservice.xb.entity.pojo.xb.XbFundList;
import com.xiang.xservice.xb.entity.response.xbyj.fund.FundList; 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 com.xiang.xservice.xb.service.FundService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -37,9 +36,7 @@ import java.util.stream.Collectors;
public class FundCountJob { public class FundCountJob {
private final FundService fundService; private final FundService fundService;
private final DingTalkService dingTalkService; private final DingTalkRobotService dingTalkService;
@Value("${DingTalk.chatId}")
private String chatId;
@Scheduled(cron = "0 0 22 * * ?") @Scheduled(cron = "0 0 22 * * ?")
public void countFundJob() { public void countFundJob() {
// 周六周日过滤 // 周六周日过滤
@@ -61,7 +58,7 @@ public class FundCountJob {
xbFundCount.setLId(xbFundList.getId()); xbFundCount.setLId(xbFundList.getId());
xbFundCount.setCode(xbFundList.getCode()); xbFundCount.setCode(xbFundList.getCode());
xbFundCount.setName(xbFundList.getName()); 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()); xbFundCount.setUpdateTime(LocalDateTime.now());
counts.add(xbFundCount); counts.add(xbFundCount);
} }
@@ -96,7 +93,7 @@ public class FundCountJob {
sb.append("").append(fundCounts.get(0).getName()).append("】本周平均涨跌幅为:").append(avg).append("\n"); sb.append("").append(fundCounts.get(0).getName()).append("】本周平均涨跌幅为:").append(avg).append("\n");
}); });
if (StringUtils.isNotBlank(sb)) { if (StringUtils.isNotBlank(sb)) {
dingTalkService.sendChatMessage(chatId, sb.toString()); dingTalkService.sendXbMsg(sb.toString());
} }
log.info("==========================[基金统计] 基金本周涨跌幅消息发送定时任务结束!=========================="); log.info("==========================[基金统计] 基金本周涨跌幅消息发送定时任务结束!==========================");
} }

View File

@@ -25,7 +25,6 @@ import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@@ -59,113 +58,13 @@ public class FundInfoQueryJob {
new ThreadPoolExecutor.AbortPolicy()); new ThreadPoolExecutor.AbortPolicy());
@Value("${xiaobei.codeArr}") @Value("${xiaobei.codeArr}")
private String codeArr; private String codeArr;
@Value("${DingTalk.chatId}") @Value("${dingtalk.chatId}")
private String 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<FundMessage> 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<FundMessage> 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<FundMessage> 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%重点通知 * 基金涨跌幅5分钟超过2%重点通知
*/ */
@Scheduled(cron = "0 0/5 * * * ? ") @Scheduled(cron = "0 0/5 9,10,11,13,14,15 * * ? ")
public void queryFundEmergencyJob() throws Exception { public void queryFundEmergencyJob() throws Exception {
// 周六周日过滤 // 周六周日过滤
if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) ||

View File

@@ -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<XbFundList> fundLists = fundService.queryFundList(TYPE_A);
if (CollectionUtils.isEmpty(fundLists)) {
log.info("查询配置的A股信息为空");
return;
}
Map<String, XbFundList> fundMap = fundLists.stream().collect(Collectors.toMap(XbFundList::getCode, Function.identity(), (a, b) -> a));
String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
List<FundList> 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<XbFundList> fundLists = fundService.queryFundList(TYPE_G);
if (CollectionUtils.isEmpty(fundLists)) {
log.info("查询配置的港股信息为空");
return;
}
Map<String, XbFundList> fundMap = fundLists.stream().collect(Collectors.toMap(XbFundList::getCode, Function.identity(), (a, b) -> a));
String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
List<FundList> 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<XbFundList> fundLists = fundService.queryFundList(TYPE_M);
if (CollectionUtils.isEmpty(fundLists)) {
log.info("查询配置的美股信息为空");
return;
}
Map<String, XbFundList> fundMap = fundLists.stream().collect(Collectors.toMap(XbFundList::getCode, Function.identity(), (a, b) -> a));
String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
List<FundList> 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<FundList> funds, Map<String, XbFundList> 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");
}
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -65,7 +65,7 @@ public class FundServiceImpl implements FundService{
if (StringUtils.isNotBlank(resp)) { if (StringUtils.isNotBlank(resp)) {
QueryFundListResponse response = JSONObject.parseObject(resp, QueryFundListResponse.class); QueryFundListResponse response = JSONObject.parseObject(resp, QueryFundListResponse.class);
if (Objects.nonNull(response)) { if (Objects.nonNull(response)) {
if (Objects.equals(SUCCESS_0, response.getCode())) { if (Objects.equals(SUCCESS_200, response.getCode())) {
return response.getData(); return response.getData();
} }
} }

View File

@@ -1,8 +1,8 @@
spring: spring:
datasource: 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 username: root
password: 123456 password: xb#UWqnhH24&XpX
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
redis: redis:
host: r-bp1dqqbzlfw04fldp3pd.redis.rds.aliyuncs.com host: r-bp1dqqbzlfw04fldp3pd.redis.rds.aliyuncs.com
@@ -16,7 +16,25 @@ spring:
max-idle: 8 max-idle: 8
min-idle: 0 min-idle: 0
max-wait: 1000 max-wait: 1000
aliyun: aliyun:
dns: dns:
RR: RR:
- local - 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

View File

@@ -22,3 +22,20 @@ aliyun:
RR: RR:
- client - client
- 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

View File

@@ -1,8 +1,8 @@
spring: spring:
datasource: 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 username: root
password: 123456 password: xb#UWqnhH24&XpX
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
redis: redis:
host: r-bp1dqqbzlfw04fldp3pd.redis.rds.aliyuncs.com host: r-bp1dqqbzlfw04fldp3pd.redis.rds.aliyuncs.com
@@ -21,3 +21,20 @@ aliyun:
dns: dns:
RR: RR:
- test - 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

View File

@@ -1,15 +1,10 @@
mybatis: mybatis:
mapper-locations: mapper-locations:
- classpath*:mapper/*/*.xml - classpath*:mapper/*/*.xml
- classpath*:mapper/*.xml
configuration: configuration:
map-underscore-to-camel-case: true map-underscore-to-camel-case: true
DingTalk:
# 钉钉消息用户,用逗号隔开
userList: "450841600726084717"
# 钉钉消息群ID需要调用/chat/create api创建群返回
chatId: "chatd16d8daeea33b36b73588c676d508096"
xiaobei: xiaobei:
unionId: o896o5y8bJZYMh2gdKhDdmUKc0Wk unionId: o896o5y8bJZYMh2gdKhDdmUKc0Wk
codeArr: "010364, 022150, 013224, 008960, 013841, 015528, 012414, 020412, 014662, 016814, 014422, 015596, 007844, codeArr: "010364, 022150, 013224, 008960, 013841, 015528, 012414, 020412, 014662, 016814, 014422, 015596, 007844,
@@ -22,3 +17,7 @@ server:
spring: spring:
profiles: profiles:
active: local active: local
http:
maxAttempts: 10
sleepMs: 200

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiang.xservice.fwd.mapper.FwdAudienceConfigMapper">
<resultMap id="BaseResultMap" type="com.xiang.xservice.fwd.entity.pojo.FAudienceConfig">
<result column="id" property="id"/>
<result column="frequent_id" property="frequentId"/>
<result column="frequent_name" property="frequentName"/>
<result column="status" property="status"/>
<result column="frequent_no" property="frequentNo"/>
<result column="frequent_phone" property="frequentPhone"/>
<result column="del_flag" property="delFlag"/>
<result column="user_id" property="userId"/>
</resultMap>
<sql id="Base_Column_List">
id, frequent_id, frequent_name, status,frequent_no,frequent_phone,del_flag,user_id
</sql>
<delete id="delByUserId">
delete
from fwd_audience_config
where user_id = #{user_id}
</delete>
<insert id="batechSave">
INSERT INTO fwd_audience_config (
status,
frequent_id,
frequent_name,
frequent_no,
frequent_phone,
del_flag,
user_id
)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.status},
#{item.frequentId},
#{item.frequentName},
#{item.frequentNo},
#{item.frequentPhone},
#{item.delFlag},
#{item.userId}
)
</foreach>
</insert>
<select id="getAudienceByUserId" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from fwd_audience_config where user_id = #{userId} and status = 1
</select>
</mapper>

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiang.xservice.fwd.mapper.FwdPerformConfigMapper">
<resultMap id="BaseResultMap" type="com.xiang.xservice.fwd.entity.pojo.FPerformConfig" >
<result column="id" property="id"/>
<result column="project_id" property="projectId"/>
<result column="time" property="time"/>
<result column="del_flag" property="delFlag"/>
</resultMap>
<sql id="Base_Column_List">
id, project_id, time, del_flag
</sql>
<update id="delPerforms">
update fwd_perform_config set del_flag = 1 where 1=1
</update>
<insert id="insertPerforms">
insert into fwd_perform_config(project_id, time, del_flag)
values
<foreach collection="list" item="item" separator=",">
(#{item.projectId}, #{item.time}, #{item.delFlag})
</foreach>
</insert>
<select id="getAvailablePerform" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from fwd_perform_config where del_flag = 0
</select>
</mapper>

View File

@@ -0,0 +1,210 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiang.xservice.fwd.mapper.FwdPerformProjectInfoMapper">
<resultMap id="BaseResultMap" type="com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo" >
<result column="id" property="id"/>
<result column="project_name" property="projectName" />
<result column="status" property="status" />
<result column="project_source" property="projectSource" />
<result column="is_has_seat" property="isHasSeat" />
<result column="is_choice_seat" property="isChoiceSeat" />
<result column="biz_id" property="bizId" />
<result column="project_id" property="projectId" />
<result column="tag_name" property="tagName" />
<result column="tag_remark" property="tagRemark" />
<result column="project_city" property="projectCity" />
<result column="short_city" property="shortCity" />
<result column="venue_name" property="venueName" />
<result column="lowest_price" property="lowestPrice" />
<result column="highest_price" property="highestPrice" />
<result column="project_price" property="projectPrice" />
<result column="project_start_date" property="projectStartDate" />
<result column="project_end_date" property="projectEndDate" />
<result column="sub_classify_name" property="subClassifyName" />
<result column="pre_sale_time" property="preSaleTime"/>
</resultMap>
<sql id="Base_Column_List">
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
</sql>
<insert id="insert" useGeneratedKeys="true" keyColumn="id" keyProperty="id" parameterType="com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo">
INSERT INTO fwd_perform_project_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="null != projectName and '' != projectName">
project_name,
</if>
<if test="null != status ">
status,
</if>
<if test="null != projectSource and '' != projectSource">
project_source,
</if>
<if test="null != isHasSeat ">
is_has_seat,
</if>
<if test="null != isChoiceSeat ">
is_choice_seat,
</if>
<if test="null != bizId ">
biz_id,
</if>
<if test="null != projectId ">
project_id,
</if>
<if test="null != tagName and '' != tagName">
tag_name,
</if>
<if test="null != tagRemark and '' != tagRemark">
tag_remark,
</if>
<if test="null != projectCity and '' != projectCity">
project_city,
</if>
<if test="null != shortCity and '' != shortCity">
short_city,
</if>
<if test="null != venueName and '' != venueName">
venue_name,
</if>
<if test="null != lowestPrice ">
lowest_price,
</if>
<if test="null != highestPrice ">
highest_price,
</if>
<if test="null != projectPrice ">
project_price,
</if>
<if test="null != projectStartDate ">
project_start_date,
</if>
<if test="null != projectEndDate ">
project_end_date,
</if>
<if test="null != subClassifyName and '' != subClassifyName">
sub_classify_name,
</if>
<if test="null != preSaleTime">
pre_sale_time
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="null != projectName and '' != projectName">
#{projectName},
</if>
<if test="null != status ">
#{status},
</if>
<if test="null != projectSource and '' != projectSource">
#{projectSource},
</if>
<if test="null != isHasSeat ">
#{isHasSeat},
</if>
<if test="null != isChoiceSeat ">
#{isChoiceSeat},
</if>
<if test="null != bizId ">
#{bizId},
</if>
<if test="null != projectId ">
#{projectId},
</if>
<if test="null != tagName and '' != tagName">
#{tagName},
</if>
<if test="null != tagRemark and '' != tagRemark">
#{tagRemark},
</if>
<if test="null != projectCity and '' != projectCity">
#{projectCity},
</if>
<if test="null != shortCity and '' != shortCity">
#{shortCity},
</if>
<if test="null != venueName and '' != venueName">
#{venueName},
</if>
<if test="null != lowestPrice ">
#{lowestPrice},
</if>
<if test="null != highestPrice ">
#{highestPrice},
</if>
<if test="null != projectPrice ">
#{projectPrice},
</if>
<if test="null != projectStartDate ">
#{projectStartDate},
</if>
<if test="null != projectEndDate ">
#{projectEndDate},
</if>
<if test="null != subClassifyName and '' != subClassifyName">
#{subClassifyName},
</if>
<if test="null != preSaleTime">
#{preSaleTime}
</if>
</trim>
</insert>
<update id="update" parameterType="com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo">
UPDATE fwd_perform_project_info
<set>
<if test="null != projectName and '' != projectName">project_name = #{projectName},</if>
<if test="null != status ">status = #{status},</if>
<if test="null != projectSource and '' != projectSource">project_source = #{projectSource},</if>
<if test="null != isHasSeat ">is_has_seat = #{isHasSeat},</if>
<if test="null != isChoiceSeat ">is_choice_seat = #{isChoiceSeat},</if>
<if test="null != bizId ">biz_id = #{bizId},</if>
<if test="null != projectId ">project_id = #{projectId},</if>
<if test="null != tagName and '' != tagName">tag_name = #{tagName},</if>
<if test="null != tagRemark and '' != tagRemark">tag_remark = #{tagRemark},</if>
<if test="null != projectCity and '' != projectCity">project_city = #{projectCity},</if>
<if test="null != shortCity and '' != shortCity">short_city = #{shortCity},</if>
<if test="null != venueName and '' != venueName">venue_name = #{venueName},</if>
<if test="null != lowestPrice ">lowest_price = #{lowestPrice},</if>
<if test="null != highestPrice ">highest_price = #{highestPrice},</if>
<if test="null != projectPrice ">project_price = #{projectPrice},</if>
<if test="null != projectStartDate ">project_start_date = #{projectStartDate},</if>
<if test="null != projectEndDate ">project_end_date = #{projectEndDate},</if>
<if test="null != subClassifyName and '' != subClassifyName">sub_classify_name = #{subClassifyName},</if>
<if test="null != preSaleTime">pre_sale_time = #{preSaleTime}</if>
</set>
WHERE id = #{id}
</update>
<select id="getProjectByProjectId" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from fwd_perform_project_info
where project_id = #{projectId}
</select>
<select id="getPreSaleTodayData" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from fwd_perform_project_info
where pre_sale_time between #{startTime} and #{endTime} and status = 21
</select>
</mapper>

View File

@@ -0,0 +1,292 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiang.xservice.fwd.mapper.FwdPerformSeatInfoMapper">
<resultMap id="BaseResultMap" type="com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo" >
<result column="id" property="id"/>
<result column="seat_plan_id" property="seatPlanId" />
<result column="seat_plan_name" property="seatPlanName" />
<result column="perform_id" property="performId" />
<result column="perform_name" property="performName" />
<result column="stop_sale" property="stopSale" />
<result column="shelf_status" property="shelfStatus" />
<result column="price" property="price" />
<result column="discount_price" property="discountPrice" />
<result column="sub_status" property="subStatus" />
<result column="quantity" property="quantity" />
<result column="status" property="status" />
<result column="max_sell_stock" property="maxSellStock" />
<result column="sold_stock" property="soldStock" />
<result column="left_stock" property="leftStock" />
<result column="able_sale_quantity" property="ableSaleQuantity" />
<result column="ash_show" property="ashShow" />
<result column="ash_show_desc" property="ashShowDesc" />
<result column="selectable" property="selectable" />
<result column="display" property="display" />
<result column="available_ticket_quantity" property="availableTicketQuantity" />
<result column="available_all_ticket_quantity" property="availableAllTicketQuantity" />
<result column="sale_time" property="saleTime" />
<result column="project_id" property="projectId" />
<result column="sold_out" property="soldOut"/>
</resultMap>
<sql id="Base_Column_List">
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
</sql>
<insert id="insert" useGeneratedKeys="true" keyColumn="id" keyProperty="id" parameterType="com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo">
INSERT INTO fwd_perform_seat_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="null != seatPlanId ">
seat_plan_id,
</if>
<if test="null != seatPlanName ">
seat_plan_name,
</if>
<if test="null != performId ">
perform_id,
</if>
<if test="null != performName and '' != performName">
perform_name,
</if>
<if test="null != stopSale ">
stop_sale,
</if>
<if test="null != shelfStatus ">
shelf_status,
</if>
<if test="null != price ">
price,
</if>
<if test="null != discountPrice ">
discount_price,
</if>
<if test="null != subStatus ">
sub_status,
</if>
<if test="null != quantity ">
quantity,
</if>
<if test="null != status ">
status,
</if>
<if test="null != maxSellStock ">
max_sell_stock,
</if>
<if test="null != soldStock ">
sold_stock,
</if>
<if test="null != leftStock ">
left_stock,
</if>
<if test="null != ableSaleQuantity ">
able_sale_quantity,
</if>
<if test="null != ashShow ">
ash_show,
</if>
<if test="null != ashShowDesc ">
ash_show_desc,
</if>
<if test="null != selectable ">
selectable,
</if>
<if test="null != display ">
display,
</if>
<if test="null != availableTicketQuantity ">
available_ticket_quantity,
</if>
<if test="null != availableAllTicketQuantity ">
available_all_ticket_quantity,
</if>
<if test="null != saleTime ">
sale_time,
</if>
<if test="null != projectId ">
project_id,
</if>
<if test="null != soldOut ">
sold_out
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="null != seatPlanId ">
#{seatPlanId},
</if>
<if test="null != seatPlanName ">
#{seatPlanName},
</if>
<if test="null != performId ">
#{performId},
</if>
<if test="null != performName and '' != performName">
#{performName},
</if>
<if test="null != stopSale ">
#{stopSale},
</if>
<if test="null != shelfStatus ">
#{shelfStatus},
</if>
<if test="null != price ">
#{price},
</if>
<if test="null != discountPrice ">
#{discountPrice},
</if>
<if test="null != subStatus ">
#{subStatus},
</if>
<if test="null != quantity ">
#{quantity},
</if>
<if test="null != status ">
#{status},
</if>
<if test="null != maxSellStock ">
#{maxSellStock},
</if>
<if test="null != soldStock ">
#{soldStock},
</if>
<if test="null != leftStock ">
#{leftStock},
</if>
<if test="null != ableSaleQuantity ">
#{ableSaleQuantity},
</if>
<if test="null != ashShow ">
#{ashShow},
</if>
<if test="null != ashShowDesc ">
#{ashShowDesc},
</if>
<if test="null != selectable ">
#{selectable},
</if>
<if test="null != display ">
#{display},
</if>
<if test="null != availableTicketQuantity ">
#{availableTicketQuantity},
</if>
<if test="null != availableAllTicketQuantity ">
#{availableAllTicketQuantity},
</if>
<if test="null != saleTime ">
#{saleTime},
</if>
<if test="null != projectId ">
#{projectId},
</if>
<if test="null != soldOut ">
#{soldOut},
</if>
</trim>
</insert>
<insert id="batchSave">
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
<foreach collection="list" item="item" separator=",">
(
#{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}
)
</foreach>
</insert>
<update id="update" parameterType="com.xiang.xservice.fwd.entity.pojo.FPerformSeatInfo">
UPDATE fwd_perform_seat_info
<set>
<if test="null != seatPlanId ">seat_plan_id = #{seatPlanId},</if>
<if test="null != seatPlanName ">seat_plan_name = #{seatPlanName},</if>
<if test="null != performId ">perform_id = #{performId},</if>
<if test="null != performName and '' != performName">perform_name = #{performName},</if>
<if test="null != stopSale ">stop_sale = #{stopSale},</if>
<if test="null != shelfStatus ">shelf_status = #{shelfStatus},</if>
<if test="null != price ">price = #{price},</if>
<if test="null != discountPrice ">discount_price = #{discountPrice},</if>
<if test="null != subStatus ">sub_status = #{subStatus},</if>
<if test="null != quantity ">quantity = #{quantity},</if>
<if test="null != status ">status = #{status},</if>
<if test="null != maxSellStock ">max_sell_stock = #{maxSellStock},</if>
<if test="null != soldStock ">sold_stock = #{soldStock},</if>
<if test="null != leftStock ">left_stock = #{leftStock},</if>
<if test="null != ableSaleQuantity ">able_sale_quantity = #{ableSaleQuantity},</if>
<if test="null != ashShow ">ash_show = #{ashShow},</if>
<if test="null != ashShowDesc ">ash_show_desc = #{ashShowDesc},</if>
<if test="null != selectable ">selectable = #{selectable},</if>
<if test="null != display ">display = #{display},</if>
<if test="null != availableTicketQuantity ">available_ticket_quantity = #{availableTicketQuantity},</if>
<if test="null != availableAllTicketQuantity ">available_all_ticket_quantity = #{availableAllTicketQuantity},</if>
<if test="null != saleTime ">sale_time = #{saleTime},</if>
<if test="null != projectId ">project_id = #{projectId},</if>
<if test="null != soldOut">sold_out = #{soldOut}</if>
</set>
WHERE id = #{id}
</update>
<select id="getPerformSeatInfoBySeatIds" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from fwd_perform_seat_info
where seat_plan_id in
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</select>
<select id="getPerformSeatInfoBySeatIdAndPerformIdAndProjectId"
resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from fwd_perform_seat_info
where seat_plan_id = #{seatId} and perform_id = #{performId} and project_id = #{projectId}
</select>
<select id="getPerformSeatByProjectId" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from fwd_perform_seat_info
where project_id = #{projectId} and sold_out = 0
</select>
<select id="getBySeatPlanId" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from fwd_perform_seat_info
where seat_plan_id = #{id}
</select>
</mapper>

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiang.xservice.fwd.mapper.FwdUserConfigMapper">
<resultMap id="BaseResultMap" type="com.xiang.xservice.fwd.entity.pojo.FUserConfig" >
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="token" property="token"/>
<result column="status" property="status"/>
</resultMap>
<sql id="Base_Column_List">
id, name, token, status
</sql>
<insert id="insert" keyProperty="id" useGeneratedKeys="true" parameterType="com.xiang.xservice.fwd.entity.pojo.FUserConfig" keyColumn="id">
insert into fwd_user_config (name, token, status) values (#{name}, #{token}, #{status});
</insert>
<update id="updateTokenByName">
update fwd_user_config set token = #{token} where name = #{name}
</update>
<select id="getAvailableUser" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from fwd_user_config where status = 1
</select>
<select id="getUserByName" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from fwd_user_config where status = 1 and name = #{name}
</select>
</mapper>