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

Commit 6b4261b4 authored by 姜秀龙's avatar 姜秀龙

Merge branch 'refs/heads/jxl-260205-damai' into container-test

parents 82870da9 34349732
......@@ -54,6 +54,9 @@ public class PerformanceStep2Param implements Serializable,Cloneable {
@NotNull(message = "须知提醒不能为空")
private Integer noticeRemindStatus;
@ApiModelProperty(value = "是否开启大麦同步 0:关闭 1:开启", example = "0")
private Integer isSyncDamai;
private static final PerformanceStep2Param obj = new PerformanceStep2Param();
public static PerformanceStep2Param getNew() {
try {
......
package com.liquidnet.service.kylin.service.other;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.entity.KylinTicketTimes;
import com.liquidnet.service.kylin.entity.KylinTickets;
......@@ -15,4 +16,7 @@ public interface DamaiService {
//订单
Boolean sycOrder(long timeId, String ticketsId, long ticketsmId,long ticketIdMemberKey);
//定时同步大麦(扫描所有开启同步的演出)
ResponseDto<Boolean> scheduledSyncDamai();
}
package com.liquidnet.service.kylin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import java.math.BigDecimal;
......@@ -141,6 +142,26 @@ public class KylinOrderTicketEntities implements Serializable ,Cloneable {
};
}
private Integer isDamaiPushSynced;
private Integer isDamaiWithdrawSynced;
/** 以下字段均为非数据库字段,仅定时同步大麦查询时携带,不参与 MyBatis-Plus 自动 INSERT/UPDATE **/
@TableField(exist = false)
private Integer syncType;
@TableField(exist = false)
private String timePay;
@TableField(exist = false)
private Integer isMember;
@TableField(exist = false)
private String getTicketType;
@TableField(exist = false)
private Integer transferStatus;
private static final KylinOrderTicketEntities obj = new KylinOrderTicketEntities();
public static KylinOrderTicketEntities getNew() {
try {
......
......@@ -160,6 +160,12 @@ public class KylinPerformanceStatus implements Serializable ,Cloneable{
*/
private Integer fieldAuditStatus;
/** 是否开启大麦同步 0:关闭 1:开启 */
private Integer isSyncDamai;
/** 该演出的场地场次票种基础信息是否已推过大麦 0否 1是 */
private Integer isDamaiBasicSynced;
/**
* 创建时间
*/
......
......@@ -2,6 +2,7 @@ package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.dao.*;
import com.liquidnet.service.kylin.entity.KylinOrderTicketEntities;
import com.liquidnet.service.kylin.entity.KylinOrderTickets;
import org.apache.ibatis.annotations.Param;
......@@ -61,4 +62,13 @@ public interface KylinOrderTicketsMapper extends BaseMapper<KylinOrderTickets> {
List<String> getAgentIdListByPerId(@Param("performancesId") String performancesId);
Map selectNumAndPrice(@Param("performancesId") String performancesId, @Param("ticketsId") String ticketsId);
List<KylinOrderTicketEntities> getDamaiOrderSyncList(@Param("performanceId") String performanceId);
int updateDamaiPushSyncStatus(@Param("ids") List<String> ids, @Param("status") Integer status);
int updateDamaiWithdrawSyncStatus(@Param("ids") List<String> ids, @Param("status") Integer status);
// 撤单场景:一次 SQL 同时更新推单和撤单状态(减少数据库操作)
int updateDamaiWithdrawAndPushSyncStatus(@Param("ids") List<String> ids, @Param("status") Integer status);
}
......@@ -5,6 +5,7 @@ import com.liquidnet.service.kylin.dao.*;
import com.liquidnet.service.kylin.dao.report.KylinPerformanceSubscribeStatisticalDao;
import com.liquidnet.service.kylin.dao.report.KylinPerformanceSubscribeTicketStatisticalDao;
import com.liquidnet.service.kylin.dao.report.KylinPerformancesDto;
import com.liquidnet.service.kylin.entity.KylinPerformanceStatus;
import com.liquidnet.service.kylin.entity.KylinPerformances;
import org.apache.ibatis.annotations.Param;
......@@ -126,4 +127,8 @@ public interface KylinPerformancesMapper extends BaseMapper<KylinPerformances> {
* @date 2024/3/21 18:02
*/
void updatePerformanceSubscribePushById(@Param("ids")List<Integer> ids);
List<KylinPerformanceStatus> getDamaiSyncPerformances();
int updateDamaiBasicSynced(@Param("performancesId") String performancesId, @Param("val") Integer val);
}
......@@ -577,4 +577,55 @@ WHERE kotr.performance_id = #{performanceId}
AND kots.status IN (1, 3, 6)
AND kots.transfer_status in (0, 1, 3, 5);
</select>
<select id="getDamaiOrderSyncList" resultType="com.liquidnet.service.kylin.entity.KylinOrderTicketEntities">
SELECT ote.order_ticket_entities_id, ote.time_id, ote.ticket_id, ote.performance_id,
ote.enter_name, ote.enter_id_code, ote.enter_type, ote.enter_mobile, ote.is_payment,
ote.is_damai_push_synced,
ot.time_pay, ot.order_tickets_id AS order_id, ot.get_ticket_type,
otr.is_member,
ots.transfer_status,
CASE
WHEN ote.is_payment = 1 AND ote.is_damai_push_synced = 0 THEN 1
WHEN (ote.is_payment IN (2, 3) OR ots.transfer_status IN (2, 6)) AND ote.is_damai_withdraw_synced = 0 THEN 2
END AS sync_type
FROM kylin_order_ticket_entities ote
LEFT JOIN kylin_order_tickets ot ON ote.order_id = ot.order_tickets_id
LEFT JOIN kylin_order_ticket_relations otr ON otr.order_id = ot.order_tickets_id
LEFT JOIN kylin_order_ticket_status ots ON ots.order_id = ot.order_tickets_id
WHERE ote.performance_id = #{performanceId}
AND (
(ote.is_payment = 1 AND ote.is_damai_push_synced = 0)
OR
((ote.is_payment IN (2, 3) OR ots.transfer_status IN (2, 6)) AND ote.is_damai_withdraw_synced = 0)
)
LIMIT 200
</select>
<update id="updateDamaiPushSyncStatus">
UPDATE kylin_order_ticket_entities
SET is_damai_push_synced = #{status}
WHERE order_ticket_entities_id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
<update id="updateDamaiWithdrawSyncStatus">
UPDATE kylin_order_ticket_entities
SET is_damai_withdraw_synced = #{status}
WHERE order_ticket_entities_id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
<!-- 撤单场景:一次 SQL 同时更新推单和撤单状态,减少数据库操作 -->
<update id="updateDamaiWithdrawAndPushSyncStatus">
UPDATE kylin_order_ticket_entities
SET is_damai_withdraw_synced = #{status}, is_damai_push_synced = #{status}
WHERE order_ticket_entities_id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
</mapper>
......@@ -1327,4 +1327,16 @@ GROUP BY user_mobile,tickets_id;
#{id}
</foreach>
</update>
<select id="getDamaiSyncPerformances" resultType="com.liquidnet.service.kylin.entity.KylinPerformanceStatus">
SELECT kps.performance_id, kps.is_damai_basic_synced
FROM kylin_performance_status kps
LEFT JOIN kylin_performances kp ON kp.performances_id = kps.performance_id
WHERE kps.is_sync_damai = 1
AND kps.status IN (3, 6, 7, 8, 9, 10)
AND kp.time_end > NOW()
</select>
<update id="updateDamaiBasicSynced">
UPDATE kylin_performance_status SET is_damai_basic_synced = #{val} WHERE performance_id = #{performancesId}
</update>
</mapper>
......@@ -10,10 +10,8 @@ import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Component
@FeignClient(name = "liquidnet-service-platform",
contextId = "FeignPlatformTaskClient", path = "",
url = "${liquidnet.service.platform.url}",
// url = "",
@FeignClient(name = "liquidnet-service-platform", contextId = "FeignPlatformTaskClient", path = "", url = "${liquidnet.service.platform.url}",
// url = "",
fallback = FallbackFactory.Default.class)
public interface FeignPlatformTaskClient {
......@@ -34,6 +32,7 @@ public interface FeignPlatformTaskClient {
/**
* 定时开票提醒
*
* @author zjp
* @return: com.liquidnet.service.base.ResponseDto<java.lang.Boolean>
* @date 2024/3/21 18:03
......@@ -43,11 +42,19 @@ public interface FeignPlatformTaskClient {
/*
* @description: 自动处理退款失败
*
* @author: zjp
*
* @date: 2025/4/27 14:28
*
* @param: []
*
* @return: com.liquidnet.service.base.ResponseDto<java.lang.Boolean>
**/
@GetMapping("platform/refund/failRefund")
ResponseDto<Boolean> failRefund();
@PostMapping("platform/damai/scheduledSync")
ResponseDto<Boolean> scheduledSyncDamai();
}
......@@ -11,8 +11,10 @@ import org.springframework.stereotype.Component;
* XxlJob开发示例(Bean模式)
* <p>
* 开发步骤:
* 1、在Spring Bean实例中,开发Job方法,方式格式要求为 "public ReturnT<String> execute(String param)"
* 2、为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
* 1、在Spring Bean实例中,开发Job方法,方式格式要求为 "public ReturnT<String> execute(String
* param)"
* 2、为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法",
* destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
* 3、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;
*/
@Component
......@@ -56,7 +58,8 @@ public class KylinTaskHandler {
@XxlJob(value = "sev-platform:checkTransferOrderHandler")
public void checkTransferOrderHandler() {
try {
XxlJobHelper.handleSuccess("结果:" + feignPlatformTaskClient.checkTransferOrder(Integer.parseInt(XxlJobHelper.getJobParam())).getData());
XxlJobHelper.handleSuccess("结果:" + feignPlatformTaskClient
.checkTransferOrder(Integer.parseInt(XxlJobHelper.getJobParam())).getData());
} catch (Exception e) {
XxlJobHelper.log(e);
XxlJobHelper.handleFail();
......@@ -85,6 +88,7 @@ public class KylinTaskHandler {
/**
* 开票提醒定时推送
*
* @author zjp
* @param null
* @return: null
......@@ -102,6 +106,7 @@ public class KylinTaskHandler {
/**
* 退款失败自动处理
*
* @author zjp
* @param null
* @return: null
......@@ -116,4 +121,15 @@ public class KylinTaskHandler {
XxlJobHelper.handleFail();
}
}
@XxlJob(value = "sev-platform:scheduledSyncDamai")
public void scheduledSyncDamaiHandler() {
try {
XxlJobHelper.handleSuccess("定时大麦同步结果:" + feignPlatformTaskClient.scheduledSyncDamai().getData());
} catch (Exception e) {
XxlJobHelper.log(e);
XxlJobHelper.handleFail();
}
}
}
-- 1. 商演同步大麦开关设计及防复推
ALTER TABLE `kylin_performances`
ADD COLUMN `is_sync_damai` tinyint(2) DEFAULT 0 COMMENT '是否开启大麦同步 0:关闭 1:开启',
ADD COLUMN `is_damai_basic_synced` tinyint(2) DEFAULT 0 COMMENT '该演出的场地场次票种基础信息是否已推过大麦 0否 1是';
-- 2. 入场人基本门票粒度的分离式同步流转追踪设计
ALTER TABLE `kylin_order_ticket_entities`
ADD COLUMN `is_damai_push_synced` tinyint(2) DEFAULT 0 COMMENT '正向推单至大麦状态: 0=待推(默认) 1=推送中 2=推送成功 3=推送失败',
ADD COLUMN `is_damai_withdraw_synced` tinyint(2) DEFAULT 0 COMMENT '逆向撤单(退单/转赠)至大麦状态: 0=待推(默认/初始) 1=推送中 2=推送成功 3=推送失败';
......@@ -139,6 +139,20 @@
<artifactId>liquident-common-erp</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-service-kylin-do</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>taobao-sdk-id</groupId>
<artifactId>taobao-sdk</artifactId>
<version>1.0.0</version>
<type>jar</type>
<scope>system</scope>
<systemPath>${project.basedir}/lib/taobao-sdk-java-auto_1600401599540-20210607.jar</systemPath>
</dependency>
</dependencies>
<build>
......
package com.liquidnet.service.platform.controller;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.service.other.DamaiService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/platform/damai")
public class PlatformDamaiController {
@Autowired
private DamaiService damaiService;
@ApiOperation("定时同步大麦(扫描所有开启同步的演出)")
@PostMapping(value = "/scheduledSync")
public ResponseDto<Boolean> scheduledSyncDamai() {
return damaiService.scheduledSyncDamai();
}
}
......@@ -524,4 +524,16 @@ public class DataUtils {
log.error("回退券ERROR:{}", e);
}
}
// 【场地】获取详情
public SlimeFieldsVo getFieldsVoByFieldId(String fieldId) {
String key = SlimeRedisConst.INFO_FIELD.concat(fieldId);
long s = System.currentTimeMillis();
SlimeFieldsVo vo = (SlimeFieldsVo) redisDataSourceUtil.getRedisKylinUtil().get(key);
if (null == vo) {
vo = mongoTemplate.findOne(Query.query(Criteria.where("fieldId").is(fieldId)), SlimeFieldsVo.class, SlimeFieldsVo.class.getSimpleName());
redisDataSourceUtil.getRedisKylinUtil().set(SlimeRedisConst.INFO_FIELD.concat(fieldId), vo);
}
return vo;
}
}
package com.liquidnet.service.platform.utils;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 时间工具类
*
* @author ruoyi
*/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils
{
public static String YYYY = "yyyy";
public static String YYYY_MM = "yyyy-MM";
public static String YYYY_MM_DD = "yyyy-MM-dd";
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
private static String[] parsePatterns = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
/**
* 获取当前Date型日期
*
* @return Date() 当前日期
*/
public static Date getNowDate()
{
return new Date();
}
/**
* 获取当前日期, 默认格式为yyyy-MM-dd
*
* @return String
*/
public static String getDate()
{
return dateTimeNow(YYYY_MM_DD);
}
public static final String getTime()
{
return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
}
public static final String dateTimeNow()
{
return dateTimeNow(YYYYMMDDHHMMSS);
}
public static final String dateTimeNow(final String format)
{
return parseDateToStr(format, new Date());
}
public static final String dateTime(final Date date)
{
return parseDateToStr(YYYY_MM_DD, date);
}
public static final String parseDateToStr(final String format, final Date date)
{
return new SimpleDateFormat(format).format(date);
}
public static final Date dateTime(final String format, final String ts)
{
try
{
return new SimpleDateFormat(format).parse(ts);
}
catch (ParseException e)
{
throw new RuntimeException(e);
}
}
/**
* 日期路径 即年/月/日 如2018/08/08
*/
public static final String datePath()
{
Date now = new Date();
return DateFormatUtils.format(now, "yyyy/MM/dd");
}
/**
* 日期路径 即年/月/日 如20180808
*/
public static final String dateTime()
{
Date now = new Date();
return DateFormatUtils.format(now, "yyyyMMdd");
}
/**
* 日期型字符串转化为日期 格式
*/
public static Date parseDate(Object str)
{
if (str == null)
{
return null;
}
try
{
return parseDate(str.toString(), parsePatterns);
}
catch (ParseException e)
{
return null;
}
}
/**
* 获取服务器启动时间
*/
public static Date getServerStartDate()
{
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
return new Date(time);
}
/**
* 计算相差天数
*/
public static int differentDaysByMillisecond(Date date1, Date date2)
{
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
}
/**
* 计算两个时间差
*/
public static String getDatePoor(Date endDate, Date nowDate)
{
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;
// long ns = 1000;
// 获得两个时间的毫秒时间差异
long diff = endDate.getTime() - nowDate.getTime();
// 计算差多少天
long day = diff / nd;
// 计算差多少小时
long hour = diff % nd / nh;
// 计算差多少分钟
long min = diff % nd % nh / nm;
// 计算差多少秒//输出结果
// long sec = diff % nd % nh % nm / ns;
return day + "天" + hour + "小时" + min + "分钟";
}
}
package com.liquidnet.service.platform.utils;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketTimesVo;
import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo;
import com.taobao.api.DefaultTaobaoClient;
import com.taobao.api.TaobaoClient;
import com.taobao.api.request.AlibabaDamaiMevOpenWithdrawticketRequest;
import com.taobao.api.response.AlibabaDamaiMevOpenWithdrawticketResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@Slf4j
public class TaobaoTicketUtils {
private String URL = "http://gw.api.taobao.com/router/rest";
private String APPKEY = "27542597";
private String SECRET = "900025efc616fd2446344bb8fa21d039";
private String SUPPLIER_SECRET = "444d0752439f921a75eaf5951a8bc03c";
private Long SYSTEM_ID = 15669L;
// private String url = "http://gw.api.tbsandbox.com/router/rest";
// private String appkey = "4272";
// private String secret = "0ebbcccfee18d7ad1aebc5b135ffa906";
private TaobaoClient client = null;
public TaobaoClient initTaobaoClient() {
if (client == null) {
client = new DefaultTaobaoClient(URL, APPKEY, SECRET);
}
return client;
}
public String getSupplierSecret() {
return SUPPLIER_SECRET;
}
public Long getSystemId() {
return SYSTEM_ID;
}
/**
* @param timesId 场次的id
* @param orderEntitiesId 入场人的id
* @return
*/
public boolean withdrawDamaiOrder(long timesId, long orderEntitiesId) {
try {
TaobaoClient client = initTaobaoClient();
AlibabaDamaiMevOpenWithdrawticketRequest req = new AlibabaDamaiMevOpenWithdrawticketRequest();
AlibabaDamaiMevOpenWithdrawticketRequest.TicketIdOpenParam obj1 = new AlibabaDamaiMevOpenWithdrawticketRequest.TicketIdOpenParam();
obj1.setPerformId(timesId);// 场次id
obj1.setVoucherId(orderEntitiesId);// 票单号 入场人id
obj1.setSupplierSecret(SUPPLIER_SECRET);
obj1.setSystemId(SYSTEM_ID);
req.setTicketIdOpenParam(obj1);
AlibabaDamaiMevOpenWithdrawticketResponse rsp = client.execute(req);
return rsp.getResult().getSuccess();
} catch (Exception e) {
return false;
}
}
public boolean refundDamaiOrder(KylinOrderTicketVo orderData, KylinPerformanceVo vo) {
try {
int isSysDamai = 0;
for (int x = 0; x < vo.getTicketTimeList().size(); x++) {
KylinTicketTimesVo timeItem = vo.getTicketTimeList().get(x);
for (int y = 0; y < timeItem.getTicketList().size(); y++) {
KylinTicketVo ticketItem = timeItem.getTicketList().get(y);
if (ticketItem.getTicketsId().equals(orderData.getTicketId())) {
isSysDamai = ticketItem.getSysDamai();
break;
}
}
}
if (isSysDamai == 1) {
List<KylinOrderTicketEntitiesVo> listData = orderData.getEntitiesVoList();
for (int i = 0; i < listData.size(); i++) {
KylinOrderTicketEntitiesVo item = listData.get(i);
long ticketTimesKey;
if (item.getTicketId().length() > 13) {
ticketTimesKey = Long.valueOf(IDGenerator.getDamaiCode(item.getTimeId()));
} else {
ticketTimesKey = Long.parseLong(item.getTimeId());
}
long orderTicketEntitiesKey;
// if (item.getOrderTicketEntitiesId().length() > 13) {
// orderTicketEntitiesKey =
// Long.valueOf(IDGenerator.getDamaiCode(item.getOrderTicketEntitiesId()));
// } else {
// orderTicketEntitiesKey = Long.valueOf(item.getOrderTicketEntitiesId());//票单号
// 入场人id
// }
if (orderData.getIsMember() == 1) {
orderTicketEntitiesKey = Long.valueOf(
IDGenerator.getDamaiCode(item.getOrderTicketEntitiesId()).toString().concat("010"));
} else {
orderTicketEntitiesKey = Long.valueOf(
IDGenerator.getDamaiCode(item.getOrderTicketEntitiesId()).toString().concat("020"));
}
if (item.getIsPayment() == 2) {
withdrawDamaiOrder(ticketTimesKey, orderTicketEntitiesKey);
}
}
return true;
}
return true;
} catch (Exception e) {
log.info("REFUND DAMAI ERROR = {}", e);
return false;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment