package com.talentcard.server.business.operation;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Map;
|
|
import com.talentcard.server.business.DatabaseRows;
|
import com.talentcard.server.business.PageResult;
|
import com.talentcard.server.common.BusinessException;
|
import com.talentcard.server.common.ErrorCode;
|
import org.springframework.jdbc.core.JdbcTemplate;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
@Service
|
public class OperationAdminService {
|
|
private final JdbcTemplate jdbcTemplate;
|
|
public OperationAdminService(JdbcTemplate jdbcTemplate) {
|
this.jdbcTemplate = jdbcTemplate;
|
}
|
|
@Transactional(readOnly = true)
|
public List<Map<String, Object>> equityImages() {
|
List<Map<String, Object>> categories = query("""
|
select category_key, category_label, intro, updated_at
|
from equity_image_category
|
order by case category_key
|
when 'gift' then 1 when 'food' then 2 when 'home' then 3 when 'travel' then 4
|
when 'city' then 5 when 'goods' then 6 when 'life' then 7 else 99 end, category_key
|
""");
|
for (Map<String, Object> category : categories) {
|
category.put("images", query("""
|
select id, item_name as name, image_url, sort_no, enabled
|
from equity_image_item
|
where deleted = 0 and category_key = ?
|
order by sort_no, id
|
""", category.get("categoryKey")));
|
}
|
return categories;
|
}
|
|
@Transactional
|
public Map<String, Object> saveEquityImages(EquityImageSaveRequest request) {
|
Integer count = jdbcTemplate.queryForObject(
|
"select count(*) from equity_image_category where category_key = ?",
|
Integer.class,
|
request.categoryKey());
|
if (count == null || count == 0) {
|
jdbcTemplate.update("""
|
insert into equity_image_category(category_key, category_label, intro)
|
values (?, ?, ?)
|
""", request.categoryKey(), request.categoryLabel(), request.intro());
|
} else {
|
jdbcTemplate.update("""
|
update equity_image_category
|
set category_label = ?, intro = ?
|
where category_key = ?
|
""", request.categoryLabel(), request.intro(), request.categoryKey());
|
}
|
jdbcTemplate.update("update equity_image_item set deleted = 1 where category_key = ?", request.categoryKey());
|
List<EquityImageItemRequest> images = request.images() == null ? List.of() : request.images();
|
int sortNo = 1;
|
for (EquityImageItemRequest image : images) {
|
if (isBlank(image.name()) && isBlank(image.imageUrl())) {
|
continue;
|
}
|
jdbcTemplate.update("""
|
insert into equity_image_item(category_key, item_name, image_url, sort_no, enabled)
|
values (?, ?, ?, ?, ?)
|
""", request.categoryKey(), blankToNull(image.name()), blankToNull(image.imageUrl()), sortNo++,
|
Boolean.FALSE.equals(image.enabled()) ? 0 : 1);
|
}
|
return equityImages().stream()
|
.filter(item -> request.categoryKey().equals(item.get("categoryKey")))
|
.findFirst()
|
.orElseThrow(() -> new BusinessException(ErrorCode.NOT_FOUND, "权益图片分类不存在"));
|
}
|
|
@Transactional(readOnly = true)
|
public List<Map<String, Object>> movieTicketRules() {
|
return query("""
|
select id, talent_level as level, enabled, claimable_count, reset_cycle, updated_at
|
from movie_ticket_rule
|
order by case talent_level
|
when '卓越人才卡' then 1 when '杰出人才卡' then 2 when '菁英人才卡' then 3 else 99 end, id
|
""");
|
}
|
|
@Transactional
|
public List<Map<String, Object>> saveMovieTicketRules(List<MovieTicketRuleRequest> rules) {
|
for (MovieTicketRuleRequest rule : rules == null ? List.<MovieTicketRuleRequest>of() : rules) {
|
Integer count = jdbcTemplate.queryForObject(
|
"select count(*) from movie_ticket_rule where talent_level = ?",
|
Integer.class,
|
rule.level());
|
if (count == null || count == 0) {
|
jdbcTemplate.update("""
|
insert into movie_ticket_rule(talent_level, enabled, claimable_count, reset_cycle)
|
values (?, ?, ?, ?)
|
""",
|
rule.level(),
|
Boolean.TRUE.equals(rule.enabled()) ? 1 : 0,
|
rule.claimableCount(),
|
defaultValue(rule.resetCycle(), "每月"));
|
} else {
|
jdbcTemplate.update("""
|
update movie_ticket_rule
|
set enabled = ?, claimable_count = ?, reset_cycle = ?
|
where talent_level = ?
|
""",
|
Boolean.TRUE.equals(rule.enabled()) ? 1 : 0,
|
rule.claimableCount(),
|
defaultValue(rule.resetCycle(), "每月"),
|
rule.level());
|
}
|
}
|
return movieTicketRules();
|
}
|
|
@Transactional(readOnly = true)
|
public PageResult<Map<String, Object>> movieTicketRecords(
|
String talentKeyword,
|
String cardLevel,
|
String receivedStart,
|
String receivedEnd,
|
int page,
|
int size
|
) {
|
int safePage = Math.max(page, 1);
|
int safeSize = Math.min(Math.max(size, 1), 100);
|
StringBuilder where = new StringBuilder(" where deleted = 0");
|
List<Object> args = new ArrayList<>();
|
if (talentKeyword != null && !talentKeyword.isBlank()) {
|
where.append(" and (receive_no like ? or package_name like ? or merchants like ? or talent_name like ? or talent_mobile like ? or card_no like ?)");
|
String like = "%" + talentKeyword.trim() + "%";
|
for (int i = 0; i < 6; i++) {
|
args.add(like);
|
}
|
}
|
if (cardLevel != null && !cardLevel.isBlank()) {
|
where.append(" and talent_level = ?");
|
args.add(cardLevel);
|
}
|
if (receivedStart != null && !receivedStart.isBlank()) {
|
where.append(" and date(received_at) >= ?");
|
args.add(receivedStart);
|
}
|
if (receivedEnd != null && !receivedEnd.isBlank()) {
|
where.append(" and date(received_at) <= ?");
|
args.add(receivedEnd);
|
}
|
|
List<Object> pageArgs = new ArrayList<>(args);
|
pageArgs.add(safeSize);
|
pageArgs.add((safePage - 1) * safeSize);
|
List<Map<String, Object>> records = query("""
|
select id, receive_no, package_name, merchants, talent_name, talent_mobile,
|
talent_level, card_no, received_at
|
from movie_ticket_record
|
""" + where + " order by received_at desc, id desc limit ? offset ?", pageArgs.toArray());
|
Long total = jdbcTemplate.queryForObject("select count(*) from movie_ticket_record " + where, Long.class, args.toArray());
|
return new PageResult<>(records, safePage, safeSize, total == null ? 0 : total);
|
}
|
|
private boolean isBlank(String value) {
|
return value == null || value.isBlank();
|
}
|
|
private String blankToNull(String value) {
|
return isBlank(value) ? null : value;
|
}
|
|
private String defaultValue(String value, String fallback) {
|
return isBlank(value) ? fallback : value;
|
}
|
|
private List<Map<String, Object>> query(String sql, Object... args) {
|
return DatabaseRows.normalize(jdbcTemplate.queryForList(sql, args));
|
}
|
}
|