refactor mapper xml

This commit is contained in:
Timi
2026-08-12 16:11:08 +08:00
parent 5f36844279
commit ee530d2a8c
31 changed files with 308 additions and 38 deletions
@@ -39,6 +39,12 @@ public enum CorePermissionCode implements BuiltinPermissionCode {
MULTILINGUAL_UPDATE("MULTILINGUAL:UPDATE", "多语言修改", false, true),
MULTILINGUAL_DELETE("MULTILINGUAL:DELETE", "多语言删除", false, true),
TAG_CREATE("TAG:CREATE", "标签创建", false, true),
TAG_READ("TAG:READ", "标签读取", false, true),
TAG_APPLY("TAG:APPLY", "标签应用", false, true),
TAG_UPDATE("TAG:UPDATE", "标签修改", false, true),
TAG_DELETE("TAG:DELETE", "标签删除", false, true),
USER_CREATE("USER:CREATE", "用户创建", false, true),
USER_READ("USER:READ", "用户读取", false, true),
USER_UPDATE("USER:UPDATE", "用户修改", false, true),
@@ -0,0 +1,111 @@
package com.imyeyu.api.modules.common.controller;
import com.fasterxml.jackson.annotation.JsonView;
import com.imyeyu.api.modules.common.entity.Tag;
import com.imyeyu.api.modules.common.entity.TagApply;
import com.imyeyu.api.modules.common.service.TagService;
import com.imyeyu.spring.annotation.AOPLog;
import com.imyeyu.spring.annotation.RequestRateLimit;
import com.imyeyu.spring.bean.Page;
import com.imyeyu.spring.bean.PageResult;
import com.imyeyu.spring.util.ResponseView;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/// 标签接口
///
/// @author 夜雨
/// @since 2026-08-12 15:09
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/tag")
public class TagController {
private final TagService service;
/// 查询标签列表
///
/// @param page 分页参数
/// @return 标签分页
@RequestRateLimit
@JsonView(ResponseView.Public.class)
@PostMapping("/list")
public PageResult<Tag> list(@RequestBody Page<Tag> page) {
return service.page(page);
}
/// 查询标签详情
///
/// @param id 标签 ID
/// @return 标签详情
@RequestRateLimit
@JsonView(ResponseView.Public.class)
@PostMapping("/detail")
public Tag detail(@RequestParam String id) {
return service.get(id);
}
/// 创建标签
///
/// @param tag 标签
/// @return 标签
@AOPLog
@RequestRateLimit
@JsonView(ResponseView.Public.class)
@PostMapping("/create")
public Tag create(@RequestBody Tag tag) {
service.create(tag);
return tag;
}
/// 更新标签
///
/// @param tag 标签
@AOPLog
@RequestRateLimit
@PostMapping("/update")
public void update(@RequestBody Tag tag) {
service.update(tag);
}
/// 删除标签
///
/// @param id 标签 ID
@AOPLog
@RequestRateLimit
@PostMapping("/delete")
public void delete(@RequestParam String id) {
service.delete(id);
}
/// 按业务查询标签
///
/// @param bizType 业务类型
/// @param bizId 业务 ID
/// @return 标签列表
@RequestRateLimit
@JsonView(ResponseView.Public.class)
@GetMapping("/list/biz/id")
public List<Tag> listByBizType(@RequestParam TagApply.BizType bizType, @RequestParam String bizId) {
return service.listByBizType(bizType, bizId);
}
/// 差分保存业务标签
///
/// @param apply 标签请求
@AOPLog
@RequestRateLimit
@PostMapping("/apply")
public void apply(@RequestBody TagApply apply) {
service.apply(apply.getBizType(), apply.getBizId(), apply.getTagIdList());
}
}
@@ -1,23 +1,28 @@
package com.imyeyu.api.modules.common.entity;
import com.imyeyu.api.annotation.MultilingualField;
import com.imyeyu.spring.annotation.table.Transient;
import com.imyeyu.spring.entity.UUIDEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author 夜雨
* @since 2024-08-28 14:26
*/
/// 标签
///
/// @author 夜雨
/// @since 2024-08-28 14:26
@Data
@EqualsAndHashCode(callSuper = true)
public class Tag extends UUIDEntity {
protected String langKey;
/// 名称多语言 ID
protected String nameLangId;
/// 当前语言名称
@Transient
protected String value;
@MultilingualField("nameLangId")
protected String name;
/// 中文名称
@Transient
protected String zhCN;
}
@@ -1,9 +1,12 @@
package com.imyeyu.api.modules.common.entity;
import com.imyeyu.spring.annotation.table.Transient;
import com.imyeyu.spring.entity.UUIDEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 标签应用
*
@@ -14,12 +17,25 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
public class TagApply extends UUIDEntity {
///
///
/// @author 夜雨
/// @since 2026-08-12 14:27
public enum BizType {
GAO_CUSTOMER
}
/** 业务类型 */
protected String bizType;
protected BizType bizType;
/** 业务 ID */
protected String bizId;
/** 标签 ID */
protected String tagId;
/// 标签 ID 列表
@Transient
private List<String> tagIdList;
}
@@ -0,0 +1,11 @@
package com.imyeyu.api.modules.common.mapper;
import com.imyeyu.api.modules.common.entity.TagApply;
import com.imyeyu.spring.mapper.BaseMapper;
/// 标签应用 Mapper
///
/// @author 夜雨
/// @since 2026-08-12 15:05
public interface TagApplyMapper extends BaseMapper<TagApply, String> {
}
@@ -3,9 +3,14 @@ package com.imyeyu.api.modules.common.mapper;
import com.imyeyu.api.modules.common.entity.Tag;
import com.imyeyu.spring.mapper.BaseMapper;
import java.util.Collection;
import java.util.List;
/**
* @author 夜雨
* @since 2025-05-30 22:48
*/
public interface TagMapper extends BaseMapper<Tag, String> {
List<Tag> selectByIdList(Collection<String> idList);
}
@@ -1,11 +1,31 @@
package com.imyeyu.api.modules.common.service;
import com.imyeyu.api.modules.common.entity.Tag;
import com.imyeyu.api.modules.common.entity.TagApply;
import com.imyeyu.spring.service.BaseService;
/**
* @author 夜雨
* @since 2025-05-30 22:46
*/
import java.util.Collection;
import java.util.List;
/// 标签服务
///
/// @author 夜雨
/// @since 2025-05-30 22:46
public interface TagService extends BaseService<Tag, String> {
List<Tag> listByIdList(Collection<String> idList);
/// 按业务查询标签列表
///
/// @param bizType 业务类型
/// @param bizId 业务 ID
/// @return 标签列表
List<Tag> listByBizType(TagApply.BizType bizType, String bizId);
/// 差分保存业务标签
///
/// @param bizType 业务类型
/// @param bizId 业务 ID
/// @param tagIdList 标签 ID 列表
void apply(TagApply.BizType bizType, String bizId, List<String> tagIdList);
}
@@ -1,27 +1,100 @@
package com.imyeyu.api.modules.common.service.implement;
import com.imyeyu.api.modules.common.entity.Tag;
import com.imyeyu.api.modules.common.entity.TagApply;
import com.imyeyu.api.modules.common.mapper.TagApplyMapper;
import com.imyeyu.api.modules.common.mapper.TagMapper;
import com.imyeyu.api.modules.common.service.MultilingualService;
import com.imyeyu.api.modules.common.service.TagService;
import com.imyeyu.java.bean.timi.TimiException;
import com.imyeyu.spring.mapper.BaseMapper;
import com.imyeyu.spring.service.AbstractEntityService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author 夜雨
* @since 2025-05-30 22:47
*/
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
/// 标签服务实现
///
/// @author 夜雨
/// @since 2025-05-30 22:47
@Slf4j
@Service
@RequiredArgsConstructor
public class TagServiceImplement extends AbstractEntityService<Tag, String> implements TagService {
private final TagMapper mapper;
private final TagApplyMapper applyMapper;
private final MultilingualService multilingualService;
@Override
protected BaseMapper<Tag, String> mapper() {
return mapper;
}
@Override
public void create(Tag tag) {
TimiException.required(tag, "not found tag");
TimiException.required(tag.getZhCN(), "not found tag.zhCN");
tag.setNameLangId(multilingualService.create(tag.getZhCN()));
super.create(tag);
}
@Override
public void update(Tag tag) {
TimiException.required(tag, "not found tag");
TimiException.required(tag.getId(), "not found tag.id");
if (tag.getZhCN() != null) {
if (tag.getNameLangId() == null) {
Tag dbTag = get(tag.getId());
TimiException.required(dbTag, "not found tag");
tag.setNameLangId(dbTag.getNameLangId());
}
tag.setNameLangId(multilingualService.createIfDifferent(tag.getNameLangId(), tag.getZhCN()));
}
super.update(tag);
}
@Override
public List<Tag> listByIdList(Collection<String> idList) {
return mapper.selectByIdList(new HashSet<>(idList));
}
@Override
public List<Tag> listByBizType(TagApply.BizType bizType, String bizId) {
return listByIdList(listApply(bizType, bizId).stream().map(TagApply::getTagId).toList());
}
@Override
public void apply(TagApply.BizType bizType, String bizId, List<String> tagIdList) {
LinkedHashSet<String> tagIdSet = new LinkedHashSet<>(tagIdList == null ? List.of() : tagIdList);
for (TagApply apply : listApply(bizType, bizId)) {
if (tagIdSet.remove(apply.getTagId())) {
continue;
}
applyMapper.delete(apply.getId());
}
List<Tag> tagList = listByIdList(tagIdSet);
for (Tag tag : tagList) {
TagApply apply = new TagApply();
apply.setBizType(bizType);
apply.setBizId(bizId);
apply.setTagId(tag.getId());
applyMapper.insert(apply);
}
}
private List<TagApply> listApply(TagApply.BizType bizType, String bizId) {
TimiException.required(bizType, "not found bizType");
TimiException.required(bizId, "not found bizId");
TagApply example = new TagApply();
example.setBizType(bizType);
example.setBizId(bizId);
return applyMapper.selectAllByExample(example);
}
}
@@ -1,15 +0,0 @@
package com.imyeyu.api.modules.common.vo.tag;
import lombok.Data;
/**
* @author 夜雨
* @since 2025-05-30 22:58
*/
@Data
public class TagRequest {
private String bizId;
private String zhCN;
}
@@ -4,6 +4,7 @@ import com.imyeyu.api.modules.gao.entity.GaoStoreBusinessDay;
import com.imyeyu.spring.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
@@ -27,7 +28,7 @@ public interface GaoStoreBusinessDayMapper extends BaseMapper<GaoStoreBusinessDa
/// @param storeId 门店 ID
/// @param dateValue 日期值,格式为 yyyyMMdd
/// @return 营业日序号
@Select("SELECT MAX(`business_day_no`) FROM `gao_store_business_day` WHERE `store_id` = #{storeId} AND `date_value` < #{dateValue} AND `open_status` = 'OPEN' AND `deleted_at` IS NULL")
@Select("SELECT MAX(`business_day_no`) FROM `gao_store_business_day` WHERE `store_id` = #{storeId} AND `date_value` < #{dateValue} AND `status` = 'OPEN' AND `deleted_at` IS NULL")
Long selectLastBusinessDayNoBefore(@Param("storeId") String storeId, @Param("dateValue") Integer dateValue);
/// 查询指定日期及之后的营业日
@@ -35,9 +36,16 @@ public interface GaoStoreBusinessDayMapper extends BaseMapper<GaoStoreBusinessDa
/// @param storeId 门店 ID
/// @param beginDateValue 开始日期值,格式为 yyyyMMdd
/// @return 营业日列表
@Select("SELECT * FROM `gao_store_business_day` WHERE `store_id` = #{storeId} AND `date_value` >= #{beginDateValue} AND `open_status` = 'OPEN' AND `deleted_at` IS NULL ORDER BY `date_value` ASC")
@Select("SELECT * FROM `gao_store_business_day` WHERE `store_id` = #{storeId} AND `date_value` >= #{beginDateValue} AND `status` = 'OPEN' AND `deleted_at` IS NULL ORDER BY `date_value` ASC")
List<GaoStoreBusinessDay> selectOpenListFromDate(@Param("storeId") String storeId, @Param("beginDateValue") Integer beginDateValue);
/// 清空指定日期及之后的营业日序号
///
/// @param storeId 门店 ID
/// @param beginDateValue 开始日期值,格式为 yyyyMMdd
@Update("UPDATE `gao_store_business_day` SET `business_day_no` = NULL, `updated_at` = ROUND(UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)) * 1000) WHERE `store_id` = #{storeId} AND `date_value` >= #{beginDateValue} AND `status` = 'OPEN' AND `deleted_at` IS NULL")
void clearBusinessDayNoFromDate(@Param("storeId") String storeId, @Param("beginDateValue") Integer beginDateValue);
/// 查询日期范围内的营业日
///
/// @param storeId 门店 ID
@@ -97,12 +97,11 @@ public class GaoStoreBusinessDayServiceImplement extends AbstractEntityService<G
TimiException.required(storeId, "not found storeId");
TimiException.required(beginDateValue, "not found beginDateValue");
long businessDayNo = TimiJava.defaultIfNull(mapper.selectLastBusinessDayNoBefore(storeId, beginDateValue), 0L);
mapper.clearBusinessDayNoFromDate(storeId, beginDateValue);
for (GaoStoreBusinessDay businessDay : mapper.selectOpenListFromDate(storeId, beginDateValue)) {
businessDayNo++;
if (!Long.valueOf(businessDayNo).equals(businessDay.getBusinessDayNo())) {
businessDay.setBusinessDayNo(businessDayNo);
mapper.update(businessDay);
}
businessDay.setBusinessDayNo(businessDayNo);
mapper.update(businessDay);
eventRecordMapper.updateBusinessDayNoByStoreIdAndRegisteredDateValue(storeId, businessDay.getDateValue(), businessDayNo);
}
}