Compare commits

..
3 Commits
Author SHA1 Message Date
Timi eec665109e v1.0.30
CI / build-deploy (pull_request) Failing after 3s
CI / notify-on-failure (pull_request) Successful in 0s
2026-09-02 01:37:47 +08:00
Timi f6a2f5a6f5 support half paid 2026-09-01 14:07:04 +08:00
Timi 9ba610de86 update store diary attachment 2026-09-01 14:06:13 +08:00
10 changed files with 117 additions and 13 deletions
+2 -2
View File
@@ -11,7 +11,7 @@
<groupId>com.imyeyu.timiserverapi</groupId>
<artifactId>TimiServerAPI</artifactId>
<version>1.0.29</version>
<version>1.0.30</version>
<packaging>jar</packaging>
<name>TimiServerAPI</name>
<description>imyeyu.com API</description>
@@ -198,7 +198,7 @@
<dependency>
<groupId>com.imyeyu.java</groupId>
<artifactId>timi-java</artifactId>
<version>0.0.7</version>
<version>0.0.9</version>
</dependency>
<dependency>
<groupId>com.imyeyu.utils</groupId>
@@ -34,6 +34,8 @@ public interface AttachmentMapper extends BaseMapper<Attachment, String>, RawMap
List<Attachment> selectAllByBizIdList(Attachment.BizType bizType, Collection<String> bizIdList, List<String> attachTypes);
List<Attachment> selectImageByBizIdList(Attachment.BizType bizType, Collection<String> bizIdList, String attachType);
long countByBizId(Attachment.BizType bizType, String bizId, List<String> attachTypes);
@Select("SELECT * FROM attachment WHERE `is_destroyed` = FALSE AND `destroy_at` < " + UNIX_TIME)
@@ -45,6 +45,12 @@ public interface AttachmentService extends BaseService<Attachment, String> {
*/
List<Attachment> listByBizId(Attachment.BizType bizType, String bizId, String... attachTypes);
default Map<String, Attachment> mapFirstImageByIdList(Attachment.BizType bizType, Collection<String> bizIdList) {
return mapFirstImageByIdList(bizType, bizIdList, null);
}
Map<String, Attachment> mapFirstImageByIdList(Attachment.BizType bizType, Collection<String> bizIdList, String attachType);
/**
* 根据多个业务 ID 批量获取附件
*
@@ -34,10 +34,12 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -244,9 +246,14 @@ public class AttachmentServiceImplement extends AbstractEntityService<Attachment
return mapper.selectAllByBizIdList(bizType, List.of(bizId), List.of(attachTypes));
}
@Override
public Map<String, Attachment> mapFirstImageByIdList(Attachment.BizType bizType, Collection<String> bizIdList, String attachType) {
return mapper.selectImageByBizIdList(bizType, new HashSet<>(bizIdList), attachType).stream().collect(Collectors.toMap(Attachment::getBizId, Function.identity()));
}
@Override
public Map<String, List<Attachment>> mapByBizIdList(Attachment.BizType bizType, Collection<String> bizIdList, String... attachTypes) {
return mapper.selectAllByBizIdList(bizType, bizIdList, List.of(attachTypes)).stream().collect(Collectors.groupingBy(Attachment::getBizId));
return mapper.selectAllByBizIdList(bizType, new HashSet<>(bizIdList), List.of(attachTypes)).stream().collect(Collectors.groupingBy(Attachment::getBizId));
}
@Override
@@ -71,10 +71,19 @@ public class GaoCustomerPackageController {
if (result.getList().isEmpty()) {
return result;
}
fillTransient(result.getList());
Map<String, GaoCustomer> customerMap = customerService.mapByIdList(result.getList().stream().map(GaoCustomerPackage::getCustomerId).toList());
List<String> customerIdList = result.getList().stream()
.map(GaoCustomerPackage::getCustomerId)
.filter(value -> value != null && !value.isBlank())
.distinct()
.toList();
Map<String, GaoCustomer> customerMap = customerService.mapByIdList(customerIdList);
Map<String, List<Attachment>> attachmentMap = attachmentService.mapByBizIdList(Attachment.BizType.GAO_CUSTOMER, customerIdList, GaoCustomer.AttachType.PHOTO.name());
for (GaoCustomerPackage packageEntity : result.getList()) {
packageEntity.setCustomer(customerMap.get(packageEntity.getCustomerId()));
GaoCustomer customer = customerMap.get(packageEntity.getCustomerId());
if (customer != null) {
customer.setAttachmentList(attachmentMap.get(customer.getId()));
}
packageEntity.setCustomer(customer);
}
return result;
}
@@ -8,6 +8,7 @@ import com.imyeyu.api.modules.gao.annotation.RequireGaoPermission;
import com.imyeyu.api.modules.gao.bean.GaoPermissionCode;
import com.imyeyu.api.modules.gao.service.GaoStoreDiaryService;
import com.imyeyu.api.modules.gao.service.GaoStoreScopeService;
import com.imyeyu.api.modules.gao.vo.GaoStoreDiaryPage;
import com.imyeyu.api.modules.user.entity.User;
import com.imyeyu.api.modules.user.service.UserLoginService;
import com.imyeyu.api.modules.user.service.UserService;
@@ -16,7 +17,6 @@ import com.imyeyu.java.bean.timi.TimiException;
import com.imyeyu.spring.annotation.AOPLog;
import com.imyeyu.spring.annotation.RequestRateLimit;
import com.imyeyu.spring.bean.PageResult;
import com.imyeyu.api.modules.gao.vo.GaoStoreDiaryPage;
import com.imyeyu.spring.util.ResponseView;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
@@ -25,6 +25,9 @@ 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;
import java.util.Map;
/// GAO 门店日记接口
///
/// @author Codex
@@ -55,7 +58,16 @@ public class GaoStoreDiaryController {
TimiException.required(page.getEndCreatedAt(), "未找到门店日记结束时间");
TimiException.requiredTrue(page.getBeginCreatedAt() < page.getEndCreatedAt(), "门店日记时间范围无效");
page.setStoreId(storeScopeService.resolveStoreId(page.getStoreId()));
return service.page(page);
PageResult<Article> result = service.page(page);
{
List<String> articleIdList = result.getList().stream().map(Article::getId).toList();
Map<String, Attachment> attachMap = attachmentService.mapFirstImageByIdList(Attachment.BizType.ARTICLE, articleIdList);
for (Article article : result.getList()) {
Attachment attachment = attachMap.get(article.getId());
article.setAttachmentList(TimiJava.ofList(attachment));
}
}
return result;
}
/// 查询门店日记详情
@@ -1,8 +1,8 @@
package com.imyeyu.api.modules.gao.service;
import com.imyeyu.api.modules.common.entity.Article;
import com.imyeyu.spring.bean.PageResult;
import com.imyeyu.api.modules.gao.vo.GaoStoreDiaryPage;
import com.imyeyu.spring.bean.PageResult;
/// GAO 门店日记服务
///
@@ -1,8 +1,10 @@
package com.imyeyu.api.modules.gao.service.implement;
import com.imyeyu.api.bean.ModuleCode;
import com.imyeyu.api.config.dbsource.TimiServerDBConfig;
import com.imyeyu.api.modules.common.entity.Attachment;
import com.imyeyu.api.modules.common.service.AttachmentService;
import com.imyeyu.api.modules.gao.bean.GaoRoleCode;
import com.imyeyu.api.modules.gao.entity.GaoCustomerPackage;
import com.imyeyu.api.modules.gao.entity.GaoCustomerPackageItem;
import com.imyeyu.api.modules.gao.entity.GaoPackageDelivery;
@@ -18,6 +20,7 @@ import com.imyeyu.api.modules.gao.vo.GaoPackageDeliveryPage;
import com.imyeyu.api.modules.gao.vo.GaoPackageDeliveryRevokeRequest;
import com.imyeyu.api.modules.system.entity.Logger;
import com.imyeyu.api.modules.system.service.LoggerService;
import com.imyeyu.api.modules.user.service.RoleChecker;
import com.imyeyu.api.modules.user.service.UserLoginService;
import com.imyeyu.java.TimiJava;
import com.imyeyu.java.bean.timi.TimiCode;
@@ -55,6 +58,7 @@ public class GaoPackageDeliveryServiceImplement extends AbstractEntityService<Ga
private final GaoCustomerPackageService customerPackageService;
private final AttachmentService attachmentService;
private final GaoStoreScopeService storeScopeService;
private final RoleChecker roleChecker;
private final UserLoginService userLoginService;
private final LoggerService loggerService;
@@ -156,7 +160,7 @@ public class GaoPackageDeliveryServiceImplement extends AbstractEntityService<Ga
}
TimiException.requiredTrue(hasAttachment(request.getAttachmentList()), "发放必须上传照片");
TimiException.requiredTrue(packageEntity.getStatus() == GaoCustomerPackage.Status.ACTIVE, "当前套餐不可发放");
TimiException.requiredTrue(packageEntity.getPaymentStatus() == GaoCustomerPackage.PaymentStatus.PAID, "套餐未付清,不能发放");
checkPaymentForDelivery(packageEntity);
List<GaoPackageDeliveryItem> requestItemList = validateRequestItems(request.getItemList());
Map<String, GaoCustomerPackageItem> packageItemMap = new HashMap<>();
for (GaoPackageDeliveryItem requestItem : requestItemList) {
@@ -213,7 +217,7 @@ public class GaoPackageDeliveryServiceImplement extends AbstractEntityService<Ga
GaoCustomerPackage packageEntity = customerPackageService.getForUpdate(delivery.getCustomerPackageId());
TimiException.required(packageEntity, "not found customer package");
TimiException.requiredTrue(packageEntity.getStatus() == GaoCustomerPackage.Status.ACTIVE, "当前套餐不可核销发放");
TimiException.requiredTrue(packageEntity.getPaymentStatus() == GaoCustomerPackage.PaymentStatus.PAID, "套餐未付清,不能核销发放");
checkPaymentForDelivery(packageEntity);
List<GaoPackageDeliveryItem> itemList = itemMapper.selectByDeliveryId(delivery.getId());
for (GaoPackageDeliveryItem deliveryItem : itemList) {
GaoCustomerPackageItem packageItem = customerPackageService.getItemForUpdate(deliveryItem.getCustomerPackageItemId());
@@ -400,6 +404,19 @@ public class GaoPackageDeliveryServiceImplement extends AbstractEntityService<Ga
return reason != null && !reason.trim().isEmpty();
}
private boolean canDeliver(GaoCustomerPackage packageEntity) {
return safeLong(packageEntity.getSaleAmount()) == 0 || 0 < safeLong(packageEntity.getPaidAmount());
}
private void checkPaymentForDelivery(GaoCustomerPackage packageEntity) {
long saleAmount = safeLong(packageEntity.getSaleAmount());
long paidAmount = safeLong(packageEntity.getPaidAmount());
TimiException.requiredTrue(canDeliver(packageEntity), "套餐未有已核销收款,不能发放");
if (0 < paidAmount && paidAmount < saleAmount) {
roleChecker.checkAny(ModuleCode.GAO, GaoRoleCode.STORE_MANAGER.name());
}
}
private boolean sameText(String left, String right) {
return left == null ? right == null : left.equals(right);
}
@@ -407,4 +424,8 @@ public class GaoPackageDeliveryServiceImplement extends AbstractEntityService<Ga
private BigDecimal decimal(BigDecimal value) {
return value == null ? ZERO : value;
}
private long safeLong(Long value) {
return value == null ? 0L : value;
}
}
@@ -6,12 +6,11 @@ import com.imyeyu.api.modules.common.entity.Attachment;
import com.imyeyu.api.modules.common.mapper.ArticleMapper;
import com.imyeyu.api.modules.common.service.ArticleService;
import com.imyeyu.api.modules.common.service.AttachmentService;
import com.imyeyu.api.modules.gao.service.GaoStoreDiaryService;
import com.imyeyu.api.modules.gao.mapper.GaoStoreDiaryMapper;
import com.imyeyu.api.modules.gao.service.GaoStoreDiaryService;
import com.imyeyu.api.modules.gao.vo.GaoStoreDiaryPage;
import com.imyeyu.java.TimiJava;
import com.imyeyu.java.bean.timi.TimiException;
import com.imyeyu.spring.bean.Page;
import com.imyeyu.spring.bean.PageResult;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -1,6 +1,54 @@
<?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.imyeyu.api.modules.common.mapper.AttachmentMapper">
<select id="selectImageByBizIdList" resultType="com.imyeyu.api.modules.common.entity.Attachment">
SELECT
`ranked`.`id`,
`ranked`.`biz_type`,
`ranked`.`biz_id`,
`ranked`.`attach_type`,
`ranked`.`mongo_id`,
`ranked`.`title`,
`ranked`.`name`,
`ranked`.`mime_type`,
`ranked`.`metadata`,
`ranked`.`size`,
`ranked`.`md5`,
`ranked`.`uploader_ip`,
`ranked`.`is_destroyed`,
`ranked`.`created_at`,
`ranked`.`updated_at`,
`ranked`.`deleted_at`,
`ranked`.`destroy_at`
FROM (
SELECT
`attachment`.*,
ROW_NUMBER() OVER (
PARTITION BY `attachment`.`biz_id`
ORDER BY `attachment`.`created_at`, `attachment`.`id`
) AS `row_num`
FROM `attachment`
WHERE
`biz_type` = #{bizType}
<if test="bizIdList != null and !bizIdList.isEmpty()">
AND `biz_id` IN
<foreach collection="bizIdList" item="bizId" separator="," open="(" close=")">
#{bizId}
</foreach>
</if>
<if test="bizIdList == null or bizIdList.isEmpty()">
AND FALSE
</if>
AND `mime_type` LIKE "image/%"
AND `deleted_at` IS NULL
AND (`destroy_at` IS NULL OR UNIX_TIMESTAMP() &lt; `destroy_at`)
<if test="attachType != null and !attachType.isEmpty()">
AND `attach_type` = #{attachType}
</if>
) `ranked`
WHERE `ranked`.`row_num` = 1
ORDER BY `ranked`.`created_at`, `ranked`.`id`
</select>
<select id="selectAllByBizIdList" resultType="com.imyeyu.api.modules.common.entity.Attachment">
SELECT
*