diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/SyncNoticeController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/SyncNoticeController.java new file mode 100644 index 00000000..c3cd60e5 --- /dev/null +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/SyncNoticeController.java @@ -0,0 +1,72 @@ +package com.czg.controller.admin; + +import com.czg.account.entity.SyncNotice; +import com.czg.account.service.SyncNoticeService; +import com.czg.product.dto.SyncNoticeReadDTO; +import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryWrapper; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author Administrator + */ +@RestController +@RequestMapping("/admin/syncNotice") +public class SyncNoticeController { + @Resource + private SyncNoticeService syncNoticeService; + + /** + * 通知消息列表 + * @param name 名称 + * @param startTime 起始时间 + * @param endTime 结束时间 + * @param type 0-商品 1-耗材 + * @param isRead 0-未读 1-已读 + * @return 分页数据 + */ + @GetMapping + public CzgResult> page(@RequestParam(required = false) String name, @RequestParam(required = false) String startTime, + @RequestParam(required = false) String endTime, @RequestParam(required = false) Integer type, + @RequestParam(required = false) Integer isRead) { + return CzgResult.success(syncNoticeService.pageInfo(StpKit.USER.getShopId(), name, startTime, endTime, type, isRead)); + } + + /** + * 详情 + * @param id id + * @return 详细信息 + */ + @GetMapping("/detail") + public CzgResult detail(@RequestParam Long id) { + return CzgResult.success(syncNoticeService.getOne(new QueryWrapper().eq(SyncNotice::getShopId, StpKit.USER.getShopId()).eq(SyncNotice::getId, id))); + } + + + /** + * 已读消息 + * @return 是否成功 + */ + @PutMapping("/read") + public CzgResult read(@RequestBody @Validated SyncNoticeReadDTO syncNoticeReadDTO) { + return CzgResult.success(syncNoticeService.read(StpKit.USER.getShopId(), syncNoticeReadDTO)); + } + + + /** + * 消息统计 + * @return 消息记录数 + */ + @PutMapping("/count") + public CzgResult count(@RequestParam Integer isRead) { + QueryWrapper queryWrapper = new QueryWrapper().eq(SyncNotice::getShopId, StpKit.USER.getShopId()); + queryWrapper.eq(SyncNotice::getIsRead, isRead); + return CzgResult.success(syncNoticeService.count(queryWrapper)); + } + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/SyncNoticeDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/SyncNoticeDTO.java new file mode 100644 index 00000000..37d4e843 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/SyncNoticeDTO.java @@ -0,0 +1,64 @@ + +package com.czg.account.dto; + +import java.io.Serializable; +import java.time.LocalDateTime; +import com.alibaba.fastjson2.annotation.JSONField; +import java.io.Serial; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 实体类。 + * + * @author zs + * @since 2025-04-07 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SyncNoticeDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 商品名称或耗材名称 + */ + private String name; + + /** + * 来源id + */ + private Long sourceId; + + /** + * 操作用户id + */ + private Long sysUserId; + + /** + * 通知类型 0 商品变动 1 耗材变动 + */ + private Integer type; + + /** + * 是否已读,1已读 + */ + private Integer isRead; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 创建时间 + */ + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/SyncNotice.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/SyncNotice.java new file mode 100644 index 00000000..2d888957 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/SyncNotice.java @@ -0,0 +1,73 @@ +package com.czg.account.entity; + +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; +import java.io.Serializable; +import java.time.LocalDateTime; + +import java.io.Serial; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 实体类。 + * + * @author zs + * @since 2025-04-07 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("tb_sync_notice") +public class SyncNotice implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Id(keyType = KeyType.Auto) + private Long id; + + /** + * 商品名称或耗材名称 + */ + private String name; + + /** + * 来源id + */ + private Long sourceId; + + /** + * 操作用户id + */ + private Long sysUserId; + + /** + * 通知类型 0 商品变动 1 耗材变动 + */ + private Integer type; + + /** + * 是否已读,1已读 + */ + private Integer isRead; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 创建时间 + */ + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + private LocalDateTime readTime; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/SyncNoticeService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/SyncNoticeService.java new file mode 100644 index 00000000..268bf1ee --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/SyncNoticeService.java @@ -0,0 +1,31 @@ +package com.czg.account.service; + +import com.czg.product.dto.SyncNoticeReadDTO; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.service.IService; +import com.czg.account.entity.SyncNotice; + +import java.util.List; + +/** + * 服务层。 + * + * @author zs + * @since 2025-04-07 + */ +public interface SyncNoticeService extends IService { + /** + * 添加消息 + * @param shopId 店铺id + * @param sysUserId 操作用户id + * @param name 商品/耗材名称 + * @param id 商品/耗材id + * @param type 0-商品 1-耗材 + */ + void addNotice(Long shopId, Long sysUserId, String name, Long id, Integer type); + + Page pageInfo(Long shopId, String name, String startTime, String endTime, Integer type, Integer isRead); + + Boolean read(Long shopId, SyncNoticeReadDTO syncNoticeReadDTO); + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/SyncNoticeReadDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/SyncNoticeReadDTO.java new file mode 100644 index 00000000..89838a2a --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/SyncNoticeReadDTO.java @@ -0,0 +1,18 @@ +package com.czg.product.dto; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.util.List; + +/** + * @author Administrator + */ +@Data +public class SyncNoticeReadDTO { + /** + * 消息id + */ + @NotEmpty + private List noticeIdList; +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/SyncNoticeMapper.java b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/SyncNoticeMapper.java new file mode 100644 index 00000000..4912daa7 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/SyncNoticeMapper.java @@ -0,0 +1,14 @@ +package com.czg.service.account.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.account.entity.SyncNotice; + +/** + * 映射层。 + * + * @author zs + * @since 2025-04-07 + */ +public interface SyncNoticeMapper extends BaseMapper { + +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SyncNoticeServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SyncNoticeServiceImpl.java new file mode 100644 index 00000000..7f0a4788 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SyncNoticeServiceImpl.java @@ -0,0 +1,68 @@ +package com.czg.service.account.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.czg.product.dto.SyncNoticeReadDTO; +import com.czg.utils.PageUtil; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.czg.account.entity.SyncNotice; +import com.czg.account.service.SyncNoticeService; +import com.czg.service.account.mapper.SyncNoticeMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 服务层实现。 + * + * @author zs + * @since 2025-04-07 + */ +@Service +public class SyncNoticeServiceImpl extends ServiceImpl implements SyncNoticeService { + + @Override + public void addNotice(Long shopId, Long sysUserId, String name, Long id, Integer type) { + SyncNotice syncNotice = new SyncNotice(); + syncNotice.setShopId(shopId); + syncNotice.setSysUserId(sysUserId); + syncNotice.setName(name); + syncNotice.setSourceId(id); + syncNotice.setType(type); + save(syncNotice); + } + + @Override + public Page pageInfo(Long shopId, String name, String startTime, String endTime, Integer type, Integer isRead) { + QueryWrapper queryWrapper = new QueryWrapper().eq(SyncNotice::getShopId, shopId); + if (StrUtil.isNotBlank(name)) { + queryWrapper.like(SyncNotice::getName, name); + } + + if (StrUtil.isNotBlank(startTime)) { + queryWrapper.ge(SyncNotice::getCreateTime, startTime); + } + + if (StrUtil.isNotBlank(endTime)) { + queryWrapper.le(SyncNotice::getCreateTime, endTime); + } + queryWrapper.eq(SyncNotice::getType, type); + queryWrapper.eq(SyncNotice::getIsRead, isRead); + queryWrapper.orderBy(SyncNotice::getCreateTime, false); + return page(PageUtil.buildPage(), queryWrapper); + } + + @Override + public Boolean read(Long shopId, SyncNoticeReadDTO syncNoticeReadDTO) { + List listed = list(new QueryWrapper().eq(SyncNotice::getShopId, shopId).in(SyncNotice::getId, syncNoticeReadDTO.getNoticeIdList())); + listed.forEach(item -> { + if (item.getIsRead() == 0) { + item.setIsRead(1); + item.setReadTime(DateUtil.date().toLocalDateTime()); + } + }); + return updateBatch(listed); + } +} diff --git a/cash-service/account-service/src/main/resources/mapper/SyncNoticeMapper.xml b/cash-service/account-service/src/main/resources/mapper/SyncNoticeMapper.xml new file mode 100644 index 00000000..e8cb7db0 --- /dev/null +++ b/cash-service/account-service/src/main/resources/mapper/SyncNoticeMapper.xml @@ -0,0 +1,7 @@ + + + + +