From 31b1691a7fa40f065290b61d67525a6f670bf7b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 7 Apr 2025 09:40:35 +0800 Subject: [PATCH 001/162] =?UTF-8?q?=E4=BE=9B=E5=BA=94=E5=95=86=E8=B4=A6?= =?UTF-8?q?=E5=8D=95=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/controller/admin/ShopVendorController.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java index 25350ea01..993f5a352 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java @@ -110,7 +110,7 @@ public class ShopVendorController { * @return 统计信息 */ @GetMapping("summary") - @OperationLog("供应商账单-统计") +// @OperationLog("供应商账单-统计") public CzgResult summary() { return CzgResult.success(shopVendorService.summary(StpKit.USER.getShopId())); } @@ -120,7 +120,7 @@ public class ShopVendorController { * @return 账单列表 */ @GetMapping("/bill") - @OperationLog("供应商账单-列表") +// @OperationLog("供应商账单-列表") public CzgResult> bill() { return CzgResult.success(shopVendorService.billList(StpKit.USER.getShopId())); } @@ -130,7 +130,7 @@ public class ShopVendorController { * @return 记录list */ @GetMapping("/bill/record") - @OperationLog("供应商账单-列表") +// @OperationLog("供应商账单-列表") public CzgResult> bill(@RequestParam Integer vendorId) { return CzgResult.success(shopVendorService.billRecord(StpKit.USER.getShopId(), vendorId)); } @@ -141,7 +141,7 @@ public class ShopVendorController { * @return 记录list */ @PostMapping("/bill/pay") - @OperationLog("供应商账单-付款") +// @OperationLog("供应商账单-付款") public CzgResult pay(@RequestBody @Validated ShopVendorBillPayDTO payDTO) { return CzgResult.success(shopVendorService.pay(StpKit.USER.getShopId(), payDTO)); } @@ -152,7 +152,7 @@ public class ShopVendorController { * @return 记录list */ @GetMapping("/bill/pay/record") - @OperationLog("供应商账单-付款记录") +// @OperationLog("供应商账单-付款记录") public CzgResult> payRecord(@RequestParam Long flowId) { return CzgResult.success(shopVendorService.payRecord(StpKit.USER.getShopId(), flowId)); } From 1b2551dfb19fae4000e79729dd7dd30c3c25ed14 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 7 Apr 2025 09:47:36 +0800 Subject: [PATCH 002/162] =?UTF-8?q?=E5=BA=97=E9=93=BA=E4=B8=BB=E8=A1=A8?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=8F=98=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/account/entity/ShopInfo.java | 99 ++++++++++++------- 1 file changed, 62 insertions(+), 37 deletions(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java index 75f702ab2..641d53d49 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java @@ -38,7 +38,7 @@ public class ShopInfo implements Serializable { /** * 主店id */ - private Integer mainId; + private Long mainId; /** * 店铺口号 @@ -90,7 +90,7 @@ public class ShopInfo implements Serializable { */ private String detail; /** - * 注册类型 + * 注册类型(经营模式) * 快餐版 先付 munchies * 餐饮版 先付/后付 restaurant */ @@ -187,46 +187,11 @@ public class ShopInfo implements Serializable { */ private String address; - /** - * 是否允许会员自定义金额 1 允许 0 不允许 - */ - private Integer isCustomAmount; - - /** - * 是否开启退款密码 1 启用 0 禁用 - */ - private Integer isReturnPwd; - - /** - * 是否开启会员充值密码 1 启用 0 禁用 - */ - private Integer isMemberInPwd; - - /** - * 是否开启会员退款密码 1 启用 0 禁用 - */ - private Integer isMemberReturnPwd; - - /** - * 是否免除桌位费 0否1是 - */ - private Integer isTableFee; - - /** - * 是否开启会员余额支付 - */ - private Integer isAccountPay; - /** * 桌位费 */ private BigDecimal tableFee; - /** - * 是否启用会员价 0否1是 - */ - private Integer isMemberPrice; - /** * 就餐模式 堂食 dine-in 外带 take-out */ @@ -272,4 +237,64 @@ public class ShopInfo implements Serializable { */ private String taxAmount; + /** + * 是否启用商品同步 1-是 0-否 + */ + @Column(ignore = true) + private Integer isEnableProdSync; + /** + * 是否启用会员同步 1-是 0-否 + */ + @Column(ignore = true) + private Integer isEnableVipSync; + /** + * 是否启用耗材同步 1-是 0-否 + */ + @Column(ignore = true) + private Integer isEnableConsSync; + /** + * 是否允许账号登录 1-是 0-否 + */ + @Column(ignore = true) + private Integer isAllowAccountLogin; + /** + * 是否允许会员自定义金额 1-允许 0-不允许 + */ + @Column(ignore = true) + private Integer isCustomAmount; + /** + * 是否开启退款密码 1-启用 0-禁用 + */ + @Column(ignore = true) + private Integer isReturnPwd; + /** + * 是否开启会员充值密码 1-启用 0-禁用 + */ + @Column(ignore = true) + private Integer isMemberInPwd; + /** + * 是否开启会员退款密码 1-启用 0-禁用 + */ + @Column(ignore = true) + private Integer isMemberReturnPwd; + /** + * 是否免除桌位费 1-是 0-否 + */ + @Column(ignore = true) + private Integer isTableFee; + /** + * 是否启用会员价 1-是 0-否 + */ + @Column(ignore = true) + private Integer isMemberPrice; + /** + * 是否允许会员余额支付 1-是 0-否 + */ + @Column(ignore = true) + private Integer isAccountPay; + /** + * 是否主店 1-是 0-否 + */ + @Column(ignore = true) + private Integer isHeadShop; } From b45a2bd82f0123ad1524525ff9fe287dfd21324a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 7 Apr 2025 10:05:00 +0800 Subject: [PATCH 003/162] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/SyncNoticeController.java | 72 ++++++++++++++++++ .../com/czg/account/dto/SyncNoticeDTO.java | 64 ++++++++++++++++ .../com/czg/account/entity/SyncNotice.java | 73 +++++++++++++++++++ .../account/service/SyncNoticeService.java | 31 ++++++++ .../czg/product/dto/SyncNoticeReadDTO.java | 18 +++++ .../account/mapper/SyncNoticeMapper.java | 14 ++++ .../service/impl/SyncNoticeServiceImpl.java | 68 +++++++++++++++++ .../resources/mapper/SyncNoticeMapper.xml | 7 ++ 8 files changed, 347 insertions(+) create mode 100644 cash-api/account-server/src/main/java/com/czg/controller/admin/SyncNoticeController.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/dto/SyncNoticeDTO.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/entity/SyncNotice.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/service/SyncNoticeService.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/product/dto/SyncNoticeReadDTO.java create mode 100644 cash-service/account-service/src/main/java/com/czg/service/account/mapper/SyncNoticeMapper.java create mode 100644 cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SyncNoticeServiceImpl.java create mode 100644 cash-service/account-service/src/main/resources/mapper/SyncNoticeMapper.xml 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 000000000..c3cd60e56 --- /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 000000000..37d4e8439 --- /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 000000000..2d888957c --- /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 000000000..268bf1eee --- /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 000000000..89838a2a5 --- /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 000000000..4912daa78 --- /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 000000000..7f0a47886 --- /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 000000000..e8cb7db00 --- /dev/null +++ b/cash-service/account-service/src/main/resources/mapper/SyncNoticeMapper.xml @@ -0,0 +1,7 @@ + + + + + From 772c947808e0b965b95a75b3e05c86ade91629ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 7 Apr 2025 10:13:33 +0800 Subject: [PATCH 004/162] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/SyncNoticeController.java | 1 + .../admin/ShopVendorController.java | 8 +++---- .../product/service/ShopVendorService.java | 4 ++-- .../product/mapper/ConsStockFlowMapper.java | 2 +- .../product/mapper/ShopVendorMapper.java | 2 +- .../service/impl/ShopVendorServiceImpl.java | 8 +++---- .../resources/mapper/ConsStockFlowMapper.xml | 21 +++++++++++-------- .../resources/mapper/ShopVendorMapper.xml | 17 ++++++++------- 8 files changed, 35 insertions(+), 28 deletions(-) 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 index c3cd60e56..ee0e6674c 100644 --- 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 @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** + * 通知中心-同步消息 * @author Administrator */ @RestController diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java index 993f5a352..95f7f7f41 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java @@ -121,8 +121,8 @@ public class ShopVendorController { */ @GetMapping("/bill") // @OperationLog("供应商账单-列表") - public CzgResult> bill() { - return CzgResult.success(shopVendorService.billList(StpKit.USER.getShopId())); + public CzgResult> bill(@RequestParam(required = false) String key) { + return CzgResult.success(shopVendorService.billList(StpKit.USER.getShopId(), key)); } /** @@ -131,8 +131,8 @@ public class ShopVendorController { */ @GetMapping("/bill/record") // @OperationLog("供应商账单-列表") - public CzgResult> bill(@RequestParam Integer vendorId) { - return CzgResult.success(shopVendorService.billRecord(StpKit.USER.getShopId(), vendorId)); + public CzgResult> bill(@RequestParam Integer vendorId, @RequestParam(required = false) String key) { + return CzgResult.success(shopVendorService.billRecord(StpKit.USER.getShopId(), vendorId, key)); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopVendorService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopVendorService.java index 493d86aa7..3ca516bf3 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopVendorService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopVendorService.java @@ -70,7 +70,7 @@ public interface ShopVendorService extends IService { * @param shopId 店铺id * @return 账单 */ - Page billList(Long shopId); + Page billList(Long shopId, String key); /** * 账单记录明细 @@ -79,7 +79,7 @@ public interface ShopVendorService extends IService { * @param vendorId 供应商id * @return 分页 */ - Page billRecord(Long shopId, Integer vendorId); + Page billRecord(Long shopId, Integer vendorId, String key); /** * 账单付款 diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ConsStockFlowMapper.java b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ConsStockFlowMapper.java index 490a9a67f..5ea8a4d12 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ConsStockFlowMapper.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ConsStockFlowMapper.java @@ -21,7 +21,7 @@ import java.util.List; public interface ConsStockFlowMapper extends BaseMapper { ConsStatisticsVo getConsStatistics(ConsInfoParam param); - List selectByVendorId(@Param("shopId") Long shopId, @Param("vendorId") Integer vendorId); + List selectByVendorId(@Param("shopId") Long shopId, @Param("vendorId") Integer vendorId, @Param("key") String key); List selectUnPaid(@Param("shopId") Long shopId, @Param("vendorIds") @NotEmpty List vendorIds); } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ShopVendorMapper.java b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ShopVendorMapper.java index 07234afa2..cbf2dc2d1 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ShopVendorMapper.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ShopVendorMapper.java @@ -21,5 +21,5 @@ public interface ShopVendorMapper extends BaseMapper { ShopVendorSummaryVO summary(@Param("shopId") Long shopId); - List bill(@Param("shopId") Long shopId); + List bill(@Param("shopId") Long shopId, @Param("key") String key); } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java index 92ef6de2d..62fe82c3d 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java @@ -122,15 +122,15 @@ public class ShopVendorServiceImpl extends ServiceImpl billList(Long shopId) { + public Page billList(Long shopId, String key) { PageHelper.startPage(PageUtil.buildPageHelp()); - return PageUtil.convert(new PageInfo<>(mapper.bill(shopId))); + return PageUtil.convert(new PageInfo<>(mapper.bill(shopId, key))); } @Override - public Page billRecord(Long shopId, Integer vendorId) { + public Page billRecord(Long shopId, Integer vendorId, String key) { PageHelper.startPage(PageUtil.buildPageHelp()); - return PageUtil.convert(new PageInfo<>(consStockFlowMapper.selectByVendorId(shopId, vendorId))); + return PageUtil.convert(new PageInfo<>(consStockFlowMapper.selectByVendorId(shopId, vendorId, key))); } @Override diff --git a/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml b/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml index ad05381b8..cb5b52c2a 100644 --- a/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml +++ b/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml @@ -37,17 +37,20 @@ From e95c602e857a6d2a5e1552be12b258ac0f90e29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 7 Apr 2025 10:16:30 +0800 Subject: [PATCH 005/162] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/mapper/ConsStockFlowMapper.xml | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml b/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml index cb5b52c2a..a1c812d03 100644 --- a/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml +++ b/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml @@ -36,20 +36,21 @@ From df95923d4adb0a1569687c387d57ac0e655a668e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 7 Apr 2025 10:19:31 +0800 Subject: [PATCH 006/162] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/controller/admin/SyncNoticeController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index ee0e6674c..4598d55aa 100644 --- 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 @@ -64,7 +64,7 @@ public class SyncNoticeController { * @return 消息记录数 */ @PutMapping("/count") - public CzgResult count(@RequestParam Integer isRead) { + public CzgResult count(@RequestParam(required = false) Integer isRead) { QueryWrapper queryWrapper = new QueryWrapper().eq(SyncNotice::getShopId, StpKit.USER.getShopId()); queryWrapper.eq(SyncNotice::getIsRead, isRead); return CzgResult.success(syncNoticeService.count(queryWrapper)); From 821d67c52736ff8001d3193dd4e766f348190a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 7 Apr 2025 10:34:35 +0800 Subject: [PATCH 007/162] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/account/entity/SyncNotice.java | 9 ++++++++ .../account/service/SyncNoticeService.java | 3 ++- .../service/impl/SyncNoticeServiceImpl.java | 23 +++++++++++++++++-- .../service/impl/ConsInfoServiceImpl.java | 7 +++++- 4 files changed, 38 insertions(+), 4 deletions(-) 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 index 2d888957c..414234dde 100644 --- 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 @@ -62,6 +62,15 @@ public class SyncNotice implements Serializable { * 店铺id */ private Long shopId; + /** + * 操作类型 0 新增 1 修改 + */ + private Integer operationType; + + /** + * 消息内容 + */ + private String content; /** * 创建时间 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 index 268bf1eee..ba1261afd 100644 --- 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 @@ -21,8 +21,9 @@ public interface SyncNoticeService extends IService { * @param name 商品/耗材名称 * @param id 商品/耗材id * @param type 0-商品 1-耗材 + * @param operationType 0-新增 1-修改 */ - void addNotice(Long shopId, Long sysUserId, String name, Long id, Integer type); + void addNotice(Long shopId, Long sysUserId, String name, Long id, Integer type, Integer operationType); Page pageInfo(Long shopId, String name, String startTime, String endTime, Integer type, Integer isRead); 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 index 7f0a47886..456c99e4b 100644 --- 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 @@ -10,6 +10,7 @@ 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.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; import java.util.List; @@ -20,17 +21,35 @@ import java.util.List; * @author zs * @since 2025-04-07 */ -@Service +@DubboService public class SyncNoticeServiceImpl extends ServiceImpl implements SyncNoticeService { @Override - public void addNotice(Long shopId, Long sysUserId, String name, Long id, Integer type) { + public void addNotice(Long shopId, Long sysUserId, String name, Long id, Integer type, Integer operationType) { SyncNotice syncNotice = new SyncNotice(); syncNotice.setShopId(shopId); syncNotice.setSysUserId(sysUserId); syncNotice.setName(name); syncNotice.setSourceId(id); syncNotice.setType(type); + syncNotice.setOperationType(operationType); + String content = switch (operationType) { + case 0 -> "新增"; + case 1 -> "修改"; + default -> ""; + }; + + switch (type) { + case 0: + content += "商品"; + break; + case 1: + content += "耗材"; + break; + } + + content = StrUtil.format("{}: {}({}), 请及时确认;", content, name, id); + syncNotice.setContent(content); save(syncNotice); } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java index 0ac3bfa32..2aef23f27 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java @@ -3,6 +3,7 @@ package com.czg.service.product.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; +import com.czg.account.service.SyncNoticeService; import com.czg.enums.CrudEnum; import com.czg.enums.StatusEnum; import com.czg.enums.YesNoEnum; @@ -26,6 +27,7 @@ import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.update.UpdateChain; import com.mybatisflex.spring.service.impl.ServiceImpl; import lombok.AllArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -48,6 +50,9 @@ public class ConsInfoServiceImpl extends ServiceImpl i private final ConsGroupMapper consGroupMapper; private final ConsStockFlowMapper consStockFlowMapper; + @DubboReference + private SyncNoticeService syncNoticeService; + private QueryWrapper buildQueryWrapper(ConsInfoDTO param) { QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper(); if (ObjUtil.isNotNull(param.getConsGroupId())) { @@ -204,4 +209,4 @@ public class ConsInfoServiceImpl extends ServiceImpl i return data; } -} \ No newline at end of file +} From 89f57add06908d0cb857ab367cfb7fba68a6a474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 7 Apr 2025 10:36:16 +0800 Subject: [PATCH 008/162] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/controller/admin/SyncNoticeController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 4598d55aa..2f4d28f2a 100644 --- 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 @@ -63,7 +63,7 @@ public class SyncNoticeController { * 消息统计 * @return 消息记录数 */ - @PutMapping("/count") + @GetMapping("/count") public CzgResult count(@RequestParam(required = false) Integer isRead) { QueryWrapper queryWrapper = new QueryWrapper().eq(SyncNotice::getShopId, StpKit.USER.getShopId()); queryWrapper.eq(SyncNotice::getIsRead, isRead); From 882a36fb944e0c7aaf1e2e8d8446dc6c76040977 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 7 Apr 2025 10:55:32 +0800 Subject: [PATCH 009/162] =?UTF-8?q?pad=E7=82=B9=E9=A4=90=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/account/dto/pad/PadDetailDTO.java | 3 +- .../czg/product/service/ProductService.java | 4 + .../java/com/czg/product/vo/ProductVO.java | 16 ++++ .../service/impl/PadProdServiceImpl.java | 3 +- .../service/product/mapper/ProductMapper.java | 2 + .../service/impl/ProductServiceImpl.java | 6 ++ .../main/resources/mapper/ProductMapper.xml | 86 +++++++++++++------ 7 files changed, 91 insertions(+), 29 deletions(-) create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/pad/PadDetailDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/pad/PadDetailDTO.java index f9916d5ce..57fd03c20 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/pad/PadDetailDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/pad/PadDetailDTO.java @@ -1,6 +1,7 @@ package com.czg.account.dto.pad; import com.czg.product.entity.Product; +import com.czg.product.vo.ProductVO; import lombok.Data; import java.util.List; @@ -13,5 +14,5 @@ public class PadDetailDTO { private Long id; private Long padLayoutId; private List productIdList; - private List productList; + private List productList; } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java index f6e0a5cd7..4b08b8386 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java @@ -5,6 +5,7 @@ import com.czg.product.entity.Product; import com.czg.product.entity.ProductStockFlow; import com.czg.product.param.*; import com.czg.product.vo.ProductStatisticsVo; +import com.czg.product.vo.ProductVO; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; @@ -127,4 +128,7 @@ public interface ProductService extends IService { * @param records 商品数据集合 */ void refreshProductStock(ProductDTO param, List records); + + List listAndLowPrice(Long shopId, List productIds); + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java new file mode 100644 index 000000000..9db815bc8 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java @@ -0,0 +1,16 @@ +package com.czg.product.vo; + +import com.czg.product.entity.Product; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * @author Administrator + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class ProductVO extends Product { + private BigDecimal lowPrice; +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java index b61e20e66..b7eb81f8f 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java @@ -6,6 +6,7 @@ import com.czg.account.service.*; import com.czg.exception.ApiNotPrintException; import com.czg.product.entity.Product; import com.czg.product.service.ProductService; +import com.czg.product.vo.ProductVO; import com.czg.service.account.mapper.PadProductCategoryDetailMapper; import com.czg.utils.JoinQueryWrapper; import com.czg.utils.PageUtil; @@ -57,7 +58,7 @@ public class PadProdServiceImpl implements PadProdService { List productIds = padProductCategoryDetailMapper.selectListByQuery(new QueryWrapper().eq(PadProductCategoryDetail::getPadProductCategoryId, padProductCategory)).stream().map(PadProductCategoryDetail::getProductId).toList(); padDetailDTO.setProductIdList(productIds); if (!productIds.isEmpty()) { - List products = productService.list(new QueryWrapper().in(Product::getId, productIds).eq(Product::getShopId, shopId)); + List products = productService.listAndLowPrice(shopId, productIds); padDetailDTO.setProductList(products); } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProductMapper.java b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProductMapper.java index d975c4a0b..edd9e74f0 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProductMapper.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProductMapper.java @@ -2,6 +2,7 @@ package com.czg.service.product.mapper; import com.czg.product.dto.ProductDTO; import com.czg.product.entity.Product; +import com.czg.product.vo.ProductVO; import com.czg.product.vo.RecommendProVO; import com.czg.product.vo.ShopProductInfoVo; import com.czg.product.vo.ShopProductVo; @@ -47,4 +48,5 @@ public interface ProductMapper extends BaseMapper { String getShopName(@Param("shopId") Long shopId); + List productList(@Param("shopId") Long shopId, @Param("productIds") List productIds); } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java index 93815597a..b2f8268b4 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java @@ -22,6 +22,7 @@ import com.czg.product.service.ProductService; import com.czg.product.service.ProductStockFlowService; import com.czg.product.service.SensitiveOperationService; import com.czg.product.vo.ProductStatisticsVo; +import com.czg.product.vo.ProductVO; import com.czg.sa.StpKit; import com.czg.service.product.mapper.*; import com.czg.utils.PageUtil; @@ -645,4 +646,9 @@ public class ProductServiceImpl extends ServiceImpl impl record.setStockNumber(stock.getOrDefault(record.getId(), 0)); }); } + + @Override + public List listAndLowPrice(Long shopId, List productIds) { + return mapper.productList(shopId, productIds); + } } diff --git a/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml b/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml index 86459c688..3da88ba05 100644 --- a/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml +++ b/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml @@ -79,7 +79,7 @@ t2.member_price, t1.cover_img, t1.images, - t3.name as unit_name, + t3.name as unit_name, t1.is_sold_stock, t1.stock_number, t1.type, @@ -88,25 +88,28 @@ t1.start_time, t1.end_time, t1.is_hot, - ifnull(t2.suit_num, 1) as suit_num, + ifnull(t2.suit_num, 1) as suit_num, t1.select_spec_info, t1.group_snap, t1.pack_fee, ifnull(t4.sales_volume, 0) as sales_volume from tb_product t1 - left join (select x.product_id, - x.id as sku_id, - MIN(x.sale_price) as sale_price, - x.origin_price, - x.member_price, - x.suit_num - from tb_prod_sku x - where x.is_del = 0 - and x.is_grounding = 1 - and x.shop_id = #{shopId} - group by x.product_id) t2 on t1.id = t2.product_id - left join tb_shop_prod_unit t3 on t1.unit_id = t3.id - left join (select product_id,sum(num) as sales_volume from tb_order_detail where pay_amount is not null group by product_id) t4 on t1.id = t4.product_id + left join (select x.product_id, + x.id as sku_id, + MIN(x.sale_price) as sale_price, + x.origin_price, + x.member_price, + x.suit_num + from tb_prod_sku x + where x.is_del = 0 + and x.is_grounding = 1 + and x.shop_id = #{shopId} + group by x.product_id) t2 on t1.id = t2.product_id + left join tb_shop_prod_unit t3 on t1.unit_id = t3.id + left join (select product_id, sum(num) as sales_volume + from tb_order_detail + where pay_amount is not null + group by product_id) t4 on t1.id = t4.product_id select ifnull( ROUND(ST_Distance_Sphere(POINT(b.lng, b.lat), POINT(#{lng}, #{lat})) / 1000, 2), 0) AS distance, - c.name, a.origin_price, a.sale_price, b.shop_name, b.districts, c.cover_img, b.logo, c.id, - a.real_sales_number saleNum, (round(a.sale_price / a.origin_price, 2) * 10) AS discount, + c.name, a.origin_price, a.sale_price, b.shop_name, b.districts, c.cover_img, b.logo, c.id, + a.real_sales_number saleNum, (round(a.sale_price / a.origin_price, 2) * 10) AS discount, c.id productId, a.id skuId, b.id shopId from tb_prod_sku as a left join tb_product c on c.id=a.product_id @@ -208,17 +216,41 @@ + update tb_product From 0197efb7e7baed7d5076fefa559c64cbcbb85854 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 7 Apr 2025 10:56:29 +0800 Subject: [PATCH 010/162] =?UTF-8?q?=E5=BA=97=E9=93=BA=E4=B8=BB=E8=A1=A8?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=8F=98=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/czg/account/entity/ShopInfo.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java index 641d53d49..2ded60769 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java @@ -236,7 +236,10 @@ public class ShopInfo implements Serializable { * 税率 */ private String taxAmount; - + /** + * 是否主店 1-是 0-否 + */ + private Integer isHeadShop; /** * 是否启用商品同步 1-是 0-否 */ @@ -292,9 +295,5 @@ public class ShopInfo implements Serializable { */ @Column(ignore = true) private Integer isAccountPay; - /** - * 是否主店 1-是 0-否 - */ - @Column(ignore = true) - private Integer isHeadShop; + } From 342b4fd6f8c5b7e5bbc755c74187f56a6949abbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 7 Apr 2025 10:59:05 +0800 Subject: [PATCH 011/162] =?UTF-8?q?pad=E7=82=B9=E9=A4=90=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/ProductMapper.xml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml b/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml index 3da88ba05..5b3409ac8 100644 --- a/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml +++ b/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml @@ -245,11 +245,14 @@ From fffa1e5389b227bbf162f78384443ba0b56ff4ff Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 7 Apr 2025 11:40:25 +0800 Subject: [PATCH 012/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ShopInfoController.java | 6 +- .../com/czg/account/dto/ShopConfigDTO.java | 81 +++++++++++++ .../account/dto/shopinfo/ShopInfoAddDTO.java | 8 ++ .../account/dto/shopinfo/ShopInfoEditDTO.java | 6 +- .../com/czg/account/entity/ShopConfig.java | 85 ++++++++++++++ .../enums/BranchDataSyncMethodEnum.java | 43 +++++++ .../com/czg/account/enums/ShopTypeEnum.java | 48 ++++++++ .../account/service/ShopConfigService.java | 14 +++ .../czg/account/service/ShopInfoService.java | 2 +- .../account/mapper/ShopConfigMapper.java | 16 +++ .../service/impl/ShopConfigServiceImpl.java | 39 +++++++ .../service/impl/ShopInfoServiceImpl.java | 108 ++++++++++++++++-- .../resources/mapper/ShopConfigMapper.xml | 6 + sqls/250403/cash.sql | 66 ++++++++++- 14 files changed, 513 insertions(+), 15 deletions(-) create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopConfigDTO.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopConfig.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/enums/BranchDataSyncMethodEnum.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/enums/ShopTypeEnum.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopConfigService.java create mode 100644 cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java create mode 100644 cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopConfigServiceImpl.java create mode 100644 cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java index 863415121..dde3b0786 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java @@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.*; /** * 店铺管理 + * * @author Administrator */ @RestController @@ -35,8 +36,8 @@ public class ShopInfoController { @SaAdminCheckRole("管理员") @SaAdminCheckPermission(value = "shopInfo:list", name = "店铺列表") @GetMapping - public CzgResult> get(PageDTO pageDTO, String shopName, Integer status) { - return CzgResult.success(shopInfoService.get(pageDTO, shopName, status)); + public CzgResult> get(PageDTO pageDTO, String shopName, Integer status, Integer isHeadShop) { + return CzgResult.success(shopInfoService.get(pageDTO, shopName, status, isHeadShop)); } /** @@ -83,4 +84,5 @@ public class ShopInfoController { public CzgResult delete(@RequestParam Integer id) { return CzgResult.success(shopInfoService.remove(new QueryWrapper().eq(ShopInfo::getId, id))); } + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopConfigDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopConfigDTO.java new file mode 100644 index 000000000..9f9b884a3 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopConfigDTO.java @@ -0,0 +1,81 @@ +package com.czg.account.dto; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** +* 店铺配置扩展 +* +* @author Tankaikai tankaikai@aliyun.com +* @since 1.0 2025-04-03 +*/ +@Data +public class ShopConfigDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 店铺id + */ + private Long id; + /** + * 主店id + */ + private Long mainId; + /** + * 是否启用商品同步 1-是 0-否 + */ + private Integer isEnableProdSync; + /** + * 是否启用会员同步 1-是 0-否 + */ + private Integer isEnableVipSync; + /** + * 是否启用耗材同步 1-是 0-否 + */ + private Integer isEnableConsSync; + /** + * 是否允许账号登录 1-是 0-否 + */ + private Integer isAllowAccountLogin; + /** + * 备注 + */ + private String remark; + /** + * 是否允许会员自定义金额 1-允许 0-不允许 + */ + private Integer isCustomAmount; + /** + * 是否开启退款密码 1-启用 0-禁用 + */ + private Integer isReturnPwd; + /** + * 是否开启会员充值密码 1-启用 0-禁用 + */ + private Integer isMemberInPwd; + /** + * 是否开启会员退款密码 1-启用 0-禁用 + */ + private Integer isMemberReturnPwd; + /** + * 是否免除桌位费 1-是 0-否 + */ + private Integer isTableFee; + /** + * 是否启用会员价 1-是 0-否 + */ + private Integer isMemberPrice; + /** + * 是否允许会员余额支付 1-是 0-否 + */ + private Integer isAccountPay; + /** + * 分店数据同步方式 auto-自动同步 manual-手动同步 + */ + private String branchDataSyncMethod; + +} \ No newline at end of file diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopInfoAddDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopInfoAddDTO.java index 606cf3a87..d42cb6a32 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopInfoAddDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopInfoAddDTO.java @@ -45,4 +45,12 @@ public class ShopInfoAddDTO { private String districts; private String provinces; private String address; + /** + * 是否为主店 + */ + private Integer isHeadShop; + /** + * 主店id + */ + private Long mainId; } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopInfoEditDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopInfoEditDTO.java index a6e7f6dd9..d5f9b6b62 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopInfoEditDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopInfoEditDTO.java @@ -87,7 +87,7 @@ public class ShopInfoEditDTO { /** * 主店id */ - private Integer mainId; + private Long mainId; /** * 店铺口号 @@ -241,4 +241,8 @@ public class ShopInfoEditDTO { * 店铺激活码 */ private String activateCode; + /** + * 是否为主店 1-是 0-否 + */ + private Integer isHeadShop; } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopConfig.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopConfig.java new file mode 100644 index 000000000..7be743baa --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopConfig.java @@ -0,0 +1,85 @@ +package com.czg.account.entity; + +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 店铺配置扩展 + * + * @author Tankaikai tankaikai@aliyun.com + * @since 1.0 2025-04-03 + */ +@Data +@Table("tb_shop_config") +public class ShopConfig implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 店铺id + */ + @Id(keyType = KeyType.None) + private Long id; + /** + * 主店id + */ + private Long mainId; + /** + * 是否启用商品同步 1-是 0-否 + */ + private Integer isEnableProdSync; + /** + * 是否启用会员同步 1-是 0-否 + */ + private Integer isEnableVipSync; + /** + * 是否启用耗材同步 1-是 0-否 + */ + private Integer isEnableConsSync; + /** + * 是否允许账号登录 1-是 0-否 + */ + private Integer isAllowAccountLogin; + /** + * 备注 + */ + private String remark; + /** + * 是否允许会员自定义金额 1-允许 0-不允许 + */ + private Integer isCustomAmount; + /** + * 是否开启退款密码 1-启用 0-禁用 + */ + private Integer isReturnPwd; + /** + * 是否开启会员充值密码 1-启用 0-禁用 + */ + private Integer isMemberInPwd; + /** + * 是否开启会员退款密码 1-启用 0-禁用 + */ + private Integer isMemberReturnPwd; + /** + * 是否免除桌位费 1-是 0-否 + */ + private Integer isTableFee; + /** + * 是否启用会员价 1-是 0-否 + */ + private Integer isMemberPrice; + /** + * 是否允许会员余额支付 1-是 0-否 + */ + private Integer isAccountPay; + /** + * 分店数据同步方式 auto-自动同步 manual-手动同步 + */ + private String branchDataSyncMethod; +} \ No newline at end of file diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/enums/BranchDataSyncMethodEnum.java b/cash-common/cash-common-service/src/main/java/com/czg/account/enums/BranchDataSyncMethodEnum.java new file mode 100644 index 000000000..4446f5ed9 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/enums/BranchDataSyncMethodEnum.java @@ -0,0 +1,43 @@ +package com.czg.account.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Arrays; +import java.util.List; + +/** + * 分店数据同步方式枚举 + * + * @author tankaikai + * @since 2025-04-03 16:53 + */ +@Getter +@RequiredArgsConstructor +public enum BranchDataSyncMethodEnum { + /** + * 实时自动同步 + */ + AUTO("auto", "实时自动同步"), + /** + * 手动同步 + */ + MANUAL("manual", "手动同步"); + + private final String value; + private final String text; + + + public static List getValues() { + return Arrays.stream(values()).map(BranchDataSyncMethodEnum::getValue).toList(); + } + + public static String getText(String value) { + BranchDataSyncMethodEnum item = Arrays.stream(values()).filter(obj -> value.equals(obj.getValue())).findFirst().orElse(null); + if (item != null) { + return item.getText(); + } + return null; + } + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/enums/ShopTypeEnum.java b/cash-common/cash-common-service/src/main/java/com/czg/account/enums/ShopTypeEnum.java new file mode 100644 index 000000000..a000deed9 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/enums/ShopTypeEnum.java @@ -0,0 +1,48 @@ +package com.czg.account.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Arrays; +import java.util.List; + +/** + * 店铺经营模式枚举 + * + * @author tankaikai + * @since 2025-04-03 16:53 + */ +@Getter +@RequiredArgsConstructor +public enum ShopTypeEnum { + /** + * 单店 + */ + ONLY("only", "单店"), + /** + * 连锁店 + */ + CHAIN("chain", "连锁店"), + /** + * 加盟店 + */ + JOIN("join", "加盟店"), + ; + + private final String value; + private final String text; + + + public static List getValues() { + return Arrays.stream(values()).map(ShopTypeEnum::getValue).toList(); + } + + public static String getText(String value) { + ShopTypeEnum item = Arrays.stream(values()).filter(obj -> value.equals(obj.getValue())).findFirst().orElse(null); + if (item != null) { + return item.getText(); + } + return null; + } + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopConfigService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopConfigService.java new file mode 100644 index 000000000..cea58cb4e --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopConfigService.java @@ -0,0 +1,14 @@ +package com.czg.account.service; + +import com.czg.account.entity.ShopConfig; +import com.mybatisflex.core.service.IService; + +/** + * 店铺配置扩展 + * + * @author Tankaikai tankaikai@aliyun.com + * @since 1.0 2025-04-03 + */ +public interface ShopConfigService extends IService { + +} \ No newline at end of file diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopInfoService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopInfoService.java index ad305df8d..a3da06d2b 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopInfoService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopInfoService.java @@ -10,7 +10,7 @@ import com.mybatisflex.core.service.IService; * @author Administrator */ public interface ShopInfoService extends IService { - Page get(PageDTO pageDTO, String shopName, Integer status); + Page get(PageDTO pageDTO, String shopName, Integer status, Integer isHeadShop); Boolean add(ShopInfoAddDTO shopInfoAddDTO); diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java new file mode 100644 index 000000000..e428e6dd5 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java @@ -0,0 +1,16 @@ +package com.czg.service.account.mapper; + +import com.czg.account.entity.ShopConfig; +import com.mybatisflex.core.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** +* 店铺配置扩展 +* +* @author Tankaikai tankaikai@aliyun.com +* @since 1.0 2025-04-03 +*/ +@Mapper +public interface ShopConfigMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopConfigServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopConfigServiceImpl.java new file mode 100644 index 000000000..d9bd07095 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopConfigServiceImpl.java @@ -0,0 +1,39 @@ +package com.czg.service.account.service.impl; + +import com.czg.account.dto.ShopConfigDTO; +import com.czg.account.entity.ShopConfig; +import com.czg.account.service.ShopConfigService; +import com.czg.sa.StpKit; +import com.czg.service.account.mapper.ShopConfigMapper; +import com.czg.service.account.mapper.ShopInfoMapper; +import com.czg.utils.PageUtil; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +/** + * 店铺配置扩展 + * + * @author Tankaikai tankaikai@aliyun.com + * @since 1.0 2025-04-03 + */ +@Service +public class ShopConfigServiceImpl extends ServiceImpl implements ShopConfigService { + + @Resource + private ShopInfoMapper shopInfoMapper; + + private QueryWrapper buildQueryWrapper(ShopConfigDTO param) { + QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper(); + /*if (StrUtil.isNotEmpty(param.getName())) { + queryWrapper.like(ShopConfig::getName, param.getName()); + }*/ + Long shopId = StpKit.USER.getLoginIdAsLong(); + queryWrapper.eq(ShopConfig::getMainId, shopId); + queryWrapper.orderBy(ShopConfig::getId, false); + return queryWrapper; + } + + +} \ No newline at end of file diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index 8061c5aeb..2696ad3dd 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -7,9 +7,12 @@ import cn.hutool.crypto.SecureUtil; import com.czg.account.dto.PageDTO; import com.czg.account.dto.shopinfo.*; import com.czg.account.entity.*; +import com.czg.account.enums.BranchDataSyncMethodEnum; +import com.czg.account.enums.ShopTypeEnum; import com.czg.account.service.*; import com.czg.config.RedisCst; import com.czg.enums.StatusEnum; +import com.czg.enums.YesNoEnum; import com.czg.exception.ApiNotPrintException; import com.czg.exception.CzgException; import com.czg.resp.CzgResult; @@ -27,6 +30,7 @@ import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboService; import org.springframework.cache.annotation.CacheConfig; @@ -44,6 +48,7 @@ import java.util.stream.Collectors; /** * @author Administrator */ +@Slf4j @DubboService @CacheConfig(cacheNames = "shopInfo") public class ShopInfoServiceImpl extends ServiceImpl implements ShopInfoService { @@ -65,6 +70,8 @@ public class ShopInfoServiceImpl extends ServiceImpl i private FreeDineConfigService freeDineConfigService; @Resource private PointsBasicSettingService pointsBasicSettingService; + @Resource + private ShopConfigService shopConfigService; @DubboReference private SysParamsService sysParamsService; @@ -72,7 +79,10 @@ public class ShopInfoServiceImpl extends ServiceImpl i @Override @Cacheable(key = "#id") public ShopInfo getById(Serializable id) { - return super.getById(id); + ShopInfo shopInfo = super.getById(id); + ShopConfig shopConfig = shopConfigService.getById(shopInfo.getId()); + BeanUtil.copyProperties(shopConfig, shopInfo); + return shopInfo; } private ShopInfo getShopInfo(Long shopId) { @@ -94,7 +104,7 @@ public class ShopInfoServiceImpl extends ServiceImpl i } @Override - public Page get(PageDTO pageDTO, String shopName, Integer status) { + public Page get(PageDTO pageDTO, String shopName, Integer status, Integer isHeadShop) { QueryWrapper queryWrapper = new QueryWrapper(); if (StrUtil.isNotBlank(shopName)) { queryWrapper.like(ShopInfo::getShopName, shopName); @@ -103,7 +113,12 @@ public class ShopInfoServiceImpl extends ServiceImpl i queryWrapper.eq(ShopInfo::getStatus, status); } queryWrapper.orderBy(ShopInfo::getCreateTime, false); - return page(new Page<>(pageDTO.page(), pageDTO.size()), queryWrapper); + Page page = page(new Page<>(pageDTO.page(), pageDTO.size()), queryWrapper); + page.getRecords().forEach(shopInfo -> { + ShopConfig shopConfig = shopConfigService.getById(shopInfo.getId()); + BeanUtil.copyProperties(shopConfig, shopInfo); + }); + return page; } private void activateShop(ShopInfo shopInfo, String activateCode) { @@ -116,7 +131,7 @@ public class ShopInfoServiceImpl extends ServiceImpl i // 续期 if (shopInfo.getExpireTime() != null && shopInfo.getExpireTime().isAfter(LocalDateTime.now())) { shopInfo.setExpireTime(DateUtil.offsetMonth(DateUtil.date(shopInfo.getExpireTime()), merchantRegister.getPeriodMonth()).toLocalDateTime()); - }else { + } else { shopInfo.setExpireTime(DateUtil.offsetMonth(DateUtil.date(), merchantRegister.getPeriodMonth()).toLocalDateTime()); } merchantRegister.setStatus(1); @@ -127,6 +142,21 @@ public class ShopInfoServiceImpl extends ServiceImpl i @Override @Transactional(rollbackFor = Exception.class) public Boolean add(ShopInfoAddDTO shopInfoAddDTO) { + // 如果店铺类型是单店,是否主店要设为否 + if (ShopTypeEnum.ONLY.getValue().equals(shopInfoAddDTO.getShopType())) { + shopInfoAddDTO.setIsHeadShop(YesNoEnum.NO.value()); + shopInfoAddDTO.setMainId(null); + } else { + if (shopInfoAddDTO.getIsHeadShop() == null) { + throw new CzgException("加盟店/连锁店请选择是否主店"); + } + if (shopInfoAddDTO.getIsHeadShop() == YesNoEnum.NO.value() && shopInfoAddDTO.getMainId() == null) { + throw new CzgException("请选择一个店铺做为主店"); + } + if (shopInfoAddDTO.getIsHeadShop() == YesNoEnum.YES.value()) { + shopInfoAddDTO.setMainId(null); + } + } shopInfoAddDTO.setPhone(shopInfoAddDTO.getPhone().trim()); if (StrUtil.isBlank(shopInfoAddDTO.getPhone())) { throw new ApiNotPrintException("请输入手机号"); @@ -156,7 +186,50 @@ public class ShopInfoServiceImpl extends ServiceImpl i // 初始化积分霸王餐设置 freeDineConfigService.getConfig(shopInfo.getId()); pointsBasicSettingService.initInfo(shopInfo.getId()); - return updateById(shopInfo); + updateById(shopInfo); + syncSaveConfig(shopInfo, shopInfoAddDTO); + return true; + } + + /** + * 同步创建配置信息 + * + * @param shopInfo 店铺信息实体 + * @param dto 新增店铺信息DTO + */ + private void syncSaveConfig(ShopInfo shopInfo, ShopInfoAddDTO dto) { + ShopConfig shopConfig = new ShopConfig(); + shopConfig.setId(shopInfo.getId()); + shopConfig.setMainId(shopInfo.getMainId()); + shopConfig.setIsEnableProdSync(0); + shopConfig.setIsEnableVipSync(0); + shopConfig.setIsEnableConsSync(0); + shopConfig.setIsAllowAccountLogin(1); + shopConfig.setRemark(null); + shopConfig.setIsCustomAmount(0); + shopConfig.setIsReturnPwd(0); + shopConfig.setIsMemberInPwd(0); + shopConfig.setIsMemberReturnPwd(0); + shopConfig.setIsTableFee(1); + shopConfig.setIsMemberPrice(0); + shopConfig.setIsAccountPay(0); + shopConfig.setBranchDataSyncMethod(null); + if (dto.getIsHeadShop() == YesNoEnum.YES.value()) { + shopConfig.setBranchDataSyncMethod(BranchDataSyncMethodEnum.AUTO.getValue()); + } + shopConfigService.save(shopConfig); + } + + /** + * 同步修改配置信息 + * + * @param shopInfo 店铺信息实体 + * @param dto 新增店铺信息DTO + */ + private void syncUpdateConfig(ShopInfo shopInfo, ShopInfoEditDTO dto) { + ShopConfig shopConfig = shopConfigService.getById(shopInfo.getId()); + BeanUtil.copyProperties(dto, shopConfig); + shopConfigService.updateById(shopConfig); } @Override @@ -165,14 +238,25 @@ public class ShopInfoServiceImpl extends ServiceImpl i ShopInfo shopInfo; if (!StpKit.USER.isAdmin()) { shopInfo = queryChain().eq(ShopInfo::getId, StpKit.USER.getLoginIdAsLong()).one(); - }else { + } else { shopInfo = getById(StpKit.USER.getLoginIdAsLong()); } if (shopInfo == null) { throw new CzgException("店铺不存在"); } - BeanUtil.copyProperties(shopInfoEditDTO, shopInfo); - + String shopType = shopInfo.getShopType(); + Long mainId = shopInfo.getMainId(); + Integer isHeadShop = shopInfo.getIsHeadShop(); + // 禁止加盟店/连锁店修改为单店 + if (!shopType.equals(shopInfoEditDTO.getShopType())) { + throw new CzgException("禁止修改店铺类型"); + } + if (!isHeadShop.equals(shopInfoEditDTO.getIsHeadShop())) { + throw new CzgException("禁止修改是否主店"); + } + if (!mainId.equals(shopInfoEditDTO.getMainId())) { + throw new CzgException("禁止从新选择店铺设为主店"); + } if (shopInfoEditDTO.getActivateCode() != null) { activateShop(shopInfo, shopInfoEditDTO.getActivateCode()); } @@ -188,6 +272,7 @@ public class ShopInfoServiceImpl extends ServiceImpl i redisService.del(key); } if (updateById(shopInfo)) { + syncUpdateConfig(shopInfo, shopInfoEditDTO); SysUser sysUser = sysUserService.getById(shopInfo.getId()); boolean flag = false; if (!sysUser.getNickName().equals(shopInfo.getShopName())) { @@ -218,12 +303,16 @@ public class ShopInfoServiceImpl extends ServiceImpl i if (!StpKit.USER.isAdmin() && !Objects.equals(StpKit.USER.getShopId(), shopInfo.getId())) { throw new ApiNotPrintException("店铺信息不存在"); } - + ShopConfig shopConfig = shopConfigService.getById(shopInfo.getId()); + if (shopConfig == null) { + throw new CzgException("店铺配置不存在"); + } ShopDetailDTO shopDetailDTO = BeanUtil.copyProperties(shopInfo, ShopDetailDTO.class); SysUser sysUser = sysUserService.getById(shopInfo.getId()); shopDetailDTO.setAccount(sysUser.getAccount()); CzgResult shopOrderPayBaseUrl = sysParamsService.getParamsByCode("shop_order_pay_base_url"); shopDetailDTO.setPaymentQrcode(shopOrderPayBaseUrl.getData().getParamValue() + "?shopId=" + id); + BeanUtil.copyProperties(shopConfig, shopDetailDTO); return shopDetailDTO; } @@ -238,7 +327,6 @@ public class ShopInfoServiceImpl extends ServiceImpl i throw new ApiNotPrintException("台桌状态不可用"); } ShopInfo shopInfo = getShopInfo(shopTable.getShopId()); - double distance = 0; if (StrUtil.isAllNotBlank(lat, lng, shopInfo.getLat(), shopInfo.getLng())) { // 计算距离,单位:米 diff --git a/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml new file mode 100644 index 000000000..16bdbac8d --- /dev/null +++ b/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/sqls/250403/cash.sql b/sqls/250403/cash.sql index 97f3e01b0..e1b6af638 100644 --- a/sqls/250403/cash.sql +++ b/sqls/250403/cash.sql @@ -1 +1,65 @@ -ALTER TABLE `tb_shop_info` ADD COLUMN `is_head_shop` tinyint NULL COMMENT '是否主店 1-是 0-否'; \ No newline at end of file +ALTER TABLE `tb_shop_info` + ADD COLUMN `is_head_shop` tinyint NULL COMMENT '是否主店 1-是 0-否'; +-- ---------------------------- +-- 更新历史数据,将创建时间在2025年4月3日之前的店铺设置为非主店 +-- ---------------------------- +update tb_shop_info +set is_head_shop = 0 +where create_time < str_to_date('2025-04-03 00:00:00', '%Y-%m-%d %H:%i:%s'); +-- ---------------------------- +-- 创建店铺配置扩展表 +-- ---------------------------- +CREATE TABLE `tb_shop_config` +( + `id` bigint NOT NULL COMMENT '店铺id', + `main_id` bigint NULL DEFAULT NULL COMMENT '主店id', + `is_enable_prod_sync` tinyint NOT NULL DEFAULT 0 COMMENT '是否启用商品同步 1-是 0-否', + `is_enable_vip_sync` tinyint NOT NULL DEFAULT 0 COMMENT '是否启用会员同步 1-是 0-否', + `is_enable_cons_sync` tinyint NOT NULL DEFAULT 0 COMMENT '是否启用耗材同步 1-是 0-否', + `is_allow_account_login` tinyint NOT NULL DEFAULT 1 COMMENT '是否允许账号登录 1-是 0-否', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `is_custom_amount` int NOT NULL DEFAULT 0 COMMENT '是否允许会员自定义金额 1-允许 0-不允许', + `is_return_pwd` int NOT NULL DEFAULT 0 COMMENT '是否开启退款密码 1-启用 0-禁用', + `is_member_in_pwd` int NOT NULL DEFAULT 0 COMMENT '是否开启会员充值密码 1-启用 0-禁用', + `is_member_return_pwd` int NOT NULL DEFAULT 0 COMMENT '是否开启会员退款密码 1-启用 0-禁用', + `is_table_fee` int NOT NULL DEFAULT 1 COMMENT '是否免除桌位费 1-是 0-否', + `is_member_price` int NOT NULL DEFAULT 0 COMMENT '是否启用会员价 1-是 0-否 ', + `is_account_pay` tinyint NOT NULL DEFAULT 0 COMMENT '是否允许会员余额支付 1-是 0-否', + `branch_data_sync_method` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '分店数据同步方式 auto-自动同步 manual-手动同步', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB + CHARACTER SET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci COMMENT = '店铺配置扩展' + ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- 转移历史数据至【店铺配置扩展表】 +-- ---------------------------- +insert into tb_shop_config +select id, + main_id, + 0 as is_enable_prod_sync, + 0 as is_enable_vip_sync, + 0 as is_enable_cons_sync, + 1 as is_allow_account_login, + null as remark, + is_custom_amount, + is_return_pwd, + is_member_in_pwd, + is_member_return_pwd, + is_table_fee, + is_member_price, + is_account_pay, + null as branch_data_sync_method +from tb_shop_info; +-- ---------------------------- +-- 删除店铺主表是否xxx等字段,迁移至店铺配置扩展表 +-- ---------------------------- +ALTER TABLE `tb_shop_info` + DROP COLUMN `is_custom_amount`, + DROP COLUMN `is_return_pwd`, + DROP COLUMN `is_member_in_pwd`, + DROP COLUMN `is_member_return_pwd`, + DROP COLUMN `is_table_fee`, + DROP COLUMN `is_member_price`, + DROP COLUMN `is_account_pay`; \ No newline at end of file From 0ca9a2bddf9362b2a63e78ac68c23e90fe99c0a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 7 Apr 2025 11:48:44 +0800 Subject: [PATCH 013/162] =?UTF-8?q?=E6=89=B9=E9=87=8F=E4=BB=98=E6=AC=BE?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/ConsStockFlowMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml b/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml index a1c812d03..7bdb1544e 100644 --- a/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml +++ b/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml @@ -56,7 +56,7 @@ From 2392bf4be82fed95cc186a1b0d7e64fbe3fe58a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 7 Apr 2025 13:43:08 +0800 Subject: [PATCH 014/162] =?UTF-8?q?=E6=89=B9=E9=87=8F=E4=BB=98=E6=AC=BE?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/product/service/impl/ShopVendorServiceImpl.java | 4 ++++ .../src/main/resources/mapper/ConsStockFlowMapper.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java index 62fe82c3d..1005e1647 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java @@ -149,6 +149,10 @@ public class ShopVendorServiceImpl extends ServiceImpl select * from tb_cons_stock_flow where amount_payable > actual_payment_amount and shop_id=#{shopId} - + #{id} From ed1bd44f6a215346d3698c0c9e486ef20fb4345b Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 7 Apr 2025 15:16:36 +0800 Subject: [PATCH 015/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/ShopBranchController.java | 87 +++++++++ .../controller/admin/ShopInfoController.java | 13 ++ .../com/czg/account/dto/ShopBranchDTO.java | 54 ++++++ .../dto/shopinfo/ShopBranchSelectDTO.java | 27 +++ .../enums/BranchDataSyncMethodEnum.java | 4 + .../account/service/ShopBranchService.java | 53 ++++++ .../czg/account/service/ShopInfoService.java | 3 + .../account/mapper/ShopConfigMapper.java | 18 +- .../impl/AuthorizationServiceImpl.java | 7 +- .../service/impl/ShopBranchServiceImpl.java | 175 ++++++++++++++++++ .../service/impl/ShopInfoServiceImpl.java | 19 ++ .../resources/mapper/ShopConfigMapper.xml | 10 + 12 files changed, 463 insertions(+), 7 deletions(-) create mode 100644 cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopBranchDTO.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopBranchSelectDTO.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopBranchService.java create mode 100644 cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java new file mode 100644 index 000000000..95f1ca7ba --- /dev/null +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java @@ -0,0 +1,87 @@ +package com.czg.controller.admin; + +import com.czg.account.dto.ShopBranchDTO; +import com.czg.account.service.ShopBranchService; +import com.czg.log.annotation.OperationLog; +import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; +import com.mybatisflex.core.paginate.Page; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +/** + * 分店管理 + * + * @author tankaikai + * @since 2025-04-07 14:05 + */ +@RestController +@RequestMapping("/admin/shop/branch") +public class ShopBranchController { + + @Resource + private ShopBranchService shopBranchService; + + /** + * 分店列表 + */ + @GetMapping("page") + @OperationLog("分店管理-分页") + public CzgResult> getBranchPage() { + Long shopId = StpKit.USER.getShopId(0L); + Page data = shopBranchService.findPage(shopId); + return CzgResult.success(data); + } + + + /** + * 设置数据同步方式 + * + * @param dataSyncMethod 数据同步方式 auto-实时自动同步 manual-手动同步 + */ + @PostMapping("/setting/dataSyncMethod") + @OperationLog("分店管理-设置数据同步方式") + public CzgResult settingDataSyncMethod(@RequestParam String dataSyncMethod) { + Long shopId = StpKit.USER.getShopId(0L); + shopBranchService.settingDataSyncMethod(shopId, dataSyncMethod); + CzgResult ret = CzgResult.success(); + ret.setMsg("设置成功,数据正在后台同步中..."); + return ret; + } + + /** + * 同步启用 + * + * @param branchShopId 分店id + */ + @PostMapping("/data/sync/enable") + @OperationLog("分店管理-同步启用") + public CzgResult dataSyncEnable(@RequestParam Long branchShopId) { + shopBranchService.dataSyncEnable(branchShopId); + return CzgResult.success(); + } + + /** + * 账号启用 + * + * @param branchShopId 分店id + */ + @PostMapping("/account/enable") + @OperationLog("分店管理-账号启用") + public CzgResult accountEnable(@RequestParam Long branchShopId) { + shopBranchService.accountEnable(branchShopId); + return CzgResult.success(); + } + + /** + * 账号禁用 + * + * @param branchShopId 分店id + */ + @PostMapping("/account/disable") + @OperationLog("分店管理-账号禁用") + public CzgResult accountDisable(@RequestParam Long branchShopId) { + shopBranchService.accountDisable(branchShopId); + return CzgResult.success(); + } +} diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java index dde3b0786..560ad492d 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java @@ -1,6 +1,7 @@ package com.czg.controller.admin; import com.czg.account.dto.PageDTO; +import com.czg.account.dto.shopinfo.ShopBranchSelectDTO; import com.czg.account.dto.shopinfo.ShopDetailDTO; import com.czg.account.dto.shopinfo.ShopInfoAddDTO; import com.czg.account.dto.shopinfo.ShopInfoEditDTO; @@ -15,6 +16,8 @@ import com.mybatisflex.core.query.QueryWrapper; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 店铺管理 * @@ -85,4 +88,14 @@ public class ShopInfoController { return CzgResult.success(shopInfoService.remove(new QueryWrapper().eq(ShopInfo::getId, id))); } + /** + * 店铺分店列表(下拉展示主店和分店使用,默认第一个是主店,其余是分店) + */ + @GetMapping("branchList") + public CzgResult> findShopBranch() { + Long shopId = StpKit.USER.getShopId(0L); + List data = shopInfoService.findShopBranch(shopId); + return CzgResult.success(data); + } + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopBranchDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopBranchDTO.java new file mode 100644 index 000000000..465cedaea --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopBranchDTO.java @@ -0,0 +1,54 @@ +package com.czg.account.dto; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分店管理DTO + * @author tankaikai + * @since 2025-04-07 14:12 + */ +@Data +public class ShopBranchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 分店id + */ + private Long id; + /** + * 店铺名称 + */ + private String shopName; + /** + * 账号 + */ + private String account; + /** + * 联系电话 + */ + private String phone; + /** + * 是否启用商品同步 1-是 0-否 + */ + private Integer isEnableProdSync; + /** + * 是否启用会员同步 1-是 0-否 + */ + private Integer isEnableVipSync; + /** + * 是否启用耗材同步 1-是 0-否 + */ + private Integer isEnableConsSync; + /** + * 是否允许账号登录 1-是 0-否 + */ + private Integer isAllowAccountLogin; + /** + * 备注 + */ + private String remark; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopBranchSelectDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopBranchSelectDTO.java new file mode 100644 index 000000000..568cd0d54 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopinfo/ShopBranchSelectDTO.java @@ -0,0 +1,27 @@ +package com.czg.account.dto.shopinfo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 下拉店铺列表DTO + * @author tankaikai + * @since 2025-04-07 13:45 + */ +@Data +public class ShopBranchSelectDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 店铺ID + */ + private Long shopId; + /** + * 店铺名称 + */ + private String shopName; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/enums/BranchDataSyncMethodEnum.java b/cash-common/cash-common-service/src/main/java/com/czg/account/enums/BranchDataSyncMethodEnum.java index 4446f5ed9..a3d23ba27 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/enums/BranchDataSyncMethodEnum.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/enums/BranchDataSyncMethodEnum.java @@ -40,4 +40,8 @@ public enum BranchDataSyncMethodEnum { return null; } + public static boolean checkValue(String value) { + return getValues().contains(value); + } + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopBranchService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopBranchService.java new file mode 100644 index 000000000..9c178a2b6 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopBranchService.java @@ -0,0 +1,53 @@ +package com.czg.account.service; + +import com.czg.account.dto.ShopBranchDTO; +import com.mybatisflex.core.paginate.Page; + +/** + * 分店管理Service + * + * @author tankaikai + * @since 2025-04-07 14:09 + */ +public interface ShopBranchService { + /** + * 查询分店列表 + * + * @param shopId 主店id + * @return 分店列表 + */ + Page findPage(Long shopId); + + /** + * 设计数据同步方式 + * + * @param shopId 主店id + * @param dataSyncMethod 数据同步方式 {@link com.czg.account.enums.BranchDataSyncMethodEnum} + */ + void settingDataSyncMethod(Long shopId, String dataSyncMethod); + + /** + * 数据同步启用 + * @param branchShopId 分店id + */ + void dataSyncEnable(Long branchShopId); + + /** + * 账号启用 + * @param branchShopId 分店id + */ + void accountEnable(Long branchShopId); + + /** + * 账号禁用 + * @param branchShopId 分店id + */ + void accountDisable(Long branchShopId); + + /** + * 查询是否允许分店账号登录 + * @param branchShopId 分店id + * @return 是否允许分店账号登录 {@code true} 允许,{@code false} 不允许 + */ + boolean isAllowAccountLogin(Long branchShopId); +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopInfoService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopInfoService.java index a3da06d2b..554fdda5a 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopInfoService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopInfoService.java @@ -6,6 +6,8 @@ import com.czg.account.entity.ShopInfo; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; +import java.util.List; + /** * @author Administrator */ @@ -24,4 +26,5 @@ public interface ShopInfoService extends IService { Page getSubList(String lat, String lng, float distance); + List findShopBranch(Long shopId); } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java index e428e6dd5..267190748 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java @@ -1,16 +1,22 @@ package com.czg.service.account.mapper; +import com.czg.account.dto.ShopBranchDTO; import com.czg.account.entity.ShopConfig; import com.mybatisflex.core.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** -* 店铺配置扩展 -* -* @author Tankaikai tankaikai@aliyun.com -* @since 1.0 2025-04-03 -*/ + * 店铺配置扩展 + * + * @author Tankaikai tankaikai@aliyun.com + * @since 1.0 2025-04-03 + */ @Mapper public interface ShopConfigMapper extends BaseMapper { - + + List findBranchList(@Param("shopId") Long shopId); + } \ No newline at end of file diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java index d56aba815..624b23fbb 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java @@ -49,6 +49,8 @@ public class AuthorizationServiceImpl implements AuthorizationService { @Resource private SysMenuMapper sysMenuMapper; @Resource + private ShopBranchService shopBranchService; + @Resource private HandoverRecordService handoverRecordService; @@ -140,7 +142,10 @@ public class AuthorizationServiceImpl implements AuthorizationService { throw new ApiNotPrintException("店铺已到期,请联系区域经理续费"); } } - + boolean isAllowAccountLogin = shopBranchService.isAllowAccountLogin(shopInfo.getId()); + if (!isAllowAccountLogin) { + throw new ApiNotPrintException("当前分店账号被禁止登录"); + } StpKit.USER.login(user.getId(), user.getAccount(), shopInfo.getId(), shopInfo.getShopName(), isStaff ? MyStpLogic.LoginType.STAFF : MyStpLogic.LoginType.MANAGER, user.getIsAdmin()); // 查询角色 List roleList = sysRoleService.getByUserId(user.getId()); diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java new file mode 100644 index 000000000..b3f804aaa --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java @@ -0,0 +1,175 @@ +package com.czg.service.account.service.impl; + +import cn.hutool.core.util.ObjUtil; +import com.czg.account.dto.ShopBranchDTO; +import com.czg.account.entity.ShopConfig; +import com.czg.account.entity.ShopInfo; +import com.czg.account.enums.BranchDataSyncMethodEnum; +import com.czg.account.enums.ShopTypeEnum; +import com.czg.account.service.ShopBranchService; +import com.czg.enums.YesNoEnum; +import com.czg.exception.CzgException; +import com.czg.sa.StpKit; +import com.czg.service.account.mapper.ShopConfigMapper; +import com.czg.service.account.mapper.ShopInfoMapper; +import com.czg.utils.PageUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryWrapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 分店管理Service实现类 + * + * @author tankaikai + * @since 2025-04-07 14:20 + */ +@Service +public class ShopBranchServiceImpl implements ShopBranchService { + + @Resource + private ShopConfigMapper shopConfigMapper; + + @Resource + private ShopInfoMapper shopInfoMapper; + + @Override + public Page findPage(Long shopId) { + PageHelper.startPage(PageUtil.buildPageHelp()); + List branchList = shopConfigMapper.findBranchList(shopId); + return PageUtil.convert(new PageInfo<>(branchList)); + } + + @Override + public void settingDataSyncMethod(Long shopId, String dataSyncMethod) { + ShopInfo shopInfo = shopInfoMapper.selectOneById(shopId); + if (shopInfo == null) { + throw new CzgException("店铺不存在"); + } + ShopConfig shopConfig = shopConfigMapper.selectOneById(shopInfo.getId()); + if (shopConfig == null) { + throw new CzgException("店铺配置信息不存在"); + } + if (ShopTypeEnum.ONLY.getValue().equals(shopInfo.getShopType())) { + throw new CzgException("单店不支持设置数据同步方式"); + } + if (ObjUtil.defaultIfNull(shopInfo.getIsHeadShop(), 0) == YesNoEnum.NO.value()) { + throw new CzgException("非主店不能设置数据同步方式"); + } + boolean contains = BranchDataSyncMethodEnum.checkValue(dataSyncMethod); + if (!contains) { + throw new CzgException("非法的数据同步方式值"); + } + shopConfig.setBranchDataSyncMethod(dataSyncMethod); + shopConfigMapper.update(shopConfig); + } + + @Override + public void dataSyncEnable(Long branchShopId) { + Long shopId = StpKit.USER.getShopId(0L); + ShopInfo shopInfo = shopInfoMapper.selectOneById(shopId); + if (shopInfo == null) { + throw new CzgException("主店铺不存在"); + } + ShopConfig shopConfig = shopConfigMapper.selectOneById(shopInfo.getId()); + if (shopConfig == null) { + throw new CzgException("主店铺配置信息不存在"); + } + if (ShopTypeEnum.ONLY.getValue().equals(shopInfo.getShopType())) { + throw new CzgException("数据错误:主单店铺类型为单店"); + } + if (ObjUtil.defaultIfNull(shopInfo.getIsHeadShop(), 0) == YesNoEnum.NO.value()) { + throw new CzgException("数据错误:当前店铺不是主店"); + } + ShopInfo branchShop = shopInfoMapper.selectOneByQuery(QueryWrapper.create().eq(ShopInfo::getMainId, shopInfo.getId()).eq(ShopInfo::getId, branchShopId)); + if (branchShop == null) { + throw new CzgException("对应的分店信息不存在"); + } + if (ShopTypeEnum.ONLY.getValue().equals(branchShop.getShopType())) { + throw new CzgException("数据错误:分店店铺类型错误"); + } + ShopConfig branchConfig = shopConfigMapper.selectOneById(branchShop.getId()); + branchConfig.setIsEnableProdSync(YesNoEnum.YES.value()); + branchConfig.setIsEnableConsSync(YesNoEnum.YES.value()); + branchConfig.setIsEnableVipSync(YesNoEnum.YES.value()); + shopConfigMapper.update(branchConfig); + // TODO 异步事务同步商品数据、会员数据、耗材数据 + } + + @Override + public void accountEnable(Long branchShopId) { + Long shopId = StpKit.USER.getShopId(0L); + ShopInfo shopInfo = shopInfoMapper.selectOneById(shopId); + if (shopInfo == null) { + throw new CzgException("主店铺不存在"); + } + ShopConfig shopConfig = shopConfigMapper.selectOneById(shopInfo.getId()); + if (shopConfig == null) { + throw new CzgException("主店铺配置信息不存在"); + } + if (ShopTypeEnum.ONLY.getValue().equals(shopInfo.getShopType())) { + throw new CzgException("数据错误:主单店铺类型为单店"); + } + if (ObjUtil.defaultIfNull(shopInfo.getIsHeadShop(), 0) == YesNoEnum.NO.value()) { + throw new CzgException("数据错误:当前店铺不是主店"); + } + ShopInfo branchShop = shopInfoMapper.selectOneByQuery(QueryWrapper.create().eq(ShopInfo::getMainId, shopInfo.getId()).eq(ShopInfo::getId, branchShopId)); + if (branchShop == null) { + throw new CzgException("对应的分店信息不存在"); + } + if (ShopTypeEnum.ONLY.getValue().equals(branchShop.getShopType())) { + throw new CzgException("数据错误:分店店铺类型错误"); + } + ShopConfig branchConfig = shopConfigMapper.selectOneById(branchShop.getId()); + branchConfig.setIsAllowAccountLogin(YesNoEnum.YES.value()); + shopConfigMapper.update(branchConfig); + } + + @Override + public void accountDisable(Long branchShopId) { + Long shopId = StpKit.USER.getShopId(0L); + ShopInfo shopInfo = shopInfoMapper.selectOneById(shopId); + if (shopInfo == null) { + throw new CzgException("主店铺不存在"); + } + ShopConfig shopConfig = shopConfigMapper.selectOneById(shopInfo.getId()); + if (shopConfig == null) { + throw new CzgException("主店铺配置信息不存在"); + } + if (ShopTypeEnum.ONLY.getValue().equals(shopInfo.getShopType())) { + throw new CzgException("数据错误:主单店铺类型为单店"); + } + if (ObjUtil.defaultIfNull(shopInfo.getIsHeadShop(), 0) == YesNoEnum.NO.value()) { + throw new CzgException("数据错误:当前店铺不是主店"); + } + ShopInfo branchShop = shopInfoMapper.selectOneByQuery(QueryWrapper.create().eq(ShopInfo::getMainId, shopInfo.getId()).eq(ShopInfo::getId, branchShopId)); + if (branchShop == null) { + throw new CzgException("对应的分店信息不存在"); + } + if (ShopTypeEnum.ONLY.getValue().equals(branchShop.getShopType())) { + throw new CzgException("数据错误:分店店铺类型错误"); + } + ShopConfig branchConfig = shopConfigMapper.selectOneById(branchShop.getId()); + branchConfig.setIsAllowAccountLogin(YesNoEnum.NO.value()); + shopConfigMapper.update(branchConfig); + } + + @Override + public boolean isAllowAccountLogin(Long branchShopId) { + ShopConfig shopConfig = shopConfigMapper.selectOneById(branchShopId); + if (shopConfig == null) { + return true; + } + if (shopConfig.getMainId() == null) { + return true; + } + if (shopConfig.getIsAllowAccountLogin() == YesNoEnum.YES.value()) { + return true; + } + return false; + } +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index 2696ad3dd..e48db1988 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -40,6 +40,7 @@ import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -352,4 +353,22 @@ public class ShopInfoServiceImpl extends ServiceImpl i PageHelper.startPage(PageUtil.buildPageHelp()); return PageUtil.convert(new PageInfo<>(mapper.getSubList(lng, lat, distance))); } + + @Override + public List findShopBranch(Long shopId) { + List list = new ArrayList<>(); + ShopInfo shopInfo = mapper.selectOneById(shopId); + ShopBranchSelectDTO head = new ShopBranchSelectDTO(); + head.setShopId(shopInfo.getId()); + head.setShopName(shopInfo.getShopName()); + list.add(head); + List branchList = mapper.selectListByQuery(query().select(ShopInfo::getId, ShopInfo::getShopName).eq(ShopInfo::getMainId, shopId).orderBy(ShopInfo::getId, true)); + for (ShopInfo info : branchList) { + ShopBranchSelectDTO branch = new ShopBranchSelectDTO(); + head.setShopId(info.getId()); + head.setShopName(info.getShopName()); + list.add(branch); + } + return list; + } } diff --git a/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml index 16bdbac8d..8cdf3252a 100644 --- a/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml +++ b/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml @@ -3,4 +3,14 @@ + \ No newline at end of file From 8b8cfa0b3a503dfeed1abea3835e5dfeee570e48 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 7 Apr 2025 15:49:36 +0800 Subject: [PATCH 016/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/account/service/impl/ShopInfoServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index e48db1988..c67a3ddbd 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -146,7 +146,9 @@ public class ShopInfoServiceImpl extends ServiceImpl i // 如果店铺类型是单店,是否主店要设为否 if (ShopTypeEnum.ONLY.getValue().equals(shopInfoAddDTO.getShopType())) { shopInfoAddDTO.setIsHeadShop(YesNoEnum.NO.value()); - shopInfoAddDTO.setMainId(null); + if(shopInfoAddDTO.getMainId() != null) { + throw new CzgException("单店不允许设置主店ID"); + } } else { if (shopInfoAddDTO.getIsHeadShop() == null) { throw new CzgException("加盟店/连锁店请选择是否主店"); From 4c99688c59402fda4d1575813dcaf98d61eb0d2c Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 7 Apr 2025 17:08:51 +0800 Subject: [PATCH 017/162] =?UTF-8?q?=E5=88=B7=E6=96=B0=E5=8F=AF=E5=94=AE?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/czg/controller/user/UProductController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java b/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java index 208c1ecda..171b0c048 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java @@ -43,7 +43,7 @@ public class UProductController { Long shopId = StpKit.USER.getShopId(0L); List list = uProductService.queryHotsProductList(shopId); list.forEach(prod -> { - ProdIsSaleTimeDTO prodSaleTime = prod.getProdIsSaleTimeDTO(); + ProdIsSaleTimeDTO prodSaleTime = prod.getProdIsSaleTimeDTO() == null ? new ProdIsSaleTimeDTO() : prod.getProdIsSaleTimeDTO(); prod.setIsSaleTime(uProductService.calcIsSaleTime(prodSaleTime.getDays(), prodSaleTime.getStartTime(), prodSaleTime.getEndTime())); }); uProductService.refreshProductStock(shopId, list); From 91ec453948eacde871c7e9c17b7d18df5c71f1b7 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 7 Apr 2025 17:13:18 +0800 Subject: [PATCH 018/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/account/entity/ShopInfo.java | 5 +++++ .../account/service/impl/ShopInfoServiceImpl.java | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java index 2ded60769..bb156e531 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopInfo.java @@ -295,5 +295,10 @@ public class ShopInfo implements Serializable { */ @Column(ignore = true) private Integer isAccountPay; + /** + * 主店名称 + */ + @Column(ignore = true) + private String headShopName; } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index c67a3ddbd..d01e1f8d0 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -113,11 +113,14 @@ public class ShopInfoServiceImpl extends ServiceImpl i if (status != null) { queryWrapper.eq(ShopInfo::getStatus, status); } + List shopAllList = getMapper().selectListByQuery(query().select(ShopInfo::getId, ShopInfo::getShopName)); + Map shopKv = shopAllList.stream().collect(Collectors.toMap(ShopInfo::getId, ShopInfo::getShopName)); queryWrapper.orderBy(ShopInfo::getCreateTime, false); Page page = page(new Page<>(pageDTO.page(), pageDTO.size()), queryWrapper); page.getRecords().forEach(shopInfo -> { ShopConfig shopConfig = shopConfigService.getById(shopInfo.getId()); BeanUtil.copyProperties(shopConfig, shopInfo); + shopInfo.setHeadShopName(shopKv.get(shopInfo.getMainId())); }); return page; } @@ -146,7 +149,7 @@ public class ShopInfoServiceImpl extends ServiceImpl i // 如果店铺类型是单店,是否主店要设为否 if (ShopTypeEnum.ONLY.getValue().equals(shopInfoAddDTO.getShopType())) { shopInfoAddDTO.setIsHeadShop(YesNoEnum.NO.value()); - if(shopInfoAddDTO.getMainId() != null) { + if (shopInfoAddDTO.getMainId() != null) { throw new CzgException("单店不允许设置主店ID"); } } else { @@ -367,8 +370,8 @@ public class ShopInfoServiceImpl extends ServiceImpl i List branchList = mapper.selectListByQuery(query().select(ShopInfo::getId, ShopInfo::getShopName).eq(ShopInfo::getMainId, shopId).orderBy(ShopInfo::getId, true)); for (ShopInfo info : branchList) { ShopBranchSelectDTO branch = new ShopBranchSelectDTO(); - head.setShopId(info.getId()); - head.setShopName(info.getShopName()); + branch.setShopId(info.getId()); + branch.setShopName(info.getShopName()); list.add(branch); } return list; From 7c2eea7303d802515fc03677b05a81f85dad341c Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 7 Apr 2025 17:28:16 +0800 Subject: [PATCH 019/162] =?UTF-8?q?=E5=88=B7=E6=96=B0=E5=8F=AF=E5=94=AE?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/product/dto/GroupIsSaleTimeDTO.java | 27 ------------------- .../czg/product/dto/ProdIsSaleTimeDTO.java | 26 ------------------ .../com/czg/product/vo/ShopProductVo.java | 2 -- .../service/impl/UProductServiceImpl.java | 2 -- 4 files changed, 57 deletions(-) delete mode 100644 cash-common/cash-common-service/src/main/java/com/czg/product/dto/GroupIsSaleTimeDTO.java delete mode 100644 cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdIsSaleTimeDTO.java diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/GroupIsSaleTimeDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/GroupIsSaleTimeDTO.java deleted file mode 100644 index a28afe2c4..000000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/GroupIsSaleTimeDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.czg.product.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serial; -import java.io.Serializable; -import java.time.LocalTime; - -/** - * 分组可售时间管控 - * @author tankaikai - * @since 2025-04-07 16:04 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class GroupIsSaleTimeDTO implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - private Integer useTime; - private LocalTime startTime; - private LocalTime endTime; -} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdIsSaleTimeDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdIsSaleTimeDTO.java deleted file mode 100644 index 14fcfcf74..000000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdIsSaleTimeDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.czg.product.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serial; -import java.io.Serializable; -import java.time.LocalTime; - -/** - * 商品可售时间管控 - * @author tankaikai - * @since 2025-04-07 16:03 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class ProdIsSaleTimeDTO implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - private String days; - private LocalTime startTime; - private LocalTime endTime; -} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java index d5db7fdd9..ef56c0fd1 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java @@ -1,8 +1,6 @@ package com.czg.product.vo; import com.alibaba.fastjson2.annotation.JSONField; -import com.czg.product.dto.GroupIsSaleTimeDTO; -import com.czg.product.dto.ProdIsSaleTimeDTO; import com.czg.product.dto.ProdSkuDTO; import lombok.Data; diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java index f51f3c08c..ede8c9b97 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java @@ -10,9 +10,7 @@ import com.czg.enums.DeleteEnum; import com.czg.enums.StatusEnum; import com.czg.enums.YesNoEnum; import com.czg.exception.CzgException; -import com.czg.product.dto.GroupIsSaleTimeDTO; import com.czg.product.dto.ProdGroupRelationDTO; -import com.czg.product.dto.ProdIsSaleTimeDTO; import com.czg.product.dto.ProdSkuDTO; import com.czg.product.entity.ProdGroup; import com.czg.product.entity.ProdGroupRelation; From 1eafd54536b2e636fd08d8b98abcb3fbc84d57ac Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 7 Apr 2025 17:44:31 +0800 Subject: [PATCH 020/162] =?UTF-8?q?=E5=8F=AF=E5=94=AE=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E7=AE=A1=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/product/vo/ShopGroupProductVo.java | 4 ---- .../src/main/java/com/czg/product/vo/ShopProductVo.java | 4 ---- 2 files changed, 8 deletions(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopGroupProductVo.java b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopGroupProductVo.java index e1cd3b315..dd405c366 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopGroupProductVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopGroupProductVo.java @@ -1,6 +1,5 @@ package com.czg.product.vo; -import com.alibaba.fastjson2.annotation.JSONField; import lombok.Data; import java.io.Serial; @@ -31,17 +30,14 @@ public class ShopGroupProductVo implements Serializable { /** * 开启时间管控 0:否;1:是 */ - @JSONField(serialize = false) private Integer useTime; /** * 售卖开始时间 */ - @JSONField(serialize = false) private LocalTime saleStartTime; /** * 售卖结束时间 */ - @JSONField(serialize = false) private LocalTime saleEndTime; /** * 商品列表 diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java index ef56c0fd1..2a22bd09e 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java @@ -1,6 +1,5 @@ package com.czg.product.vo; -import com.alibaba.fastjson2.annotation.JSONField; import com.czg.product.dto.ProdSkuDTO; import lombok.Data; @@ -93,17 +92,14 @@ public class ShopProductVo implements Serializable { /** * 商品每周销售日 如:Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday */ - @JSONField(serialize = false) private String days; /** * 可售卖起始时间 */ - @JSONField(serialize = false) private LocalTime startTime; /** * 可售卖截止时间 */ - @JSONField(serialize = false) private LocalTime endTime; /** * 排序 From bc171691fffa74e5c2bbae1808f48fcbd2197292 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Mon, 7 Apr 2025 18:08:11 +0800 Subject: [PATCH 021/162] =?UTF-8?q?=E6=95=B0=E6=8D=AE=20=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/product/entity/ConsGroup.java | 4 + .../java/com/czg/product/entity/ConsInfo.java | 4 + .../czg/product/entity/ProdConsRelation.java | 8 +- .../com/czg/product/entity/ProdGroup.java | 4 + .../java/com/czg/product/entity/ProdSku.java | 4 + .../java/com/czg/product/entity/Product.java | 4 + .../czg/product/entity/ShopProdCategory.java | 4 + .../com/czg/product/entity/ShopProdSpec.java | 4 + .../com/czg/product/entity/ShopProdUnit.java | 4 + .../czg/product/service/ShopSyncService.java | 18 + .../com/czg/product/vo/ProductGroupVo.java | 4 +- .../impl/ProdConsRelationServiceImpl.java | 1 - .../service/impl/ShopSyncServiceImpl.java | 378 ++++++++++++++++++ .../service/impl/SqlScriptServiceImpl.java | 2 +- sqls/250327/cash.sql | 1 - sqls/250403/tb_cons_group.sql | 1 + sqls/250403/tb_cons_info.sql | 1 + sqls/250403/tb_prod_cons_relation.sql | 4 + sqls/250403/tb_prod_group.sql | 1 + sqls/250403/tb_prod_sku.sql | 1 + sqls/250403/tb_product.sql | 1 + sqls/250403/{cash.sql => tb_shop_info.sql} | 0 sqls/250403/tb_shop_prod_category.sql | 1 + sqls/250403/tb_shop_prod_spec.sql | 1 + sqls/250403/tb_shop_prod_unit.sql | 1 + 25 files changed, 446 insertions(+), 10 deletions(-) create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java create mode 100644 cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java delete mode 100644 sqls/250327/cash.sql create mode 100644 sqls/250403/tb_cons_group.sql create mode 100644 sqls/250403/tb_cons_info.sql create mode 100644 sqls/250403/tb_prod_cons_relation.sql create mode 100644 sqls/250403/tb_prod_group.sql create mode 100644 sqls/250403/tb_prod_sku.sql create mode 100644 sqls/250403/tb_product.sql rename sqls/250403/{cash.sql => tb_shop_info.sql} (100%) create mode 100644 sqls/250403/tb_shop_prod_category.sql create mode 100644 sqls/250403/tb_shop_prod_spec.sql create mode 100644 sqls/250403/tb_shop_prod_unit.sql diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsGroup.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsGroup.java index b9462deed..12c4081c0 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsGroup.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsGroup.java @@ -28,6 +28,10 @@ public class ConsGroup implements Serializable { */ @Id(keyType = KeyType.Auto) private Long id; + /** + * 同步id + */ + private Long syncId; /** * 店铺id */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsInfo.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsInfo.java index 02d68632a..8fdb6eb30 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsInfo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsInfo.java @@ -29,6 +29,10 @@ public class ConsInfo implements Serializable { */ @Id(keyType = KeyType.Auto) private Long id; + /** + * 同步id + */ + private Long syncId; /** * 耗材分组id */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdConsRelation.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdConsRelation.java index c6e8a7bdd..dc029cf8d 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdConsRelation.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdConsRelation.java @@ -24,22 +24,20 @@ public class ProdConsRelation implements Serializable { @Serial private static final long serialVersionUID = 1L; - /** - * id - */ - @Id(keyType = KeyType.Auto) - private Long id; /** * 店铺id */ + @Id(keyType = KeyType.None) private Long shopId; /** * 商品id */ + @Id(keyType = KeyType.None) private Long productId; /** * 耗材id */ + @Id(keyType = KeyType.None) private Long consInfoId; /** * 单位消耗值 diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdGroup.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdGroup.java index 6618ba841..a0ceb75c2 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdGroup.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdGroup.java @@ -29,6 +29,10 @@ public class ProdGroup implements Serializable { */ @Id(keyType = KeyType.Auto) private Long id; + /** + * 同步id + */ + private Long syncId; /** * 分组名称 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdSku.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdSku.java index e5be710e1..236e59984 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdSku.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ProdSku.java @@ -29,6 +29,10 @@ public class ProdSku implements Serializable { */ @Id(keyType = KeyType.Auto) private Long id; + /** + * 同步id + */ + private Long syncId; /** * 店铺id */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/Product.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/Product.java index 95f3a7390..91fdd421e 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/Product.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/Product.java @@ -30,6 +30,10 @@ public class Product implements Serializable { */ @Id(keyType = KeyType.Auto) private Long id; + /** + * 同步id + */ + private Long syncId; /** * 商品分类 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdCategory.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdCategory.java index ecd25265f..b0d2be6c1 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdCategory.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdCategory.java @@ -28,6 +28,10 @@ public class ShopProdCategory implements Serializable { */ @Id(keyType = KeyType.Auto) private Long id; + /** + * 同步id + */ + private Long syncId; /** * 分类名称 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdSpec.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdSpec.java index 353ddeda7..61b796e7e 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdSpec.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdSpec.java @@ -28,6 +28,10 @@ public class ShopProdSpec implements Serializable { */ @Id(keyType = KeyType.Auto) private Long id; + /** + * 同步id + */ + private Long syncId; /** * 规格名称 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdUnit.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdUnit.java index 0dec8e2f9..3d917afe7 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdUnit.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopProdUnit.java @@ -28,6 +28,10 @@ public class ShopProdUnit implements Serializable { */ @Id(keyType = KeyType.Auto) private Long id; + /** + * 同步id + */ + private Long syncId; /** * 单位名称 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java new file mode 100644 index 000000000..0cf8af1e2 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java @@ -0,0 +1,18 @@ +package com.czg.product.service; + +import java.util.Map; + +/** + * @author ww + * @description + */ +public interface ShopSyncService { + + /** + * 同步数据 将源店铺信息 同步到目标店铺(包括分组 分类 单位 规格 商品 SKU 耗材) + * @param sourceShopId 源店铺ID + * @param targetShopId 目标店铺ID + */ + void sync(Long sourceShopId, Long targetShopId); + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductGroupVo.java b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductGroupVo.java index 2b98ab91e..9fd10e116 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductGroupVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductGroupVo.java @@ -40,7 +40,7 @@ public class ProductGroupVo implements Serializable { /** * 商品ID */ - private Integer proId; + private Long proId; /** * 商品名称 */ @@ -48,7 +48,7 @@ public class ProductGroupVo implements Serializable { /** * skuId */ - private Integer skuId; + private Long skuId; /** * sku名称 */ diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdConsRelationServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdConsRelationServiceImpl.java index d47681264..06c72cc9e 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdConsRelationServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdConsRelationServiceImpl.java @@ -38,7 +38,6 @@ public class ProdConsRelationServiceImpl extends ServiceImpl unitMap; + Map specMap; + Map categoryMap; + Map proMap = new HashMap<>(); + Map skuMap = new HashMap<>(); + checkShopInfo(sourceShopId, targetShopId); + //商品 + try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) { + CompletableFuture> futureUnit = CompletableFuture.supplyAsync(() -> syncUnit(sourceShopId, targetShopId), executor); + CompletableFuture> futureSpec = CompletableFuture.supplyAsync(() -> syncSpec(sourceShopId, targetShopId), executor); + CompletableFuture> futureCategory = CompletableFuture.supplyAsync(() -> syncCategory(sourceShopId, targetShopId), executor); + + CompletableFuture allFutures = CompletableFuture.allOf(futureUnit, futureSpec, futureCategory); + allFutures.join(); + + unitMap = futureUnit.join(); + specMap = futureSpec.join(); + categoryMap = futureCategory.join(); + } catch (Exception e) { + log.error("同步异常", e); + throw new CzgException("同步失败"); + } + proMap = syncProduct(sourceShopId, targetShopId, unitMap, specMap, categoryMap); + skuMap = syncSku(sourceShopId, targetShopId, proMap); + syncGroup(sourceShopId, targetShopId, proMap); + syncProductPackage(targetShopId, proMap, skuMap); + + + //耗材 + Map conGroupMap = syncConsGroup(sourceShopId, targetShopId); + Map consInfoMap = syncConsInfo(sourceShopId, targetShopId, conGroupMap); + syncConsPro(sourceShopId, targetShopId, consInfoMap, proMap); + } + + public Map syncUnit(Long sourceShopId, Long pointShopId) { + Map unitMap = new HashMap<>(); + List pointShopUnits = unitService.queryChain().select(ShopProdUnit::getSyncId) + .eq(ShopProdUnit::getShopId, pointShopId) + .isNotNull(ShopProdUnit::getSyncId) + .listAs(Long.class); + List list = unitService.queryChain().eq(ShopProdUnit::getShopId, sourceShopId).list(); + list.forEach(tbShopUnit -> { + if (CollUtil.isEmpty(pointShopUnits) || !pointShopUnits.contains(tbShopUnit.getId())) { + ShopProdUnit unitNew = BeanUtil.copyProperties(tbShopUnit, ShopProdUnit.class); + unitNew.setId(null); + unitNew.setSyncId(tbShopUnit.getId()); + unitNew.setShopId(pointShopId); + unitService.save(unitNew); + unitMap.put(tbShopUnit.getId(), unitNew.getId()); + } + }); + log.info("单位同步,源{}个,已有{}个,同步{}个", list.size(), pointShopUnits.size(), unitMap.size()); + return unitMap; + } + + + //规格 + public Map syncSpec(Long sourceShopId, Long pointShopId) { + Map specMap = new HashMap<>(); + List pointShopSpecs = specService.queryChain().select(ShopProdSpec::getSyncId) + .eq(ShopProdSpec::getShopId, pointShopId) + .isNotNull(ShopProdSpec::getSyncId) + .listAs(Long.class); + List list = specService.queryChain().eq(ShopProdSpec::getShopId, sourceShopId.toString()).list(); + list.forEach(spec -> { + if (CollUtil.isEmpty(pointShopSpecs) || !pointShopSpecs.contains(spec.getId())) { + ShopProdSpec newSpec = BeanUtil.copyProperties(spec, ShopProdSpec.class); + newSpec.setId(null); + newSpec.setSyncId(spec.getId()); + newSpec.setShopId(pointShopId); + specService.save(newSpec); + specMap.put(spec.getId(), newSpec.getId()); + } + }); + log.info("规格同步,源{}个,已有{}个,同步{}个", list.size(), pointShopSpecs.size(), specMap.size()); + return specMap; + } + + // 分类 + public Map syncCategory(Long sourceShopId, Long pointShopId) { + Map categoryMap = new HashMap<>(); + List pointShopCateGory = categoryService.queryChain().select(ShopProdCategory::getSyncId) + .eq(ShopProdCategory::getShopId, pointShopId) + .isNotNull(ShopProdCategory::getSyncId) + .listAs(Long.class); + List tbShopCategories = categoryService.queryChain() + .eq(ShopProdCategory::getShopId, sourceShopId) + .eq(ShopProdCategory::getPid, 0) + .list(); + List treeIds = new ArrayList<>(); + for (ShopProdCategory shopProdCategory : tbShopCategories) { + treeIds.add(shopProdCategory.getId()); + if (CollUtil.isEmpty(pointShopCateGory) || !pointShopCateGory.contains(shopProdCategory.getId())) { + ShopProdCategory tbShopCategoryNew = BeanUtil.copyProperties(shopProdCategory, ShopProdCategory.class); + tbShopCategoryNew.setId(null); + tbShopCategoryNew.setShopId(pointShopId); + tbShopCategoryNew.setSyncId(shopProdCategory.getId()); + categoryService.save(tbShopCategoryNew); + categoryMap.put(shopProdCategory.getId(), tbShopCategoryNew.getId()); + } + } + int childrenSize = 0; + int syncSize = categoryMap.size(); + if (CollectionUtil.isNotEmpty(treeIds)) { + List children = categoryService.queryChain() + .eq(ShopProdCategory::getShopId, sourceShopId) + .in(ShopProdCategory::getPid, treeIds) + .list(); + childrenSize = children.size(); + for (ShopProdCategory child : children) { + if (CollUtil.isEmpty(pointShopCateGory) || !pointShopCateGory.contains(child.getId())) { + ShopProdCategory tbShopCategoryNew = BeanUtil.copyProperties(child, ShopProdCategory.class); + tbShopCategoryNew.setId(null); + tbShopCategoryNew.setShopId(pointShopId); + tbShopCategoryNew.setSyncId(child.getId()); + tbShopCategoryNew.setPid(categoryMap.get(child.getPid())); + categoryService.save(tbShopCategoryNew); + categoryMap.put(child.getId(), tbShopCategoryNew.getId()); + } + } + } + log.info("分类同步,源 父类分类{}个,同步{}个", tbShopCategories.size(), syncSize); + log.info("分类同步,源 子类分类{}个,同步{}个", childrenSize, categoryMap.size() - syncSize); + return categoryMap; + } + + public Map syncProduct(Long sourceShopId, Long pointShopId, Map unitMap, + Map specMap, Map cateGoryMap) { + List pointProducts = productService.queryChain() + .eq(Product::getShopId, pointShopId) + .isNotNull(Product::getSyncId) + .listAs(Long.class); + Map proMap = new HashMap<>(); + List products = productService.queryChain().eq(Product::getShopId, sourceShopId).list(); + if (CollectionUtil.isNotEmpty(products)) { + for (Product tbProduct : products) { + if (CollUtil.isEmpty(pointProducts) || !pointProducts.contains(tbProduct.getId())) { + Product tbProductNew = BeanUtil.copyProperties(tbProduct, Product.class); + tbProductNew.setId(null); + tbProductNew.setSyncId(tbProduct.getId()); + tbProductNew.setShopId(pointShopId); + tbProductNew.setCategoryId(tbProduct.getCategoryId() != null ? cateGoryMap.get(tbProduct.getSpecId()) : null); + tbProductNew.setSpecId(tbProduct.getSpecId() != null ? specMap.get(tbProduct.getSpecId()) : null); + tbProductNew.setUnitId(tbProduct.getUnitId() != null ? unitMap.get(tbProduct.getUnitId()) : null); + tbProductNew.setStockNumber(0); + if (CollUtil.isNotEmpty(pointProducts)) { + tbProductNew.setIsSale(0); + } + productService.save(tbProductNew); + proMap.put(tbProduct.getId(), tbProductNew.getId()); + } + } + } + log.info("商品同步,源{}个,已有{}个,同步{}个", products.size(), pointProducts.size(), proMap.size()); + return proMap; + } + + public Map syncGroup(Long sourceShopId, Long pointShopId, Map pros) { + Map groupMap = new HashMap<>(); + List pointGroup = groupService.queryChain().select(ProdGroup::getSyncId).eq(ProdGroup::getShopId, pointShopId) + .isNotNull(ProdGroup::getSyncId).listAs(Long.class); + List list = groupService.queryChain().eq(ProdGroup::getShopId, sourceShopId).list(); + for (ProdGroup prodGroup : list) { + if (CollUtil.isEmpty(pointGroup) || !pointGroup.contains(prodGroup.getId())) { + ProdGroup tbProductGroupNew = BeanUtil.copyProperties(prodGroup, ProdGroup.class); + tbProductGroupNew.setId(null); + tbProductGroupNew.setSyncId(prodGroup.getId()); + tbProductGroupNew.setShopId(pointShopId); + groupService.save(tbProductGroupNew); + groupMap.put(prodGroup.getId(), tbProductGroupNew.getId()); + } + } + List groupRelations = prodGroupRelationService.queryChain().in(ProdGroupRelation::getProdGroupId, groupMap.keySet()).list(); + for (ProdGroupRelation prodGroupRelation : groupRelations) { + prodGroupRelation.setProdGroupId(groupMap.get(prodGroupRelation.getProdGroupId())); + prodGroupRelation.setProductId(pros.get(prodGroupRelation.getProductId())); + } + prodGroupRelationService.saveOrUpdateBatch(groupRelations, 100); + log.info("分组同步,源{}个,已有{}个,同步{}个", list.size(), pointGroup.size(), groupMap.size()); + return groupMap; + } + + //分组 + public void syncProductPackage(Long shopId, Map pros, Map skus) { + List list = productService.queryChain() + .eq(Product::getShopId, shopId) + .and(column(Product::getType).eq("weight").or(column(Product::getType).eq("coupon"))) + .list(); + for (Product product : list) { + if (StrUtil.isNotBlank(product.getGroupSnap()) && product.getGroupSnap().length() > 5) { + ProductGroupVo proGroupVo = JSONObject.parseObject(product.getGroupSnap(), ProductGroupVo.class); + List goodList = new ArrayList<>(); + for (ProductGroupVo.Food goods : proGroupVo.getGoods()) { + if (pros.containsKey(goods.getProId())) { + if (goods.getSkuId() != null && skus.containsKey(goods.getSkuId())) { + goods.setProId(pros.get(goods.getProId())); + goods.setSkuId(skus.get(goods.getSkuId())); + } else { + goods.setProId(pros.get(goods.getProId())); + } + goodList.add(goods); + } + } + proGroupVo.setCount(goodList.size()); + proGroupVo.setGoods(goodList); + if (proGroupVo.getNumber() != null && proGroupVo.getNumber() > 0) { + if (proGroupVo.getNumber() > proGroupVo.getCount()) { + proGroupVo.setNumber(proGroupVo.getCount()); + } + } + } + } + } + + //分组 + public Map syncSku(Long sourceShopId, Long pointShopId, Map prods) { + Map skuMap = new HashMap<>(); + List pointSkus = skuService.queryChain().select(ProdSku::getSyncId) + .eq(ProdSku::getShopId, pointShopId) + .isNotNull(ProdSku::getSyncId) + .listAs(Long.class); + List list = skuService.queryChain().eq(ProdSku::getShopId, sourceShopId).list(); + for (ProdSku prodSku : list) { + if (prods.containsKey(prodSku.getProductId()) && (CollUtil.isEmpty(pointSkus) || !pointSkus.contains(prodSku.getId()))) { + ProdSku newSku = BeanUtil.copyProperties(prodSku, ProdSku.class); + newSku.setId(null); + newSku.setShopId(pointShopId); + newSku.setProductId(prods.get(prodSku.getProductId())); + newSku.setSyncId(prodSku.getId()); + skuService.save(newSku); + skuMap.put(prodSku.getId(), newSku.getId()); + } + } + log.info("商品SKU同步,源{}个,已有{}个,同步{}个", list.size(), pointSkus.size(), skuMap.size()); + return skuMap; + } + + public Map syncConsGroup(Long sourceShopId, Long pointShopId) { + Map consGroupMap = new HashMap<>(); + List pointConsGroup = consGroupService.queryChain().select(ConsGroup::getSyncId) + .eq(ConsGroup::getShopId, pointShopId) + .isNotNull(ConsGroup::getSyncId) + .listAs(Long.class); + List list = consGroupService.queryChain().eq(ConsGroup::getShopId, sourceShopId).list(); + for (ConsGroup consGroup : list) { + if (CollUtil.isEmpty(pointConsGroup) || !pointConsGroup.contains(consGroup.getId())) { + ConsGroup newConsGroup = BeanUtil.copyProperties(consGroup, ConsGroup.class); + newConsGroup.setId(null); + newConsGroup.setSyncId(consGroup.getId()); + newConsGroup.setShopId(pointShopId); + consGroupService.save(newConsGroup); + consGroupMap.put(consGroup.getId(), newConsGroup.getId()); + } + } + log.info("耗材分组同步,源{}个,已有{}个,同步{}个", list.size(), pointConsGroup.size(), consGroupMap.size()); + return consGroupMap; + } + + // 耗材 + public Map syncConsInfo(Long sourceShopId, Long pointShopId, Map consGroupMap) { + Map consMap = new HashMap<>(); + List pointConsInfo = consInfoService.queryChain().select(ConsInfo::getSyncId) + .eq(ConsInfo::getShopId, pointShopId) + .isNotNull(ConsInfo::getSyncId) + .listAs(Long.class); + List list = consInfoService.queryChain().eq(ConsInfo::getShopId, sourceShopId).list(); + for (ConsInfo cons : list) { + if (CollUtil.isEmpty(pointConsInfo) || !pointConsInfo.contains(cons.getId())) { + ConsInfo conInfo = BeanUtil.copyProperties(cons, ConsInfo.class); + conInfo.setId(null); + conInfo.setShopId(pointShopId); + conInfo.setSyncId(cons.getId()); + conInfo.setConsGroupId(consGroupMap.get(conInfo.getConsGroupId())); + conInfo.setStockNumber(BigDecimal.ZERO); + consInfoService.save(conInfo); + consMap.put(cons.getId(), conInfo.getId()); + } + } + log.info("耗材同步,源{}个,已有{}个,同步{}个", list.size(), pointConsInfo.size(), consMap.size()); + return consMap; + } + + public void syncConsPro(Long sourceShopId, Long pointShopId, Map consMap, Map proMap) { + List list = prodConsRelationService.queryChain().eq(ProdConsRelation::getShopId, sourceShopId).list(); + for (ProdConsRelation prodConsRelation : list) { + prodConsRelation.setShopId(pointShopId); + prodConsRelation.setProductId(proMap.get(prodConsRelation.getProductId())); + prodConsRelation.setConsInfoId(consMap.get(prodConsRelation.getConsInfoId())); + } + prodConsRelationService.saveOrUpdateBatch(list, 100); + log.info("耗材与商品关联关系,同步{}个", list.size()); + + } +} diff --git a/cash-service/system-service/src/main/java/com/czg/service/system/service/impl/SqlScriptServiceImpl.java b/cash-service/system-service/src/main/java/com/czg/service/system/service/impl/SqlScriptServiceImpl.java index 7a189c6f0..3c843357a 100644 --- a/cash-service/system-service/src/main/java/com/czg/service/system/service/impl/SqlScriptServiceImpl.java +++ b/cash-service/system-service/src/main/java/com/czg/service/system/service/impl/SqlScriptServiceImpl.java @@ -109,7 +109,7 @@ public class SqlScriptServiceImpl extends ServiceImpl sqlList = Arrays.asList(sqls.split("\\r?\\n")); + List sqlList = Arrays.asList(sqls.split(";")); for (String sql : sqlList) { if (!sql.trim().isEmpty()) { jdbcTemplate.execute(sql); diff --git a/sqls/250327/cash.sql b/sqls/250327/cash.sql deleted file mode 100644 index c5473a39b..000000000 --- a/sqls/250327/cash.sql +++ /dev/null @@ -1 +0,0 @@ -select * from tb_cashier_cart; \ No newline at end of file diff --git a/sqls/250403/tb_cons_group.sql b/sqls/250403/tb_cons_group.sql new file mode 100644 index 000000000..b8d8561ef --- /dev/null +++ b/sqls/250403/tb_cons_group.sql @@ -0,0 +1 @@ +ALTER TABLE `tb_cons_group` ADD COLUMN `sync_id` bigint NULL COMMENT '同步ID' AFTER `id`; diff --git a/sqls/250403/tb_cons_info.sql b/sqls/250403/tb_cons_info.sql new file mode 100644 index 000000000..cc6bfcb15 --- /dev/null +++ b/sqls/250403/tb_cons_info.sql @@ -0,0 +1 @@ +ALTER TABLE `tb_cons_info` ADD COLUMN `sync_id` bigint NULL COMMENT '同步ID' AFTER `id`; diff --git a/sqls/250403/tb_prod_cons_relation.sql b/sqls/250403/tb_prod_cons_relation.sql new file mode 100644 index 000000000..d427c5c1c --- /dev/null +++ b/sqls/250403/tb_prod_cons_relation.sql @@ -0,0 +1,4 @@ +ALTER TABLE `tb_prod_cons_relation` + DROP COLUMN `id`, + DROP PRIMARY KEY, + ADD PRIMARY KEY (`shop_id`, `product_id`, `cons_info_id`) USING BTREE; \ No newline at end of file diff --git a/sqls/250403/tb_prod_group.sql b/sqls/250403/tb_prod_group.sql new file mode 100644 index 000000000..cebf3f341 --- /dev/null +++ b/sqls/250403/tb_prod_group.sql @@ -0,0 +1 @@ +ALTER TABLE `tb_prod_sku` ADD COLUMN `sync_id` bigint NULL COMMENT '同步ID' AFTER `id`; diff --git a/sqls/250403/tb_prod_sku.sql b/sqls/250403/tb_prod_sku.sql new file mode 100644 index 000000000..b6cd05d22 --- /dev/null +++ b/sqls/250403/tb_prod_sku.sql @@ -0,0 +1 @@ +ALTER TABLE `tb_product` ADD COLUMN `sync_id` bigint NULL COMMENT '同步ID' AFTER `id`; diff --git a/sqls/250403/tb_product.sql b/sqls/250403/tb_product.sql new file mode 100644 index 000000000..b6cd05d22 --- /dev/null +++ b/sqls/250403/tb_product.sql @@ -0,0 +1 @@ +ALTER TABLE `tb_product` ADD COLUMN `sync_id` bigint NULL COMMENT '同步ID' AFTER `id`; diff --git a/sqls/250403/cash.sql b/sqls/250403/tb_shop_info.sql similarity index 100% rename from sqls/250403/cash.sql rename to sqls/250403/tb_shop_info.sql diff --git a/sqls/250403/tb_shop_prod_category.sql b/sqls/250403/tb_shop_prod_category.sql new file mode 100644 index 000000000..c370ba632 --- /dev/null +++ b/sqls/250403/tb_shop_prod_category.sql @@ -0,0 +1 @@ +ALTER TABLE `tb_shop_prod_category` ADD COLUMN `sync_id` bigint NULL COMMENT '同步ID' AFTER `id`; \ No newline at end of file diff --git a/sqls/250403/tb_shop_prod_spec.sql b/sqls/250403/tb_shop_prod_spec.sql new file mode 100644 index 000000000..e2a65204d --- /dev/null +++ b/sqls/250403/tb_shop_prod_spec.sql @@ -0,0 +1 @@ +ALTER TABLE `tb_shop_prod_spec` ADD COLUMN `sync_id` bigint NULL COMMENT '同步ID' AFTER `id`; \ No newline at end of file diff --git a/sqls/250403/tb_shop_prod_unit.sql b/sqls/250403/tb_shop_prod_unit.sql new file mode 100644 index 000000000..f0b5506ad --- /dev/null +++ b/sqls/250403/tb_shop_prod_unit.sql @@ -0,0 +1 @@ +ALTER TABLE `tb_shop_prod_unit` ADD COLUMN `sync_id` bigint NULL COMMENT '同步ID' AFTER `id`; \ No newline at end of file From 18b2c536f3061d43159dd7a0a1ed5ee966b21795 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 7 Apr 2025 18:11:48 +0800 Subject: [PATCH 022/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/controller/admin/ShopBranchController.java | 6 ++++-- .../java/com/czg/account/service/ShopBranchService.java | 5 +++-- .../com/czg/service/account/mapper/ShopConfigMapper.java | 4 ++-- .../service/account/service/impl/ShopBranchServiceImpl.java | 5 +++-- .../src/main/resources/mapper/ShopConfigMapper.xml | 3 +++ 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java index 95f1ca7ba..67ae27b07 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java @@ -1,6 +1,7 @@ package com.czg.controller.admin; import com.czg.account.dto.ShopBranchDTO; +import com.czg.account.param.ShopBranchParam; import com.czg.account.service.ShopBranchService; import com.czg.log.annotation.OperationLog; import com.czg.resp.CzgResult; @@ -27,9 +28,10 @@ public class ShopBranchController { */ @GetMapping("page") @OperationLog("分店管理-分页") - public CzgResult> getBranchPage() { + public CzgResult> getBranchPage(ShopBranchParam param) { Long shopId = StpKit.USER.getShopId(0L); - Page data = shopBranchService.findPage(shopId); + param.setShopId(shopId); + Page data = shopBranchService.findPage(param); return CzgResult.success(data); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopBranchService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopBranchService.java index 9c178a2b6..00e1eb689 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopBranchService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopBranchService.java @@ -1,6 +1,7 @@ package com.czg.account.service; import com.czg.account.dto.ShopBranchDTO; +import com.czg.account.param.ShopBranchParam; import com.mybatisflex.core.paginate.Page; /** @@ -13,10 +14,10 @@ public interface ShopBranchService { /** * 查询分店列表 * - * @param shopId 主店id + * @param param 查询入参 * @return 分店列表 */ - Page findPage(Long shopId); + Page findPage(ShopBranchParam param); /** * 设计数据同步方式 diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java index 267190748..97074ef8e 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopConfigMapper.java @@ -2,9 +2,9 @@ package com.czg.service.account.mapper; import com.czg.account.dto.ShopBranchDTO; import com.czg.account.entity.ShopConfig; +import com.czg.account.param.ShopBranchParam; import com.mybatisflex.core.BaseMapper; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; import java.util.List; @@ -17,6 +17,6 @@ import java.util.List; @Mapper public interface ShopConfigMapper extends BaseMapper { - List findBranchList(@Param("shopId") Long shopId); + List findBranchList(ShopBranchParam param); } \ No newline at end of file diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java index b3f804aaa..856f782f0 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java @@ -6,6 +6,7 @@ import com.czg.account.entity.ShopConfig; import com.czg.account.entity.ShopInfo; import com.czg.account.enums.BranchDataSyncMethodEnum; import com.czg.account.enums.ShopTypeEnum; +import com.czg.account.param.ShopBranchParam; import com.czg.account.service.ShopBranchService; import com.czg.enums.YesNoEnum; import com.czg.exception.CzgException; @@ -38,9 +39,9 @@ public class ShopBranchServiceImpl implements ShopBranchService { private ShopInfoMapper shopInfoMapper; @Override - public Page findPage(Long shopId) { + public Page findPage(ShopBranchParam param) { PageHelper.startPage(PageUtil.buildPageHelp()); - List branchList = shopConfigMapper.findBranchList(shopId); + List branchList = shopConfigMapper.findBranchList(param); return PageUtil.convert(new PageInfo<>(branchList)); } diff --git a/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml index 8cdf3252a..d5c6a6329 100644 --- a/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml +++ b/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml @@ -12,5 +12,8 @@ left join tb_shop_info t2 on t1.id = t2.id left join sys_user t3 on t1.id = t3.id where t1.main_id = #{shopId} + + and t2.shop_name like concat('%', #{branchName}, '%') + \ No newline at end of file From 2eec2f4303c60d94323f19429ff9cce58f132978 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 7 Apr 2025 18:15:11 +0800 Subject: [PATCH 023/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/account/dto/ShopBranchDTO.java | 4 ++++ .../src/main/resources/mapper/ShopConfigMapper.xml | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopBranchDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopBranchDTO.java index 465cedaea..3a583cbe0 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopBranchDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopBranchDTO.java @@ -23,6 +23,10 @@ public class ShopBranchDTO implements Serializable { * 店铺名称 */ private String shopName; + /** + * 店铺类型 单店--only 连锁店--chain--加盟店join (对应原来 type) + */ + private String shopType; /** * 账号 */ diff --git a/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml index d5c6a6329..875c7f624 100644 --- a/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml +++ b/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml @@ -7,7 +7,8 @@ select t1.*, t2.shop_name, t2.phone, - t3.account + t3.account, + t2.shop_type from tb_shop_config t1 left join tb_shop_info t2 on t1.id = t2.id left join sys_user t3 on t1.id = t3.id From 0253aaeaed8ca7dc80ef7ad18871b8a36c070690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 09:22:45 +0800 Subject: [PATCH 024/162] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/controller/admin/SyncNoticeController.java | 9 +++++++++ .../account/service/impl/SyncNoticeServiceImpl.java | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) 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 index 2f4d28f2a..56039333b 100644 --- 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 @@ -58,6 +58,15 @@ public class SyncNoticeController { return CzgResult.success(syncNoticeService.read(StpKit.USER.getShopId(), syncNoticeReadDTO)); } + /** + * 清空已读 + * @return 是否成功 + */ + @DeleteMapping + public CzgResult clear() { + return CzgResult.success(syncNoticeService.remove(new QueryWrapper().eq(SyncNotice::getShopId, StpKit.USER.getShopId()).eq(SyncNotice::getIsRead, 1))); + } + /** * 消息统计 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 index 456c99e4b..146425c68 100644 --- 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 @@ -48,7 +48,7 @@ public class SyncNoticeServiceImpl extends ServiceImpl Date: Tue, 8 Apr 2025 09:26:42 +0800 Subject: [PATCH 025/162] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/controller/admin/SyncNoticeController.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 index 56039333b..586283c4c 100644 --- 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 @@ -62,11 +62,21 @@ public class SyncNoticeController { * 清空已读 * @return 是否成功 */ - @DeleteMapping + @DeleteMapping("/clear") public CzgResult clear() { return CzgResult.success(syncNoticeService.remove(new QueryWrapper().eq(SyncNotice::getShopId, StpKit.USER.getShopId()).eq(SyncNotice::getIsRead, 1))); } + /** + * 删除 + * @param id id + * @return 是否成功 + */ + @DeleteMapping + public CzgResult delete(@RequestParam Long id) { + return CzgResult.success(syncNoticeService.remove(new QueryWrapper().eq(SyncNotice::getShopId, StpKit.USER.getShopId()).eq(SyncNotice::getId, id))); + } + /** * 消息统计 From c357185dff41001f0598307bb595a4ff6e48f8e7 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 09:32:24 +0800 Subject: [PATCH 026/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ShopBranchController.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java index 67ae27b07..3433270ba 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java @@ -1,8 +1,11 @@ package com.czg.controller.admin; import com.czg.account.dto.ShopBranchDTO; +import com.czg.account.entity.ShopConfig; +import com.czg.account.enums.BranchDataSyncMethodEnum; import com.czg.account.param.ShopBranchParam; import com.czg.account.service.ShopBranchService; +import com.czg.account.service.ShopConfigService; import com.czg.log.annotation.OperationLog; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; @@ -22,6 +25,8 @@ public class ShopBranchController { @Resource private ShopBranchService shopBranchService; + @Resource + private ShopConfigService shopConfigService; /** * 分店列表 @@ -86,4 +91,16 @@ public class ShopBranchController { shopBranchService.accountDisable(branchShopId); return CzgResult.success(); } + + /** + * 获取数据同步方式 + * @return 数据同步方式 auto-实时自动同步 manual-手动同步 + */ + @GetMapping("/get/dataSyncMethod") + @OperationLog("分店管理-获取数据同步方式") + public CzgResult getDataSyncMethod() { + Long shopId = StpKit.USER.getShopId(0L); + ShopConfig shopConfig = shopConfigService.getById(shopId); + return CzgResult.success(shopConfig == null? BranchDataSyncMethodEnum.AUTO.getValue() : shopConfig.getBranchDataSyncMethod()); + } } From b06e7eb181c78a53a145db3004d65bbe591480aa Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 09:32:32 +0800 Subject: [PATCH 027/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/account/param/ShopBranchParam.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/param/ShopBranchParam.java diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/param/ShopBranchParam.java b/cash-common/cash-common-service/src/main/java/com/czg/account/param/ShopBranchParam.java new file mode 100644 index 000000000..e9847f256 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/param/ShopBranchParam.java @@ -0,0 +1,30 @@ +package com.czg.account.param; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分店查询入参 + * @author tankaikai + * @since 2025-04-07 18:02 + */ +@Data +public class ShopBranchParam implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 分店名称 + */ + private String branchShopName; + + /** + * 店铺ID + */ + @JSONField(serialize = false) + private Long shopId; +} From 4e9d4b620faceba09243655191ded90bb8c31cee Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Tue, 8 Apr 2025 09:35:07 +0800 Subject: [PATCH 028/162] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/czg/order/entity/OrderInfo.java | 5 ++++- .../src/main/java/com/czg/order/vo/OrderInfoVo.java | 4 ++++ .../service/order/service/impl/PayServiceImpl.java | 2 ++ .../product/service/impl/ShopSyncServiceImpl.java | 12 ++++-------- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderInfo.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderInfo.java index 9e149dfd8..bd0c27c1b 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderInfo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderInfo.java @@ -23,7 +23,6 @@ import lombok.NoArgsConstructor; * @since 2025-02-13 */ @Data - @NoArgsConstructor @AllArgsConstructor @Table("tb_order_info") @@ -128,6 +127,10 @@ public class OrderInfo implements Serializable { * 台桌名称 */ private String tableName; + /** + * 退款方式 现金退款-cash 原路退回-payBack + */ + private String refundType; /** * 订单类型- diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderInfoVo.java b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderInfoVo.java index f5c1ccff7..b79f70054 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderInfoVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderInfoVo.java @@ -71,6 +71,10 @@ public class OrderInfoVo implements Serializable { * miniapp小程序 */ private String orderType; + /** + * 退款方式 现金退款-cash 原路退回-payBack + */ + private String refundType; /** * 平台类型 pc 收银机客户端 wechat 微信小程序 alipay 支付宝小程序 admin-pc PC管理端 admin-app APP管理端 diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PayServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PayServiceImpl.java index b65d63e64..81d147773 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PayServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PayServiceImpl.java @@ -667,7 +667,9 @@ public class PayServiceImpl implements PayService { refundOrder(orderInfo.getShopId(), orderInfo.getId(), orderInfo.getPayOrderId(), refPayOrderNo, StrUtil.isBlank(param.getRefundReason()) ? "退款" : param.getRefundReason(), param.getRefundAmount()); } + orderInfo.setRefundType("payBack"); } + orderInfo.setRefundType("cash"); } else { orderInfo.setOrderAmount(orderInfo.getOrderAmount().subtract(param.getRefundAmount())); } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index d24c7b9bf..dfdbca7d4 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -4,23 +4,17 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.czg.account.entity.ShopInfo; -import com.czg.account.entity.SysRole; import com.czg.account.service.ShopInfoService; +import com.czg.account.service.SyncNoticeService; import com.czg.exception.CzgException; import com.czg.product.entity.*; import com.czg.product.service.*; import com.czg.product.vo.ProductGroupVo; -import com.czg.service.product.mapper.ConsInfoMapper; -import com.czg.service.product.mapper.ProdConsRelationMapper; -import com.czg.service.product.mapper.ProdSkuMapper; import com.czg.utils.AssertUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -31,7 +25,6 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; import static com.mybatisflex.core.query.QueryMethods.column; @@ -64,6 +57,8 @@ public class ShopSyncServiceImpl implements ShopSyncService { private ConsGroupService consGroupService; @Resource private ProdConsRelationService prodConsRelationService; + @Resource + private SyncNoticeService syncNoticeService; private void checkShopInfo(Long sourceShopId, Long targetShopId) { AssertUtil.isNull(sourceShopId, "{}不能为空", "源店铺ID"); @@ -78,6 +73,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { || targetShop.getIsHeadShop() == null || targetShop.getIsHeadShop().equals(1)) { throw new CzgException("同步失败,目标店铺是主店铺或目标店铺是单店"); } + } @Override From f37ef5959b62bd031bd17f96cfb0daec3af60a68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 09:35:50 +0800 Subject: [PATCH 029/162] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqls/250403/tb_sync_notice.sql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 sqls/250403/tb_sync_notice.sql diff --git a/sqls/250403/tb_sync_notice.sql b/sqls/250403/tb_sync_notice.sql new file mode 100644 index 000000000..69f2f028f --- /dev/null +++ b/sqls/250403/tb_sync_notice.sql @@ -0,0 +1,14 @@ +CREATE TABLE `tb_sync_notice` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL COMMENT '商品名称或耗材名称', + `source_id` bigint DEFAULT NULL COMMENT '来源id', + `sys_user_id` bigint DEFAULT NULL COMMENT '操作用户id', + `type` tinyint DEFAULT NULL COMMENT '通知类型 0 商品变动 1 耗材变动', + `is_read` tinyint DEFAULT '0' COMMENT '是否已读,1已读', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `read_time` datetime DEFAULT NULL COMMENT '已读时间', + `operation_type` tinyint DEFAULT NULL COMMENT '操作类型 0 新增 1 修改', + `content` varchar(255) DEFAULT NULL COMMENT '消息内容', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; From 81b23506ac7a98556ad083d043a377d716a70719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 09:54:06 +0800 Subject: [PATCH 030/162] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/SyncNoticeController.java | 2 +- .../com/czg/account/entity/SyncNotice.java | 18 ++---------- .../account/service/SyncNoticeService.java | 5 ++-- .../service/impl/SyncNoticeServiceImpl.java | 28 ++++++++----------- 4 files changed, 18 insertions(+), 35 deletions(-) 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 index 586283c4c..f96eba3fa 100644 --- 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 @@ -27,7 +27,7 @@ public class SyncNoticeController { * @param name 名称 * @param startTime 起始时间 * @param endTime 结束时间 - * @param type 0-商品 1-耗材 + * @param type 0 商品新增 1 商品编辑 2 耗材新增 3 耗材编辑 * @param isRead 0-未读 1-已读 * @return 分页数据 */ 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 index 414234dde..b7b8af517 100644 --- 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 @@ -33,23 +33,13 @@ public class SyncNotice implements Serializable { @Id(keyType = KeyType.Auto) private Long id; - /** - * 商品名称或耗材名称 - */ - private String name; - - /** - * 来源id - */ - private Long sourceId; - /** * 操作用户id */ private Long sysUserId; /** - * 通知类型 0 商品变动 1 耗材变动 + * 通知类型 0 商品新增 1 商品编辑 2耗材新增 3耗材编辑 */ private Integer type; @@ -62,16 +52,14 @@ public class SyncNotice implements Serializable { * 店铺id */ private Long shopId; - /** - * 操作类型 0 新增 1 修改 - */ - private Integer operationType; /** * 消息内容 */ private String content; + private String extraJson; + /** * 创建时间 */ 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 index ba1261afd..fc5908094 100644 --- 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 @@ -20,10 +20,9 @@ public interface SyncNoticeService extends IService { * @param sysUserId 操作用户id * @param name 商品/耗材名称 * @param id 商品/耗材id - * @param type 0-商品 1-耗材 - * @param operationType 0-新增 1-修改 + * @param type 0 商品新增 1 商品编辑 2 耗材新增 3 耗材编辑 */ - void addNotice(Long shopId, Long sysUserId, String name, Long id, Integer type, Integer operationType); + 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); 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 index 146425c68..de4882585 100644 --- 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 @@ -25,31 +25,27 @@ import java.util.List; public class SyncNoticeServiceImpl extends ServiceImpl implements SyncNoticeService { @Override - public void addNotice(Long shopId, Long sysUserId, String name, Long id, Integer type, Integer operationType) { + 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); - syncNotice.setOperationType(operationType); - String content = switch (operationType) { - case 0 -> "新增"; - case 1 -> "修改"; + String content = switch (type) { + case 0 -> "新增商品"; + case 1 -> "修改商品"; + case 2 -> "新增耗材"; + case 3 -> "修改耗材"; default -> ""; }; - switch (type) { - case 0: - content += "商品"; - break; - case 1: - content += "耗材"; - break; - } + String json = switch (type) { + case 0, 1, 2, 3 -> StrUtil.format("{\"id\":{},\"name\":\"{}\"}", id, name); + default -> ""; + }; content = StrUtil.format("{}: {}, 请及时确认;", content, name); syncNotice.setContent(content); + syncNotice.setExtraJson(json); save(syncNotice); } @@ -57,7 +53,7 @@ public class SyncNoticeServiceImpl extends ServiceImpl 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); + queryWrapper.like(SyncNotice::getContent, name); } if (StrUtil.isNotBlank(startTime)) { From f4b73bd1fd3469dc551944f4ee0d78472b09a568 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Tue, 8 Apr 2025 10:00:52 +0800 Subject: [PATCH 031/162] =?UTF-8?q?=E9=80=80=E6=AC=BE=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/service/order/service/impl/PayServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PayServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PayServiceImpl.java index 81d147773..b6016be9f 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PayServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PayServiceImpl.java @@ -644,6 +644,7 @@ public class PayServiceImpl implements PayService { //总退款金额 //TODO 退款 券 未处理 if (isPay) { + orderInfo.setRefundType("cash"); //非现金退款 if (!param.isCash()) { if (orderInfo.getPayType().equals(PayEnums.VIP_PAY.getValue())) { @@ -669,7 +670,6 @@ public class PayServiceImpl implements PayService { } orderInfo.setRefundType("payBack"); } - orderInfo.setRefundType("cash"); } else { orderInfo.setOrderAmount(orderInfo.getOrderAmount().subtract(param.getRefundAmount())); } From 24981e5c9dd54fd6155c4aaed97af4ea0c764d1e Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Tue, 8 Apr 2025 10:06:28 +0800 Subject: [PATCH 032/162] =?UTF-8?q?id=E7=A7=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/czg/product/dto/ProdConsRelationDTO.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdConsRelationDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdConsRelationDTO.java index 3bc0f820b..419807a92 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdConsRelationDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdConsRelationDTO.java @@ -22,10 +22,6 @@ public class ProdConsRelationDTO implements Serializable { @Serial private static final long serialVersionUID = 1L; - /** - * id - */ - private Long id; /** * 店铺id */ From dbaa79b471cd75848ee13acc96f16b6dd550a800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 10:07:19 +0800 Subject: [PATCH 033/162] =?UTF-8?q?pad=E7=82=B9=E9=A4=90=E8=BF=94=E5=9B=9E?= =?UTF-8?q?sku=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/product/vo/ProductVO.java | 3 +++ .../service/account/service/impl/PadProdServiceImpl.java | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java index 9db815bc8..5a74b0c75 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java @@ -1,10 +1,12 @@ package com.czg.product.vo; +import com.czg.product.entity.ProdSku; import com.czg.product.entity.Product; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; +import java.util.List; /** * @author Administrator @@ -13,4 +15,5 @@ import java.math.BigDecimal; @Data public class ProductVO extends Product { private BigDecimal lowPrice; + private List skuList; } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java index b7eb81f8f..2c568f95f 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java @@ -4,7 +4,9 @@ import com.czg.account.dto.pad.*; import com.czg.account.entity.*; import com.czg.account.service.*; import com.czg.exception.ApiNotPrintException; +import com.czg.product.entity.ProdSku; import com.czg.product.entity.Product; +import com.czg.product.service.ProdSkuService; import com.czg.product.service.ProductService; import com.czg.product.vo.ProductVO; import com.czg.service.account.mapper.PadProductCategoryDetailMapper; @@ -32,6 +34,8 @@ public class PadProdServiceImpl implements PadProdService { private PadProductCategoryService padProductCategoryService; @DubboReference private ProductService productService; + @DubboReference + private ProdSkuService prodSkuService; @Resource private ShopProdCategoryService shopProdCategoryService; @Resource @@ -59,6 +63,10 @@ public class PadProdServiceImpl implements PadProdService { padDetailDTO.setProductIdList(productIds); if (!productIds.isEmpty()) { List products = productService.listAndLowPrice(shopId, productIds); + products.parallelStream().forEach(item -> { + List skuList = prodSkuService.list(new QueryWrapper().eq(ProdSku::getProductId, item.getId())); + item.setSkuList(skuList); + }); padDetailDTO.setProductList(products); } From 6bade716cb9755436e465060e66c7dbed8ca7c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 10:36:28 +0800 Subject: [PATCH 034/162] =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/sa/MyStpLogic.java | 40 +++++++++++++++++-- .../account/service/AuthorizationService.java | 6 +++ .../impl/AuthorizationServiceImpl.java | 38 ++++++++++++++++++ 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java b/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java index 43e9728b0..a566421cd 100644 --- a/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java +++ b/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java @@ -17,6 +17,7 @@ import cn.hutool.core.util.StrUtil; import com.czg.exception.ApiNotPrintException; import com.czg.exception.CzgException; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; @@ -25,6 +26,7 @@ import java.util.function.Consumer; /** * @author Administrator */ +@Slf4j @Getter public class MyStpLogic { public static final StpLogic CLIENT_LOGIC = new StpLogic("client"); @@ -53,6 +55,29 @@ public class MyStpLogic { } } + /** + * 身份切换 + * @param id 用户id + * @param account 账户名 + * @param shopId 店铺id + * @param shopName 店铺名称 + * @param loginType 登录类型 + * @param isAdmin 是否管理员 + */ + public void switchTo(Long id, String account, Long shopId, String shopName, LoginType loginType, boolean isAdmin) { + StpLogic logic = getLogic(); + long headId = logic.getLoginIdAsLong(); + SaSession session = logic.getSession(); + Object parentId1 = session.get("headId"); + if (parentId1 == null) { + session.set("headId", headId); + } + session.set("userId", id).set("isAdmin", isAdmin).set("isManager", loginType.equals(LoginType.MANAGER)) + .set("loginType", loginType).set("account", account).set("shopId", shopId).set("shopName", shopName); + + logic.getSaTokenDao().set(splicingKeyTokenValue(logic.getTokenValue()), id.toString(), logic.getTokenTimeout()); + } + /** * @param id 登录账号id * @param shopName 店铺名称 @@ -83,6 +108,8 @@ public class MyStpLogic { SaManager.getSaTokenDao().set(SaManager.getConfig().getTokenName() + ":" + token, String.valueOf(id), SaManager.getConfig().getTimeout()); } + + /** * 获取当前登录账号名称 管理端为用户账号 客户端为openId * @@ -104,6 +131,15 @@ public class MyStpLogic { return shopName instanceof String s ? s : null; } + /** + * 获取主店铺id + * @return id + */ + public Long getHeadId() { + Object headId = getLogic().getSession().get("headId"); + return headId == null ? null : Long.parseLong(headId.toString()); + } + /** * 获取店铺id * @@ -901,9 +937,7 @@ public class MyStpLogic { } - public void switchTo(Object loginId) { - getLogic().switchTo(loginId); - } + public void endSwitch() { diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/AuthorizationService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/AuthorizationService.java index 14242000a..1a6663401 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/service/AuthorizationService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/AuthorizationService.java @@ -11,4 +11,10 @@ public interface AuthorizationService { Object getCaptcha(); LoginVO login(SysLoginDTO loginDTO, String platformType); + + /** + * 切换登录用户 + * @param sysUserId 系统用户id + */ + void switchTo(Long sysUserId); } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java index 624b23fbb..156a54756 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java @@ -12,6 +12,7 @@ import com.czg.account.vo.LoginVO; import com.czg.config.RedisCst; import com.czg.enums.PlatformTypeEnum; import com.czg.enums.StatusEnum; +import com.czg.enums.YesNoEnum; import com.czg.exception.ApiNotPrintException; import com.czg.sa.MyStpLogic; import com.czg.sa.StpKit; @@ -173,6 +174,43 @@ public class AuthorizationServiceImpl implements AuthorizationService { return new LoginVO(StpKit.USER.getTokenInfo(), new ArrayList<>(), loginDTO.loginType(), shopInfo); } + @Override + public void switchTo(Long sysUserId) { + Long headId = StpKit.USER.getHeadId(); + long shopId = StpKit.USER.getLoginIdAsLong(); + ShopInfo currentInfo = shopInfoService.getById(shopId); + if (currentInfo.getIsHeadShop() != YesNoEnum.YES.value() && headId == null) { + throw new ApiNotPrintException("登录账号无权限切换"); + } + + SysUser sysUser = sysUserService.getById(sysUserId); + if (sysUser == null) { + throw new ApiNotPrintException("用户不存在"); + } + + ShopInfo shopInfo = shopInfoService.getById(sysUser.getId()); + if (shopInfo == null) { + throw new ApiNotPrintException("店铺信息不存在"); + } + + if (!shopInfo.getMainId().equals(headId)) { + throw new ApiNotPrintException("目标店铺非登录账号所有"); + } + + // 查询角色 + List roleList = sysRoleService.getByUserId(sysUser.getId()); + List roleNames = roleList.stream().map(SysRole::getName).collect(Collectors.toList()); + if (sysUser.getIsAdmin()) { + roleNames.add("admin"); + } + StpKit.USER.addRoleList(roleNames); + // 权限赋予 + List promissionList = sysMenuMapper.selectByUserId(sysUser.getId(), null).stream().map(SysMenu::getPermission).filter(StrUtil::isNotBlank).toList(); + StpKit.USER.switchTo(sysUser.getId(), sysUser.getAccount(), shopInfo.getId(), shopInfo.getShopName(), MyStpLogic.LoginType.MANAGER, sysUser.getIsAdmin()); + StpKit.USER.addPermissionList(promissionList); + StpKit.USER.addRoleList(roleNames); + } + @NotNull private static HandoverRecord getHandoverRecord(boolean isStaff, ShopInfo shopInfo, ShopStaff shopStaff) { HandoverRecord entity = new HandoverRecord(); From c424f3613f844d565204dbad8e1b47f8ac3a65ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 10:39:19 +0800 Subject: [PATCH 035/162] =?UTF-8?q?=E6=B6=88=E6=81=AF=E4=B8=AD=E5=BF=83sql?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqls/250403/tb_sync_notice.sql | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/sqls/250403/tb_sync_notice.sql b/sqls/250403/tb_sync_notice.sql index 69f2f028f..bf02edad2 100644 --- a/sqls/250403/tb_sync_notice.sql +++ b/sqls/250403/tb_sync_notice.sql @@ -1,14 +1,12 @@ CREATE TABLE `tb_sync_notice` ( `id` bigint NOT NULL AUTO_INCREMENT, - `name` varchar(255) DEFAULT NULL COMMENT '商品名称或耗材名称', - `source_id` bigint DEFAULT NULL COMMENT '来源id', - `sys_user_id` bigint DEFAULT NULL COMMENT '操作用户id', - `type` tinyint DEFAULT NULL COMMENT '通知类型 0 商品变动 1 耗材变动', - `is_read` tinyint DEFAULT '0' COMMENT '是否已读,1已读', `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `sys_user_id` bigint DEFAULT NULL COMMENT '操作用户id', + `type` tinyint DEFAULT NULL COMMENT '通知类型 0 商品新增 1 商品编辑 2耗材新增 3耗材编辑\r\n', + `is_read` tinyint DEFAULT '0' COMMENT '是否已读,1已读', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `read_time` datetime DEFAULT NULL COMMENT '已读时间', - `operation_type` tinyint DEFAULT NULL COMMENT '操作类型 0 新增 1 修改', `content` varchar(255) DEFAULT NULL COMMENT '消息内容', + `extra_json` varchar(255) DEFAULT NULL COMMENT '拓展信息', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; From c4cdc83ec34241054f95d3eabf947c4bda76c8a2 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 14:56:23 +0800 Subject: [PATCH 036/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/ShopBranchController.java | 8 +- .../java/com/czg/account/entity/ShopUser.java | 13 ++ .../account/service/ShopUserSyncService.java | 17 ++ .../czg/product/service/ShopSyncService.java | 2 - .../service/impl/ShopBranchServiceImpl.java | 21 ++- .../service/impl/ShopUserSyncServiceImpl.java | 172 ++++++++++++++++++ .../service/impl/ShopSyncServiceImpl.java | 4 +- sqls/250403/tb_shop_user.sql | 13 ++ 8 files changed, 241 insertions(+), 9 deletions(-) create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserSyncService.java create mode 100644 cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java create mode 100644 sqls/250403/tb_shop_user.sql diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java index 3433270ba..15ea862d3 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopBranchController.java @@ -51,9 +51,7 @@ public class ShopBranchController { public CzgResult settingDataSyncMethod(@RequestParam String dataSyncMethod) { Long shopId = StpKit.USER.getShopId(0L); shopBranchService.settingDataSyncMethod(shopId, dataSyncMethod); - CzgResult ret = CzgResult.success(); - ret.setMsg("设置成功,数据正在后台同步中..."); - return ret; + return CzgResult.success(); } /** @@ -65,7 +63,9 @@ public class ShopBranchController { @OperationLog("分店管理-同步启用") public CzgResult dataSyncEnable(@RequestParam Long branchShopId) { shopBranchService.dataSyncEnable(branchShopId); - return CzgResult.success(); + CzgResult ret = CzgResult.success(); + ret.setMsg("启用成功,数据正在后台同步中..."); + return ret; } /** diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java index c74ed623d..309fe0173 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java @@ -125,4 +125,17 @@ public class ShopUser implements Serializable { @Column(onInsertValue = "now()", onUpdateValue = "now()") private LocalDateTime updateTime; + + /** + * 是否已经合并数据到主店 1-是 0-否 默认0 + */ + private Integer isMergedToHead; + /** + * 已经合并过来的用户信息,jsonArray格式,[{"id":1,"shopId":2,...},{"id":1,"shopId":2,...}] + */ + private String mergedUsers; + /** + * 适用门店id集合,逗号分隔,例如:0,1,2,3,...查询的时候 all_shop_ids like '%,1,%'; + */ + private String allShopIds; } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserSyncService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserSyncService.java new file mode 100644 index 000000000..d31330d63 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserSyncService.java @@ -0,0 +1,17 @@ +package com.czg.account.service; + +/** + * 店铺用户同步Service + * @author tankaikai + * @since 2025-04-08 10:17 + */ +public interface ShopUserSyncService { + + /** + * 同步合并主分店会员信息 + * + * @param headShopId 主店id + * @param branchShopId 分店id + */ + void syncMergeShopUser(Long headShopId, Long branchShopId); +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java index 0cf8af1e2..e283aa275 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java @@ -1,7 +1,5 @@ package com.czg.product.service; -import java.util.Map; - /** * @author ww * @description diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java index 856f782f0..ade8e03a4 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java @@ -1,5 +1,6 @@ package com.czg.service.account.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjUtil; import com.czg.account.dto.ShopBranchDTO; import com.czg.account.entity.ShopConfig; @@ -8,8 +9,11 @@ import com.czg.account.enums.BranchDataSyncMethodEnum; import com.czg.account.enums.ShopTypeEnum; import com.czg.account.param.ShopBranchParam; import com.czg.account.service.ShopBranchService; +import com.czg.account.service.ShopUserSyncService; +import com.czg.account.service.SyncNoticeService; import com.czg.enums.YesNoEnum; import com.czg.exception.CzgException; +import com.czg.product.service.ShopSyncService; import com.czg.sa.StpKit; import com.czg.service.account.mapper.ShopConfigMapper; import com.czg.service.account.mapper.ShopInfoMapper; @@ -34,9 +38,15 @@ public class ShopBranchServiceImpl implements ShopBranchService { @Resource private ShopConfigMapper shopConfigMapper; - @Resource private ShopInfoMapper shopInfoMapper; + @Resource + private ShopSyncService shopSyncService; + @Resource + private ShopUserSyncService shopUserSyncService; + @Resource + private SyncNoticeService syncNoticeService; + @Override public Page findPage(ShopBranchParam param) { @@ -98,7 +108,14 @@ public class ShopBranchServiceImpl implements ShopBranchService { branchConfig.setIsEnableConsSync(YesNoEnum.YES.value()); branchConfig.setIsEnableVipSync(YesNoEnum.YES.value()); shopConfigMapper.update(branchConfig); - // TODO 异步事务同步商品数据、会员数据、耗材数据 + ThreadUtil.execAsync(() -> { + // 同步商品和耗材 + shopSyncService.sync(shopId, branchShop.getId()); + }); + ThreadUtil.execAsync(() -> { + // 同步会员信息 + shopUserSyncService.syncMergeShopUser(shopId, branchShop.getId()); + }); } @Override diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java new file mode 100644 index 000000000..71d3e8170 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java @@ -0,0 +1,172 @@ +package com.czg.service.account.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.czg.account.entity.ShopUser; +import com.czg.account.service.ShopUserSyncService; +import com.czg.enums.YesNoEnum; +import com.czg.service.account.mapper.ShopUserMapper; +import com.mybatisflex.core.query.QueryWrapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 店铺用户同步Service实现类 + * + * @author tankaikai + * @since 2025-04-08 10:18 + */ +@Service +public class ShopUserSyncServiceImpl implements ShopUserSyncService { + + @Resource + private ShopUserMapper shopUserMapper; + + /** + * 同步合并主分店会员信息 + * + * @param headShopId 主店id + * @param branchShopId 分店id + */ + @Override + public synchronized void syncMergeShopUser(Long headShopId, Long branchShopId) { + // 合并前置逻辑:查询主店、分店手机号码不为空的会员信息,分店和主店手机号码进行匹配 + // 合并逻辑1:如果手机号码一致,则把分店会员信息中的 积分、余额、消费金额、消费次数合并到主店会员信息中,把分店这些信息清零,is_merged_to_head的意思是是否已经合并数据到主店 set is_merged_to_head = 1 + // 合并逻辑2:分店手机号码在主店中不存在,则在主店创建新的会员,把分店分店会员信息中的 积分、余额、消费金额、消费次数合并到主店会员信息中,把分店这些信息清零,set is_merged_to_head = 1 + // 合并逻辑3:主店没有分店有,把分店会员信息copy到主店,更改shop_id,all_shop_ids,把分店这些信息清零, 把分店会员信息jsonArray格式化存储至merged_users字段中,便于后续查询合并前会员信息,新增字段,适用门店id(用英文逗号隔开,如:0,1,2,3, 查询时用适用门店id like %,1,% and is_merged_to_head = 0) + // 合并逻辑4:当用户补充了手机号码或则修改了手机号码,则需要按照手机号码进行会员信息合并,把逻辑1,2,3重新执行一遍 + // 查询逻辑:在下单时选择会员信息时,查询时用适用门店id like %,1,% and is_merged_to_head = 0 + List headShopUserList = shopUserMapper.selectListByQuery(QueryWrapper.create().eq(ShopUser::getShopId, headShopId).isNotNull(ShopUser::getPhone)); + List branchShopUserList = shopUserMapper.selectListByQuery(QueryWrapper.create().eq(ShopUser::getShopId, branchShopId).isNotNull(ShopUser::getPhone)); + // 如果分店没有符合条件的会员,则不进行合并 + if (CollUtil.isEmpty(branchShopUserList)) { + return; + } + Map headShopUserKv = headShopUserList.stream().collect(Collectors.toMap(ShopUser::getPhone, shopUser -> shopUser)); + Map branchShopUserKv = branchShopUserList.stream().collect(Collectors.toMap(ShopUser::getPhone, shopUser -> shopUser)); + + Set headShopPhoneList = headShopUserList.stream().map(ShopUser::getPhone).collect(Collectors.toSet()); + Set branchShopPhoneList = branchShopUserList.stream().map(ShopUser::getPhone).collect(Collectors.toSet()); + + Set phoneSet = new HashSet<>(); + phoneSet.addAll(headShopPhoneList); + phoneSet.addAll(branchShopPhoneList); + + // 执行合并逻辑 + for (String phone : phoneSet) { + ShopUser headShopUser = headShopUserKv.get(phone); + ShopUser branchShopUser = branchShopUserKv.get(phone); + // 1.如果都有 + if (ObjUtil.isNotNull(headShopUser) && ObjUtil.isNotNull(branchShopUser)) { + toMergeCase1(headShopUser, branchShopUser); + // 2.如果主店有,分店没有 + } else if (ObjUtil.isNotNull(headShopUser) && ObjUtil.isNull(branchShopUser)) { + toMergeCase2(headShopUser, branchShopId); + // 3.如果主店没有,分店有 + } else if (ObjUtil.isNull(headShopUser) && ObjUtil.isNotNull(branchShopUser)) { + toMergeCase3(headShopId, branchShopUser); + } + } + } + + /** + * 合并会员信息 1.如果都有 + * + * @param headShopUser 主店会员 + * @param branchShopUser 分店会员 + */ + public void toMergeCase1(ShopUser headShopUser, ShopUser branchShopUser) { + headShopUser.setAccountPoints(NumberUtil.nullToZero(headShopUser.getAccountPoints()) + (NumberUtil.nullToZero(branchShopUser.getAccountPoints()))); + headShopUser.setAmount(NumberUtil.nullToZero(headShopUser.getAmount()).add(NumberUtil.nullToZero(branchShopUser.getAmount()))); + headShopUser.setConsumeCount(NumberUtil.nullToZero(headShopUser.getConsumeCount()) + (NumberUtil.nullToZero(branchShopUser.getConsumeCount()))); + headShopUser.setConsumeAmount(NumberUtil.nullToZero(headShopUser.getConsumeAmount()).add(NumberUtil.nullToZero(branchShopUser.getConsumeAmount()))); + headShopUser.setUpdateTime(LocalDateTime.now()); + String mergedUsers = StrUtil.emptyToDefault(headShopUser.getMergedUsers(), "[]"); + JSONArray objects = JSON.parseArray(mergedUsers); + objects.add(JSONObject.from(branchShopUser)); + headShopUser.setMergedUsers(JSON.toJSONString(objects)); + String allShopIds = StrUtil.emptyToDefault(headShopUser.getAllShopIds(), "0,".concat(headShopUser.getShopId() + ",")); + List split = StrUtil.split(allShopIds, ",", true, true); + String branchShopIdStr = Convert.toStr(branchShopUser.getShopId()); + if (!split.contains(branchShopIdStr)) { + split.add(branchShopIdStr); + } + headShopUser.setAllShopIds(CollUtil.join(split, ",").concat(",")); + shopUserMapper.update(headShopUser); + toZero(branchShopUser); + shopUserMapper.update(branchShopUser); + } + + /** + * 合并会员信息 2.如果主店有,分店没有 + * + * @param headShopUser 主店会员 + * @param branchShopId 分店id + */ + public void toMergeCase2(ShopUser headShopUser, Long branchShopId) { + headShopUser.setUpdateTime(LocalDateTime.now()); + String allShopIds = StrUtil.emptyToDefault(headShopUser.getAllShopIds(), "0,".concat(headShopUser.getShopId() + ",")); + List split = StrUtil.split(allShopIds, ",", true, true); + String branchShopIdStr = Convert.toStr(branchShopId); + if (!split.contains(branchShopIdStr)) { + split.add(branchShopIdStr); + } + headShopUser.setAllShopIds(CollUtil.join(split, ",").concat(",")); + shopUserMapper.update(headShopUser); + } + + /** + * 合并会员信息 3.如果主店没有,分店有 + * + * @param headShopId 主店id + * @param branchShopUser 分店会员信息 + */ + public void toMergeCase3(Long headShopId, ShopUser branchShopUser) { + ShopUser headShopUser = BeanUtil.copyProperties(branchShopUser, ShopUser.class, "id", "shopId","allShopIds"); + headShopUser.setShopId(headShopId); + String mergedUsers = StrUtil.emptyToDefault(headShopUser.getMergedUsers(), "[]"); + JSONArray objects = JSON.parseArray(mergedUsers); + objects.add(JSONObject.from(branchShopUser)); + headShopUser.setMergedUsers(JSON.toJSONString(objects)); + String allShopIds = StrUtil.emptyToDefault(headShopUser.getAllShopIds(), "0,".concat(headShopUser.getShopId() + ",")); + List split = StrUtil.split(allShopIds, ",", true, true); + String branchShopIdStr = Convert.toStr(branchShopUser.getShopId()); + if (!split.contains(branchShopIdStr)) { + split.add(branchShopIdStr); + } + headShopUser.setAllShopIds(CollUtil.join(split, ",").concat(",")); + shopUserMapper.insert(headShopUser); + toZero(branchShopUser); + shopUserMapper.update(branchShopUser); + } + + /** + * 会员数据归零 + * + * @param shopUser 会员信息 + */ + public void toZero(ShopUser shopUser) { + shopUser.setAccountPoints(0); + shopUser.setAmount(BigDecimal.ZERO); + shopUser.setConsumeAmount(BigDecimal.ZERO); + shopUser.setConsumeCount(0); + shopUser.setUpdateTime(LocalDateTime.now()); + shopUser.setIsMergedToHead(YesNoEnum.YES.value()); + } + +} diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index dfdbca7d4..07adc1685 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONObject; import com.czg.account.entity.ShopInfo; import com.czg.account.service.ShopInfoService; +import com.czg.account.service.ShopUserService; import com.czg.account.service.SyncNoticeService; import com.czg.exception.CzgException; import com.czg.product.entity.*; @@ -58,6 +59,8 @@ public class ShopSyncServiceImpl implements ShopSyncService { @Resource private ProdConsRelationService prodConsRelationService; @Resource + private ShopUserService shopUserService; + @Resource private SyncNoticeService syncNoticeService; private void checkShopInfo(Long sourceShopId, Long targetShopId) { @@ -73,7 +76,6 @@ public class ShopSyncServiceImpl implements ShopSyncService { || targetShop.getIsHeadShop() == null || targetShop.getIsHeadShop().equals(1)) { throw new CzgException("同步失败,目标店铺是主店铺或目标店铺是单店"); } - } @Override diff --git a/sqls/250403/tb_shop_user.sql b/sqls/250403/tb_shop_user.sql new file mode 100644 index 000000000..0fc562097 --- /dev/null +++ b/sqls/250403/tb_shop_user.sql @@ -0,0 +1,13 @@ +-- ---------------------------- +-- tb_shop_user表扩展字段 +-- ---------------------------- +ALTER TABLE `tb_shop_user` + ADD COLUMN `is_merged_to_head` tinyint NULL DEFAULT 0 COMMENT '是否已经合并数据到主店 1-是 0-否 默认0', + ADD COLUMN `merged_users` text NULL COMMENT '已经合并过来的用户信息,jsonArray格式,[{\"id\":1,\"shopId\":2,...},{\"id\":1,\"shopId\":2,...}]', + ADD COLUMN `all_shop_ids` varchar(1200) NULL COMMENT '适用门店id集合,逗号分隔,例如:0,1,2,3,...查询的时候 all_shop_ids like \'%,1,%\';'; + +-- ---------------------------- +-- 处理历史数据 +-- ---------------------------- +update tb_shop_user set is_merged_to_head = 0; +update tb_shop_user set all_shop_ids = concat('0,', shop_id, ','); \ No newline at end of file From 86fb4ccd3df0c614c6b5cdb5dab34f2f9df1be43 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 15:04:00 +0800 Subject: [PATCH 037/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/account/service/impl/ShopInfoServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index d01e1f8d0..dd268e5c5 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -243,7 +243,7 @@ public class ShopInfoServiceImpl extends ServiceImpl i public Boolean edit(ShopInfoEditDTO shopInfoEditDTO) { ShopInfo shopInfo; if (!StpKit.USER.isAdmin()) { - shopInfo = queryChain().eq(ShopInfo::getId, StpKit.USER.getLoginIdAsLong()).one(); + shopInfo = queryChain().eq(ShopInfo::getId, shopInfoEditDTO.getId()).one(); } else { shopInfo = getById(StpKit.USER.getLoginIdAsLong()); } From 360477acae21a976a7ab36f4ae0adb46982c98a4 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 15:14:41 +0800 Subject: [PATCH 038/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/account/service/impl/ShopBranchServiceImpl.java | 6 ++---- .../service/product/service/impl/ShopSyncServiceImpl.java | 2 ++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java index ade8e03a4..26d3a52ac 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java @@ -10,7 +10,6 @@ import com.czg.account.enums.ShopTypeEnum; import com.czg.account.param.ShopBranchParam; import com.czg.account.service.ShopBranchService; import com.czg.account.service.ShopUserSyncService; -import com.czg.account.service.SyncNoticeService; import com.czg.enums.YesNoEnum; import com.czg.exception.CzgException; import com.czg.product.service.ShopSyncService; @@ -23,6 +22,7 @@ import com.github.pagehelper.PageInfo; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import jakarta.annotation.Resource; +import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.stereotype.Service; import java.util.List; @@ -42,10 +42,8 @@ public class ShopBranchServiceImpl implements ShopBranchService { private ShopInfoMapper shopInfoMapper; @Resource private ShopSyncService shopSyncService; - @Resource + @DubboReference private ShopUserSyncService shopUserSyncService; - @Resource - private SyncNoticeService syncNoticeService; @Override diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 07adc1685..13027b497 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -16,6 +16,7 @@ import com.czg.product.vo.ProductGroupVo; import com.czg.utils.AssertUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -35,6 +36,7 @@ import static com.mybatisflex.core.query.QueryMethods.column; */ @Slf4j @Service +@DubboService public class ShopSyncServiceImpl implements ShopSyncService { @Resource private ShopInfoService shopInfoService; From 54b5b168bbbb6b1968c347a55e321ef515697524 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 15:18:37 +0800 Subject: [PATCH 039/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/account/service/impl/ShopBranchServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java index 26d3a52ac..c67799392 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java @@ -40,9 +40,9 @@ public class ShopBranchServiceImpl implements ShopBranchService { private ShopConfigMapper shopConfigMapper; @Resource private ShopInfoMapper shopInfoMapper; - @Resource - private ShopSyncService shopSyncService; @DubboReference + private ShopSyncService shopSyncService; + @Resource private ShopUserSyncService shopUserSyncService; From a40ad92399b92d0bbbf8c2b2f24b704a54734845 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 15:23:08 +0800 Subject: [PATCH 040/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/ShopConfigMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml index 875c7f624..1762e8540 100644 --- a/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml +++ b/cash-service/account-service/src/main/resources/mapper/ShopConfigMapper.xml @@ -13,8 +13,8 @@ left join tb_shop_info t2 on t1.id = t2.id left join sys_user t3 on t1.id = t3.id where t1.main_id = #{shopId} - - and t2.shop_name like concat('%', #{branchName}, '%') + + and t2.shop_name like concat('%', #{branchShopName}, '%') \ No newline at end of file From 50561fe2e57aec87d3807778dbc0b92873128dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 15:39:15 +0800 Subject: [PATCH 041/162] =?UTF-8?q?=E6=B6=88=E6=81=AF=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/product/service/impl/ShopSyncServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 13027b497..65ea14b2a 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -16,6 +16,7 @@ import com.czg.product.vo.ProductGroupVo; import com.czg.utils.AssertUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; @@ -38,7 +39,7 @@ import static com.mybatisflex.core.query.QueryMethods.column; @Service @DubboService public class ShopSyncServiceImpl implements ShopSyncService { - @Resource + @DubboReference private ShopInfoService shopInfoService; @Resource private ShopProdUnitService unitService; From b2994e58a1ce542872207bc5885740ec48017583 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 16:22:16 +0800 Subject: [PATCH 042/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/controller/admin/ShopInfoController.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java index 560ad492d..685ed5a21 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java @@ -6,6 +6,7 @@ import com.czg.account.dto.shopinfo.ShopDetailDTO; import com.czg.account.dto.shopinfo.ShopInfoAddDTO; import com.czg.account.dto.shopinfo.ShopInfoEditDTO; import com.czg.account.entity.ShopInfo; +import com.czg.account.service.AuthorizationService; import com.czg.account.service.ShopInfoService; import com.czg.annotation.SaAdminCheckPermission; import com.czg.annotation.SaAdminCheckRole; @@ -13,6 +14,7 @@ import com.czg.resp.CzgResult; import com.czg.sa.StpKit; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; +import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -27,6 +29,8 @@ import java.util.List; @RequestMapping("/admin/shopInfo") public class ShopInfoController { private final ShopInfoService shopInfoService; + @Resource + private AuthorizationService authorizationService; public ShopInfoController(ShopInfoService shopInfoService) { this.shopInfoService = shopInfoService; @@ -98,4 +102,14 @@ public class ShopInfoController { return CzgResult.success(data); } + /** + * 切换店铺 + * @param shopId 店铺ID + */ + @PostMapping("/change/{shopId}") + public CzgResult change(@PathVariable Long shopId) { + authorizationService.switchTo(shopId); + return CzgResult.success(); + } + } From fc51797e2d926df6777239e6f4af722d573e130e Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 16:44:48 +0800 Subject: [PATCH 043/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/service/impl/ShopBranchServiceImpl.java | 6 +++--- .../service/account/service/impl/ShopInfoServiceImpl.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java index c67799392..fa83b3c90 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopBranchServiceImpl.java @@ -89,7 +89,7 @@ public class ShopBranchServiceImpl implements ShopBranchService { throw new CzgException("主店铺配置信息不存在"); } if (ShopTypeEnum.ONLY.getValue().equals(shopInfo.getShopType())) { - throw new CzgException("数据错误:主单店铺类型为单店"); + throw new CzgException("数据错误:主店铺类型为单店"); } if (ObjUtil.defaultIfNull(shopInfo.getIsHeadShop(), 0) == YesNoEnum.NO.value()) { throw new CzgException("数据错误:当前店铺不是主店"); @@ -128,7 +128,7 @@ public class ShopBranchServiceImpl implements ShopBranchService { throw new CzgException("主店铺配置信息不存在"); } if (ShopTypeEnum.ONLY.getValue().equals(shopInfo.getShopType())) { - throw new CzgException("数据错误:主单店铺类型为单店"); + throw new CzgException("数据错误:主店铺类型为单店"); } if (ObjUtil.defaultIfNull(shopInfo.getIsHeadShop(), 0) == YesNoEnum.NO.value()) { throw new CzgException("数据错误:当前店铺不是主店"); @@ -157,7 +157,7 @@ public class ShopBranchServiceImpl implements ShopBranchService { throw new CzgException("主店铺配置信息不存在"); } if (ShopTypeEnum.ONLY.getValue().equals(shopInfo.getShopType())) { - throw new CzgException("数据错误:主单店铺类型为单店"); + throw new CzgException("数据错误:主店铺类型为单店"); } if (ObjUtil.defaultIfNull(shopInfo.getIsHeadShop(), 0) == YesNoEnum.NO.value()) { throw new CzgException("数据错误:当前店铺不是主店"); diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index dd268e5c5..64893aeed 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -243,9 +243,9 @@ public class ShopInfoServiceImpl extends ServiceImpl i public Boolean edit(ShopInfoEditDTO shopInfoEditDTO) { ShopInfo shopInfo; if (!StpKit.USER.isAdmin()) { - shopInfo = queryChain().eq(ShopInfo::getId, shopInfoEditDTO.getId()).one(); + shopInfo = queryChain().eq(ShopInfo::getId, StpKit.USER.getLoginIdAsLong()).one(); } else { - shopInfo = getById(StpKit.USER.getLoginIdAsLong()); + shopInfo = getById(shopInfoEditDTO.getId()); } if (shopInfo == null) { throw new CzgException("店铺不存在"); @@ -260,8 +260,8 @@ public class ShopInfoServiceImpl extends ServiceImpl i if (!isHeadShop.equals(shopInfoEditDTO.getIsHeadShop())) { throw new CzgException("禁止修改是否主店"); } - if (!mainId.equals(shopInfoEditDTO.getMainId())) { - throw new CzgException("禁止从新选择店铺设为主店"); + if (mainId != null && !mainId.equals(shopInfoEditDTO.getMainId())) { + throw new CzgException("禁止重新选择店铺设为主店"); } if (shopInfoEditDTO.getActivateCode() != null) { activateShop(shopInfo, shopInfoEditDTO.getActivateCode()); From 3e874211d7051c0101fd671c73ac93055dfe3e07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 17:31:08 +0800 Subject: [PATCH 044/162] =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/account/service/impl/AuthorizationServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java index 156a54756..4cc0a1779 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java @@ -193,7 +193,7 @@ public class AuthorizationServiceImpl implements AuthorizationService { throw new ApiNotPrintException("店铺信息不存在"); } - if (!shopInfo.getMainId().equals(headId)) { + if ((headId != null && !shopInfo.getMainId().equals(headId)) || !shopInfo.getMainId().equals(shopId)) { throw new ApiNotPrintException("目标店铺非登录账号所有"); } From b8db432134ad5111a4057b396aa10b30d1fa7651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 18:04:20 +0800 Subject: [PATCH 045/162] =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/sa/MyStpLogic.java | 8 ++++++-- .../account/service/impl/AuthorizationServiceImpl.java | 5 ++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java b/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java index a566421cd..49c13533a 100644 --- a/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java +++ b/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java @@ -67,15 +67,19 @@ public class MyStpLogic { public void switchTo(Long id, String account, Long shopId, String shopName, LoginType loginType, boolean isAdmin) { StpLogic logic = getLogic(); long headId = logic.getLoginIdAsLong(); + + logic.getSaTokenDao().set(splicingKeyTokenValue(logic.getTokenValue()), id.toString(), logic.getTokenTimeout()); SaSession session = logic.getSession(); + if (session == null) { + logic.createLoginSession(id); + session = logic.getSession(); + } Object parentId1 = session.get("headId"); if (parentId1 == null) { session.set("headId", headId); } session.set("userId", id).set("isAdmin", isAdmin).set("isManager", loginType.equals(LoginType.MANAGER)) .set("loginType", loginType).set("account", account).set("shopId", shopId).set("shopName", shopName); - - logic.getSaTokenDao().set(splicingKeyTokenValue(logic.getTokenValue()), id.toString(), logic.getTokenTimeout()); } /** diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java index 4cc0a1779..683345ecb 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java @@ -193,7 +193,10 @@ public class AuthorizationServiceImpl implements AuthorizationService { throw new ApiNotPrintException("店铺信息不存在"); } - if ((headId != null && !shopInfo.getMainId().equals(headId)) || !shopInfo.getMainId().equals(shopId)) { + + // 主店铺切换子店铺 + if ((headId == null && !shopInfo.getMainId().equals(shopId)) || (!sysUser.getId().equals(headId) && shopInfo.getMainId() == null) || + (headId != null && !sysUserId.equals(headId) && !shopInfo.getMainId().equals(headId))) { throw new ApiNotPrintException("目标店铺非登录账号所有"); } From 5b58c59e95491dc2e1f040cdec462c4cb98500ce Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 18:08:58 +0800 Subject: [PATCH 046/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/controller/admin/ShopInfoController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java index 685ed5a21..3175b141f 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java @@ -98,12 +98,14 @@ public class ShopInfoController { @GetMapping("branchList") public CzgResult> findShopBranch() { Long shopId = StpKit.USER.getShopId(0L); - List data = shopInfoService.findShopBranch(shopId); + Long headId = StpKit.USER.getHeadId(); + List data = shopInfoService.findShopBranch(headId != null ? headId : shopId); return CzgResult.success(data); } /** * 切换店铺 + * * @param shopId 店铺ID */ @PostMapping("/change/{shopId}") From 051e3b5827b5ddad18f4420df33624189ec822be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 18:11:15 +0800 Subject: [PATCH 047/162] =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/account/service/impl/AuthorizationServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java index 683345ecb..012395a0d 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java @@ -209,7 +209,7 @@ public class AuthorizationServiceImpl implements AuthorizationService { StpKit.USER.addRoleList(roleNames); // 权限赋予 List promissionList = sysMenuMapper.selectByUserId(sysUser.getId(), null).stream().map(SysMenu::getPermission).filter(StrUtil::isNotBlank).toList(); - StpKit.USER.switchTo(sysUser.getId(), sysUser.getAccount(), shopInfo.getId(), shopInfo.getShopName(), MyStpLogic.LoginType.MANAGER, sysUser.getIsAdmin()); + StpKit.USER.switchTo(sysUser.getId().equals(headId), sysUser.getId(), sysUser.getAccount(), shopInfo.getId(), shopInfo.getShopName(), MyStpLogic.LoginType.MANAGER, sysUser.getIsAdmin()); StpKit.USER.addPermissionList(promissionList); StpKit.USER.addRoleList(roleNames); } From a6377a05f0ba7de09f20dca0629bf265256bd3b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 18:15:08 +0800 Subject: [PATCH 048/162] =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/sa/MyStpLogic.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java b/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java index 49c13533a..7da6cfaa3 100644 --- a/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java +++ b/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java @@ -64,7 +64,7 @@ public class MyStpLogic { * @param loginType 登录类型 * @param isAdmin 是否管理员 */ - public void switchTo(Long id, String account, Long shopId, String shopName, LoginType loginType, boolean isAdmin) { + public void switchTo(boolean isMain, Long id, String account, Long shopId, String shopName, LoginType loginType, boolean isAdmin) { StpLogic logic = getLogic(); long headId = logic.getLoginIdAsLong(); @@ -75,7 +75,7 @@ public class MyStpLogic { session = logic.getSession(); } Object parentId1 = session.get("headId"); - if (parentId1 == null) { + if (!isMain && parentId1 == null) { session.set("headId", headId); } session.set("userId", id).set("isAdmin", isAdmin).set("isManager", loginType.equals(LoginType.MANAGER)) From be566206ace25814b407c4042473f8f90e0ea841 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 18:30:39 +0800 Subject: [PATCH 049/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/controller/admin/ShopInfoController.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java index 3175b141f..364abd9c8 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java @@ -1,5 +1,7 @@ package com.czg.controller.admin; +import cn.dev33.satoken.session.TokenSign; +import cn.hutool.core.collection.CollUtil; import com.czg.account.dto.PageDTO; import com.czg.account.dto.shopinfo.ShopBranchSelectDTO; import com.czg.account.dto.shopinfo.ShopDetailDTO; @@ -99,7 +101,8 @@ public class ShopInfoController { public CzgResult> findShopBranch() { Long shopId = StpKit.USER.getShopId(0L); Long headId = StpKit.USER.getHeadId(); - List data = shopInfoService.findShopBranch(headId != null ? headId : shopId); + List tokenSignList = StpKit.USER.getSession().getTokenSignList(); + List data = shopInfoService.findShopBranch((headId != null&& CollUtil.isEmpty(tokenSignList)) ? headId : shopId); return CzgResult.success(data); } From cf7edfe5dacb332ed5d60be8d99de46be40952c2 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Tue, 8 Apr 2025 18:30:51 +0800 Subject: [PATCH 050/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/czg/controller/admin/ShopInfoController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java index 364abd9c8..e2039dbc2 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java @@ -102,7 +102,7 @@ public class ShopInfoController { Long shopId = StpKit.USER.getShopId(0L); Long headId = StpKit.USER.getHeadId(); List tokenSignList = StpKit.USER.getSession().getTokenSignList(); - List data = shopInfoService.findShopBranch((headId != null&& CollUtil.isEmpty(tokenSignList)) ? headId : shopId); + List data = shopInfoService.findShopBranch((headId != null && CollUtil.isEmpty(tokenSignList)) ? headId : shopId); return CzgResult.success(data); } From fb5f44a20d7620d3862d739df360e0ef6ddc0a0a Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 9 Apr 2025 10:09:36 +0800 Subject: [PATCH 051/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/controller/admin/ShopInfoController.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java index e2039dbc2..1da42302e 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopInfoController.java @@ -100,9 +100,18 @@ public class ShopInfoController { @GetMapping("branchList") public CzgResult> findShopBranch() { Long shopId = StpKit.USER.getShopId(0L); + String tokenValue = StpKit.USER.getTokenInfo().getTokenValue(); Long headId = StpKit.USER.getHeadId(); List tokenSignList = StpKit.USER.getSession().getTokenSignList(); - List data = shopInfoService.findShopBranch((headId != null && CollUtil.isEmpty(tokenSignList)) ? headId : shopId); + if (headId != null && CollUtil.isEmpty(tokenSignList)) { + shopId = headId; + } else { + long count = tokenSignList.stream().filter(obj -> tokenValue.equals(obj.getValue())).count(); + if (headId != null && count == 0) { + shopId = headId; + } + } + List data = shopInfoService.findShopBranch(shopId); return CzgResult.success(data); } From 88d54c17f69f8973d558d03fd95637dc9d3b5bd6 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 9 Apr 2025 11:04:02 +0800 Subject: [PATCH 052/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/account/service/impl/ShopInfoServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index 64893aeed..fd2550604 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -255,13 +255,13 @@ public class ShopInfoServiceImpl extends ServiceImpl i Integer isHeadShop = shopInfo.getIsHeadShop(); // 禁止加盟店/连锁店修改为单店 if (!shopType.equals(shopInfoEditDTO.getShopType())) { - throw new CzgException("禁止修改店铺类型"); + shopInfoEditDTO.setShopType(shopType); } if (!isHeadShop.equals(shopInfoEditDTO.getIsHeadShop())) { - throw new CzgException("禁止修改是否主店"); + shopInfoEditDTO.setIsHeadShop(isHeadShop); } if (mainId != null && !mainId.equals(shopInfoEditDTO.getMainId())) { - throw new CzgException("禁止重新选择店铺设为主店"); + shopInfoEditDTO.setMainId(mainId); } if (shopInfoEditDTO.getActivateCode() != null) { activateShop(shopInfo, shopInfoEditDTO.getActivateCode()); From 26e87dc7bb5f3dbf243002be1c68a004c880e5ec Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 9 Apr 2025 11:25:13 +0800 Subject: [PATCH 053/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/account/service/impl/ShopInfoServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index fd2550604..bd6748a2e 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -266,7 +266,7 @@ public class ShopInfoServiceImpl extends ServiceImpl i if (shopInfoEditDTO.getActivateCode() != null) { activateShop(shopInfo, shopInfoEditDTO.getActivateCode()); } - + BeanUtil.copyProperties(shopInfoEditDTO, shopInfo); if (shopInfoEditDTO.getOperationPwd() != null) { String key = "%s%s:%s".formatted(RedisCst.SMS_CODE, shopInfo.getPhone(), "editShopInfoOpePwd"); Object val = redisService.get(key); From 3a5f65e8ec3264a52ffd2350dd8d775a0f2903d8 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 9 Apr 2025 15:05:08 +0800 Subject: [PATCH 054/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/account/service/impl/ShopInfoServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index bd6748a2e..873200461 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -113,6 +113,9 @@ public class ShopInfoServiceImpl extends ServiceImpl i if (status != null) { queryWrapper.eq(ShopInfo::getStatus, status); } + if (isHeadShop != null) { + queryWrapper.eq(ShopInfo::getIsHeadShop, isHeadShop); + } List shopAllList = getMapper().selectListByQuery(query().select(ShopInfo::getId, ShopInfo::getShopName)); Map shopKv = shopAllList.stream().collect(Collectors.toMap(ShopInfo::getId, ShopInfo::getShopName)); queryWrapper.orderBy(ShopInfo::getCreateTime, false); From ca8d49bac72888d81f5b62374ea642779a95f56d Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 9 Apr 2025 15:32:25 +0800 Subject: [PATCH 055/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/account/entity/ShopUser.java | 9 -- .../service/impl/ShopUserSyncServiceImpl.java | 87 +++++++------------ sqls/250403/tb_shop_user.sql | 10 +-- 3 files changed, 32 insertions(+), 74 deletions(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java index 309fe0173..1ca16bc44 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java @@ -125,17 +125,8 @@ public class ShopUser implements Serializable { @Column(onInsertValue = "now()", onUpdateValue = "now()") private LocalDateTime updateTime; - - /** - * 是否已经合并数据到主店 1-是 0-否 默认0 - */ - private Integer isMergedToHead; /** * 已经合并过来的用户信息,jsonArray格式,[{"id":1,"shopId":2,...},{"id":1,"shopId":2,...}] */ private String mergedUsers; - /** - * 适用门店id集合,逗号分隔,例如:0,1,2,3,...查询的时候 all_shop_ids like '%,1,%'; - */ - private String allShopIds; } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java index 71d3e8170..be2383a37 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java @@ -1,23 +1,20 @@ package com.czg.service.account.service.impl; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.JSONWriter; import com.czg.account.entity.ShopUser; import com.czg.account.service.ShopUserSyncService; -import com.czg.enums.YesNoEnum; import com.czg.service.account.mapper.ShopUserMapper; import com.mybatisflex.core.query.QueryWrapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; -import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.HashSet; import java.util.List; @@ -46,11 +43,27 @@ public class ShopUserSyncServiceImpl implements ShopUserSyncService { @Override public synchronized void syncMergeShopUser(Long headShopId, Long branchShopId) { // 合并前置逻辑:查询主店、分店手机号码不为空的会员信息,分店和主店手机号码进行匹配 - // 合并逻辑1:如果手机号码一致,则把分店会员信息中的 积分、余额、消费金额、消费次数合并到主店会员信息中,把分店这些信息清零,is_merged_to_head的意思是是否已经合并数据到主店 set is_merged_to_head = 1 - // 合并逻辑2:分店手机号码在主店中不存在,则在主店创建新的会员,把分店分店会员信息中的 积分、余额、消费金额、消费次数合并到主店会员信息中,把分店这些信息清零,set is_merged_to_head = 1 - // 合并逻辑3:主店没有分店有,把分店会员信息copy到主店,更改shop_id,all_shop_ids,把分店这些信息清零, 把分店会员信息jsonArray格式化存储至merged_users字段中,便于后续查询合并前会员信息,新增字段,适用门店id(用英文逗号隔开,如:0,1,2,3, 查询时用适用门店id like %,1,% and is_merged_to_head = 0) + // 合并逻辑0:分店没有绑定手机号的会员,把shop_id改为主店shop_id,把分店会员信息jsonArray格式化存储至主店用户信息的merged_users字段中 + // 合并逻辑1:(主店、分店一致)如果手机号码一致,则把分店会员信息中的 积分、余额、消费金额、消费次数合并到主店会员信息中,把分店会员信息jsonArray格式化存储至主店用户信息的merged_users字段中,再把分店用户信息删除 + // 合并逻辑2:(主店有、分店没有)不用采取任何操作,使用主店的会员信息 + // 合并逻辑3:(主店没有、分店有)把shop_id改为主店shop_id,把分店会员信息jsonArray格式化存储至merged_users字段中 // 合并逻辑4:当用户补充了手机号码或则修改了手机号码,则需要按照手机号码进行会员信息合并,把逻辑1,2,3重新执行一遍 // 查询逻辑:在下单时选择会员信息时,查询时用适用门店id like %,1,% and is_merged_to_head = 0 + List branchShopNotPhoneUserList = shopUserMapper.selectListByQuery(QueryWrapper.create().eq(ShopUser::getShopId, branchShopId) + .and(q -> { + q.isNull(ShopUser::getPhone).or(q1 -> { + q1.eq(ShopUser::getPhone, ""); + }); + })); + // 分店没有绑定手机号的会员 + for (ShopUser shopUser : branchShopNotPhoneUserList) { + JSONObject branch = JSONObject.from(shopUser, JSONWriter.Feature.WriteMapNullValue); + JSONArray objects = new JSONArray(); + objects.add(branch); + shopUser.setShopId(headShopId); + shopUser.setMergedUsers(objects.toJSONString(JSONWriter.Feature.WriteMapNullValue)); + shopUserMapper.update(shopUser); + } List headShopUserList = shopUserMapper.selectListByQuery(QueryWrapper.create().eq(ShopUser::getShopId, headShopId).isNotNull(ShopUser::getPhone)); List branchShopUserList = shopUserMapper.selectListByQuery(QueryWrapper.create().eq(ShopUser::getShopId, branchShopId).isNotNull(ShopUser::getPhone)); // 如果分店没有符合条件的会员,则不进行合并 @@ -91,6 +104,7 @@ public class ShopUserSyncServiceImpl implements ShopUserSyncService { * @param branchShopUser 分店会员 */ public void toMergeCase1(ShopUser headShopUser, ShopUser branchShopUser) { + // 合并逻辑1:(主店、分店一致)如果手机号码一致,则把分店会员信息中的 积分、余额、消费金额、消费次数合并到主店会员信息中,把分店会员信息jsonArray格式化存储至主店用户信息的merged_users字段中,再把分店用户信息删除 headShopUser.setAccountPoints(NumberUtil.nullToZero(headShopUser.getAccountPoints()) + (NumberUtil.nullToZero(branchShopUser.getAccountPoints()))); headShopUser.setAmount(NumberUtil.nullToZero(headShopUser.getAmount()).add(NumberUtil.nullToZero(branchShopUser.getAmount()))); headShopUser.setConsumeCount(NumberUtil.nullToZero(headShopUser.getConsumeCount()) + (NumberUtil.nullToZero(branchShopUser.getConsumeCount()))); @@ -98,18 +112,10 @@ public class ShopUserSyncServiceImpl implements ShopUserSyncService { headShopUser.setUpdateTime(LocalDateTime.now()); String mergedUsers = StrUtil.emptyToDefault(headShopUser.getMergedUsers(), "[]"); JSONArray objects = JSON.parseArray(mergedUsers); - objects.add(JSONObject.from(branchShopUser)); - headShopUser.setMergedUsers(JSON.toJSONString(objects)); - String allShopIds = StrUtil.emptyToDefault(headShopUser.getAllShopIds(), "0,".concat(headShopUser.getShopId() + ",")); - List split = StrUtil.split(allShopIds, ",", true, true); - String branchShopIdStr = Convert.toStr(branchShopUser.getShopId()); - if (!split.contains(branchShopIdStr)) { - split.add(branchShopIdStr); - } - headShopUser.setAllShopIds(CollUtil.join(split, ",").concat(",")); + objects.add(JSONObject.from(branchShopUser, JSONWriter.Feature.WriteMapNullValue)); + headShopUser.setMergedUsers(JSON.toJSONString(objects, JSONWriter.Feature.WriteMapNullValue)); shopUserMapper.update(headShopUser); - toZero(branchShopUser); - shopUserMapper.update(branchShopUser); + shopUserMapper.delete(branchShopUser); } /** @@ -119,15 +125,7 @@ public class ShopUserSyncServiceImpl implements ShopUserSyncService { * @param branchShopId 分店id */ public void toMergeCase2(ShopUser headShopUser, Long branchShopId) { - headShopUser.setUpdateTime(LocalDateTime.now()); - String allShopIds = StrUtil.emptyToDefault(headShopUser.getAllShopIds(), "0,".concat(headShopUser.getShopId() + ",")); - List split = StrUtil.split(allShopIds, ",", true, true); - String branchShopIdStr = Convert.toStr(branchShopId); - if (!split.contains(branchShopIdStr)) { - split.add(branchShopIdStr); - } - headShopUser.setAllShopIds(CollUtil.join(split, ",").concat(",")); - shopUserMapper.update(headShopUser); + // 合并逻辑2:(主店有、分店没有)不用采取任何操作,使用主店的会员信息 } /** @@ -137,36 +135,13 @@ public class ShopUserSyncServiceImpl implements ShopUserSyncService { * @param branchShopUser 分店会员信息 */ public void toMergeCase3(Long headShopId, ShopUser branchShopUser) { - ShopUser headShopUser = BeanUtil.copyProperties(branchShopUser, ShopUser.class, "id", "shopId","allShopIds"); - headShopUser.setShopId(headShopId); - String mergedUsers = StrUtil.emptyToDefault(headShopUser.getMergedUsers(), "[]"); - JSONArray objects = JSON.parseArray(mergedUsers); - objects.add(JSONObject.from(branchShopUser)); - headShopUser.setMergedUsers(JSON.toJSONString(objects)); - String allShopIds = StrUtil.emptyToDefault(headShopUser.getAllShopIds(), "0,".concat(headShopUser.getShopId() + ",")); - List split = StrUtil.split(allShopIds, ",", true, true); - String branchShopIdStr = Convert.toStr(branchShopUser.getShopId()); - if (!split.contains(branchShopIdStr)) { - split.add(branchShopIdStr); - } - headShopUser.setAllShopIds(CollUtil.join(split, ",").concat(",")); - shopUserMapper.insert(headShopUser); - toZero(branchShopUser); + // 合并逻辑3:(主店没有、分店有)把shop_id改为主店shop_id,把分店会员信息jsonArray格式化存储至merged_users字段中 + JSONObject branch = JSONObject.from(branchShopUser, JSONWriter.Feature.WriteMapNullValue); + JSONArray objects = new JSONArray(); + objects.add(branch); + branchShopUser.setShopId(headShopId); + branchShopUser.setMergedUsers(objects.toJSONString(JSONWriter.Feature.WriteMapNullValue)); shopUserMapper.update(branchShopUser); } - /** - * 会员数据归零 - * - * @param shopUser 会员信息 - */ - public void toZero(ShopUser shopUser) { - shopUser.setAccountPoints(0); - shopUser.setAmount(BigDecimal.ZERO); - shopUser.setConsumeAmount(BigDecimal.ZERO); - shopUser.setConsumeCount(0); - shopUser.setUpdateTime(LocalDateTime.now()); - shopUser.setIsMergedToHead(YesNoEnum.YES.value()); - } - } diff --git a/sqls/250403/tb_shop_user.sql b/sqls/250403/tb_shop_user.sql index 0fc562097..ec6e03ae5 100644 --- a/sqls/250403/tb_shop_user.sql +++ b/sqls/250403/tb_shop_user.sql @@ -2,12 +2,4 @@ -- tb_shop_user表扩展字段 -- ---------------------------- ALTER TABLE `tb_shop_user` - ADD COLUMN `is_merged_to_head` tinyint NULL DEFAULT 0 COMMENT '是否已经合并数据到主店 1-是 0-否 默认0', - ADD COLUMN `merged_users` text NULL COMMENT '已经合并过来的用户信息,jsonArray格式,[{\"id\":1,\"shopId\":2,...},{\"id\":1,\"shopId\":2,...}]', - ADD COLUMN `all_shop_ids` varchar(1200) NULL COMMENT '适用门店id集合,逗号分隔,例如:0,1,2,3,...查询的时候 all_shop_ids like \'%,1,%\';'; - --- ---------------------------- --- 处理历史数据 --- ---------------------------- -update tb_shop_user set is_merged_to_head = 0; -update tb_shop_user set all_shop_ids = concat('0,', shop_id, ','); \ No newline at end of file + ADD COLUMN `merged_users` text NULL COMMENT '已经合并过来的用户信息,jsonArray格式,[{\"id\":1,\"shopId\":2,...},{\"id\":1,\"shopId\":2,...}]'; \ No newline at end of file From aa884dbab8bec2e2d4951d8a09081b11854c1edc Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 9 Apr 2025 15:55:56 +0800 Subject: [PATCH 056/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/account/service/impl/ShopUserSyncServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java index be2383a37..2f8dac7f6 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserSyncServiceImpl.java @@ -48,7 +48,6 @@ public class ShopUserSyncServiceImpl implements ShopUserSyncService { // 合并逻辑2:(主店有、分店没有)不用采取任何操作,使用主店的会员信息 // 合并逻辑3:(主店没有、分店有)把shop_id改为主店shop_id,把分店会员信息jsonArray格式化存储至merged_users字段中 // 合并逻辑4:当用户补充了手机号码或则修改了手机号码,则需要按照手机号码进行会员信息合并,把逻辑1,2,3重新执行一遍 - // 查询逻辑:在下单时选择会员信息时,查询时用适用门店id like %,1,% and is_merged_to_head = 0 List branchShopNotPhoneUserList = shopUserMapper.selectListByQuery(QueryWrapper.create().eq(ShopUser::getShopId, branchShopId) .and(q -> { q.isNull(ShopUser::getPhone).or(q1 -> { From 80537e4bcdde2634a8ce241cd21b52fd27ee5298 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 9 Apr 2025 16:11:20 +0800 Subject: [PATCH 057/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ShopInfoServiceImpl.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index 873200461..1f84b9adf 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -256,15 +256,24 @@ public class ShopInfoServiceImpl extends ServiceImpl i String shopType = shopInfo.getShopType(); Long mainId = shopInfo.getMainId(); Integer isHeadShop = shopInfo.getIsHeadShop(); - // 禁止加盟店/连锁店修改为单店 - if (!shopType.equals(shopInfoEditDTO.getShopType())) { - shopInfoEditDTO.setShopType(shopType); - } - if (!isHeadShop.equals(shopInfoEditDTO.getIsHeadShop())) { - shopInfoEditDTO.setIsHeadShop(isHeadShop); - } - if (mainId != null && !mainId.equals(shopInfoEditDTO.getMainId())) { - shopInfoEditDTO.setMainId(mainId); + // 原来是单店,现在不是单店,那么就允许修改,否则不允许修改 + if (ShopTypeEnum.ONLY.equals(shopType) && !ShopTypeEnum.ONLY.getValue().equals(shopInfoEditDTO.getShopType())) { + if (shopInfoEditDTO.getIsHeadShop() == null) { + throw new CzgException("加盟店/连锁店请选择是否主店"); + } + if (shopInfoEditDTO.getIsHeadShop() == YesNoEnum.NO.value() && shopInfoEditDTO.getMainId() == null) { + throw new CzgException("请选择一个店铺做为主店"); + } + if (shopInfoEditDTO.getIsHeadShop() == YesNoEnum.YES.value()) { + if (mainId != null) { + throw new CzgException("数据错误:当前店铺是非主店,不允许随意切换为主店"); + } + } + if (isHeadShop == YesNoEnum.YES.value() && shopInfoEditDTO.getIsHeadShop() == YesNoEnum.NO.value()) { + throw new CzgException("数据错误:当前店铺是主店,不允许随意切换为非主店"); + } + } else { + throw new CzgException("禁止连锁店/加盟店修改为单店"); } if (shopInfoEditDTO.getActivateCode() != null) { activateShop(shopInfo, shopInfoEditDTO.getActivateCode()); From 5c067566781b1f8ee0b26627e4a5064a84e123e9 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 9 Apr 2025 16:24:07 +0800 Subject: [PATCH 058/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/DataSummaryController.java | 24 +++++++++++++------ .../admin/SaleSummaryController.java | 12 +++++++--- .../admin/TableSummaryController.java | 8 +++++-- .../param/DataSummaryProductSaleParam.java | 1 - .../order/param/DataSummaryTradeParam.java | 2 -- .../order/param/SaleSummaryCountParam.java | 2 -- .../czg/order/param/TableSummaryParam.java | 2 -- 7 files changed, 32 insertions(+), 19 deletions(-) diff --git a/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java b/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java index 7b759b8aa..52eee05bc 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java @@ -44,7 +44,9 @@ public class DataSummaryController { public CzgResult getTradeData(DataSummaryTradeParam param) { ValidatorUtil.validateEntity(param, DefaultGroup.class); Long shopId = StpKit.USER.getShopId(0L); - param.setShopId(shopId); + if (param.getShopId() == null) { + param.setShopId(shopId); + } ShopOrderStatistic data = dataSummaryService.getTradeData(param); return CzgResult.success(data); } @@ -59,7 +61,9 @@ public class DataSummaryController { public CzgResult> getProductSaleData(DataSummaryProductSaleParam param) { ValidatorUtil.validateEntity(param, DefaultGroup.class); Long shopId = StpKit.USER.getShopId(0L); - param.setShopId(shopId); + if (param.getShopId() == null) { + param.setShopId(shopId); + } Page data = dataSummaryService.getProductSaleRankingPage(param); return CzgResult.success(data); } @@ -67,15 +71,18 @@ public class DataSummaryController { /** * 销售趋势柱状图 左下 * - * @param day 天数 + * @param day 天数 + * @param shopId 店铺id */ @GetMapping("dateAmount") @OperationLog("销售趋势柱状图 左下") @SaStaffCheckPermission("yun_xu_cha_kan_jing_ying_shu_ju") //@SaAdminCheckPermission("dataSummary:dateAmount") - public CzgResult getDateAmount(@RequestParam Integer day) { + public CzgResult getDateAmount(@RequestParam Integer day, @RequestParam Long shopId) { AssertUtil.isNull(day, "天数不能为空"); - Long shopId = StpKit.USER.getShopId(0L); + if (shopId == null) { + shopId = StpKit.USER.getShopId(0L); + } DataSummaryDateAmountVo data = dataSummaryService.getSummaryAmountData(shopId, day); return CzgResult.success(data); } @@ -84,13 +91,16 @@ public class DataSummaryController { * 支付占比饼图 左下 * * @param day 天数 + * @param shopId 店铺id */ @GetMapping("datePayType") @OperationLog("支付占比饼图 左下") @SaStaffCheckPermission("yun_xu_cha_kan_jing_ying_shu_ju") //@SaAdminCheckPermission("dataSummary:datePayType") - public CzgResult shopSummaryPayType(@RequestParam Integer day) { - Long shopId = StpKit.USER.getShopId(0L); + public CzgResult shopSummaryPayType(@RequestParam Integer day, @RequestParam Long shopId) { + if (shopId == null) { + shopId = StpKit.USER.getShopId(0L); + } DataSummaryPayTypeVo data = dataSummaryService.getSummaryPayTypeData(shopId, day); return CzgResult.success(data); } diff --git a/cash-api/order-server/src/main/java/com/czg/controller/admin/SaleSummaryController.java b/cash-api/order-server/src/main/java/com/czg/controller/admin/SaleSummaryController.java index 15fe88af4..b08584fc5 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/admin/SaleSummaryController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/admin/SaleSummaryController.java @@ -38,7 +38,9 @@ public class SaleSummaryController { //@SaAdminCheckPermission("saleSummary:count") public CzgResult summaryCount(SaleSummaryCountParam param) { Long shopId = StpKit.USER.getShopId(0L); - param.setShopId(shopId); + if (param.getShopId() == null) { + param.setShopId(shopId); + } SaleSummaryCountVo data = saleSummaryService.summaryCount(param); return CzgResult.success(data); } @@ -51,7 +53,9 @@ public class SaleSummaryController { //@SaAdminCheckPermission("saleSummary:page") public CzgResult> summaryPage(SaleSummaryCountParam param) { Long shopId = StpKit.USER.getShopId(0L); - param.setShopId(shopId); + if (param.getShopId() == null) { + param.setShopId(shopId); + } Page page = saleSummaryService.summaryPage(param); return CzgResult.success(page); } @@ -65,7 +69,9 @@ public class SaleSummaryController { //@SaAdminCheckPermission("saleSummary:export") public List summaryExport(SaleSummaryCountParam param) { Long shopId = StpKit.USER.getShopId(0L); - param.setShopId(shopId); + if (param.getShopId() == null) { + param.setShopId(shopId); + } return saleSummaryService.summaryList(param); } diff --git a/cash-api/order-server/src/main/java/com/czg/controller/admin/TableSummaryController.java b/cash-api/order-server/src/main/java/com/czg/controller/admin/TableSummaryController.java index cfb0c7828..0fbc03098 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/admin/TableSummaryController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/admin/TableSummaryController.java @@ -37,7 +37,9 @@ public class TableSummaryController { //@SaAdminCheckPermission("tableSummary:list") public CzgResult> summaryList(TableSummaryParam param) { Long shopId = StpKit.USER.getShopId(0L); - param.setShopId(shopId); + if (param.getShopId() == null) { + param.setShopId(shopId); + } List data = tableSummaryService.summaryList(param); return CzgResult.success(data); } @@ -51,7 +53,9 @@ public class TableSummaryController { //@SaAdminCheckPermission("tableSummary:export") public List summaryExport(TableSummaryParam param) { Long shopId = StpKit.USER.getShopId(0L); - param.setShopId(shopId); + if (param.getShopId() == null) { + param.setShopId(shopId); + } return tableSummaryService.summaryExportList(param); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/param/DataSummaryProductSaleParam.java b/cash-common/cash-common-service/src/main/java/com/czg/order/param/DataSummaryProductSaleParam.java index 2b8a185a9..a7ae4cb24 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/param/DataSummaryProductSaleParam.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/param/DataSummaryProductSaleParam.java @@ -34,7 +34,6 @@ public class DataSummaryProductSaleParam implements Serializable { /** * 店铺id */ - @JSONField(serialize = false) private Long shopId; /** * 开始日期 diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/param/DataSummaryTradeParam.java b/cash-common/cash-common-service/src/main/java/com/czg/order/param/DataSummaryTradeParam.java index 3b71ed0fe..a9099adfc 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/param/DataSummaryTradeParam.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/param/DataSummaryTradeParam.java @@ -1,6 +1,5 @@ package com.czg.order.param; -import com.alibaba.fastjson2.annotation.JSONField; import com.czg.validator.group.DefaultGroup; import jakarta.validation.constraints.NotBlank; import lombok.Data; @@ -33,7 +32,6 @@ public class DataSummaryTradeParam implements Serializable { /** * 店铺id */ - @JSONField(serialize = false) private Long shopId; } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/param/SaleSummaryCountParam.java b/cash-common/cash-common-service/src/main/java/com/czg/order/param/SaleSummaryCountParam.java index f64ae7f87..671680549 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/param/SaleSummaryCountParam.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/param/SaleSummaryCountParam.java @@ -1,6 +1,5 @@ package com.czg.order.param; -import com.alibaba.fastjson2.annotation.JSONField; import lombok.Data; import java.io.Serial; @@ -20,7 +19,6 @@ public class SaleSummaryCountParam implements Serializable { /** * 店铺id */ - @JSONField(serialize = false) private Long shopId; /** * 商品名称 diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/param/TableSummaryParam.java b/cash-common/cash-common-service/src/main/java/com/czg/order/param/TableSummaryParam.java index 54c618db8..fedbe4202 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/param/TableSummaryParam.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/param/TableSummaryParam.java @@ -1,6 +1,5 @@ package com.czg.order.param; -import com.alibaba.fastjson2.annotation.JSONField; import lombok.Data; import java.io.Serial; @@ -29,7 +28,6 @@ public class TableSummaryParam implements Serializable { /** * 店铺id */ - @JSONField(serialize = false) private Long shopId; } From ad42265c3472f190adb56a705c14435debd66ae3 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 9 Apr 2025 16:27:26 +0800 Subject: [PATCH 059/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/controller/admin/DataSummaryController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java b/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java index 52eee05bc..69a606dd5 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java @@ -78,7 +78,7 @@ public class DataSummaryController { @OperationLog("销售趋势柱状图 左下") @SaStaffCheckPermission("yun_xu_cha_kan_jing_ying_shu_ju") //@SaAdminCheckPermission("dataSummary:dateAmount") - public CzgResult getDateAmount(@RequestParam Integer day, @RequestParam Long shopId) { + public CzgResult getDateAmount(@RequestParam Integer day, @RequestParam(required = false) Long shopId) { AssertUtil.isNull(day, "天数不能为空"); if (shopId == null) { shopId = StpKit.USER.getShopId(0L); @@ -97,7 +97,7 @@ public class DataSummaryController { @OperationLog("支付占比饼图 左下") @SaStaffCheckPermission("yun_xu_cha_kan_jing_ying_shu_ju") //@SaAdminCheckPermission("dataSummary:datePayType") - public CzgResult shopSummaryPayType(@RequestParam Integer day, @RequestParam Long shopId) { + public CzgResult shopSummaryPayType(@RequestParam Integer day, @RequestParam(required = false) Long shopId) { if (shopId == null) { shopId = StpKit.USER.getShopId(0L); } From 91d67f6de242c1269e701ab1514205c4401a8849 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 9 Apr 2025 17:54:47 +0800 Subject: [PATCH 060/162] =?UTF-8?q?=E5=A4=9A=E5=BA=97=E9=93=BA=E9=9C=80?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/account/service/impl/ShopInfoServiceImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index 1f84b9adf..f565d9254 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -256,8 +256,9 @@ public class ShopInfoServiceImpl extends ServiceImpl i String shopType = shopInfo.getShopType(); Long mainId = shopInfo.getMainId(); Integer isHeadShop = shopInfo.getIsHeadShop(); - // 原来是单店,现在不是单店,那么就允许修改,否则不允许修改 - if (ShopTypeEnum.ONLY.equals(shopType) && !ShopTypeEnum.ONLY.getValue().equals(shopInfoEditDTO.getShopType())) { + if (shopType.equals(shopInfoEditDTO.getShopType())) { + // 原来是单店,现在不是单店,那么就允许修改,否则不允许修改 + } else if (ShopTypeEnum.ONLY.getValue().equals(shopType) && !ShopTypeEnum.ONLY.getValue().equals(shopInfoEditDTO.getShopType())) { if (shopInfoEditDTO.getIsHeadShop() == null) { throw new CzgException("加盟店/连锁店请选择是否主店"); } From b915389954cc4649966ef63edce7f0ecceb80252 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Wed, 9 Apr 2025 18:23:20 +0800 Subject: [PATCH 061/162] =?UTF-8?q?=E5=8D=95=E4=B8=AA=20=E5=8F=98=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/product/service/ShopSyncService.java | 64 +++ .../service/impl/ShopConfigServiceImpl.java | 3 +- .../service/impl/ShopSyncServiceImpl.java | 449 +++++++++++++++++- 3 files changed, 508 insertions(+), 8 deletions(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java index e283aa275..3a3927ff4 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java @@ -8,9 +8,73 @@ public interface ShopSyncService { /** * 同步数据 将源店铺信息 同步到目标店铺(包括分组 分类 单位 规格 商品 SKU 耗材) + * * @param sourceShopId 源店铺ID * @param targetShopId 目标店铺ID */ void sync(Long sourceShopId, Long targetShopId); + /** + * 同步单位(新增/修改字段/逻辑删除 不包含删除) 将源店铺的单位同步到 开了同步商品开关的子店铺 + * + * @param sourceShopId 主店ID + * @param unitId 主店单位Id + */ + void syncUnitBySourceShop(Long sourceShopId, Long unitId); + + /** + * 同步规格(新增/修改字段/逻辑删除 不包含删除) 将源店铺的规格同步到 开了同步商品开关的子店铺 + * + * @param sourceShopId 主店ID + * @param specId 主店规格Id + */ + void syncSpecBySourceShop(Long sourceShopId, Long specId); + + /** + * 同步分类(新增/修改字段/逻辑删除 不包含删除) 将源店铺的分类同步到 开了同步商品开关的子店铺 + * + * @param sourceShopId 主店ID + * @param categoryId 主店分类Id + */ + void syncCategoryBySourceShop(Long sourceShopId, Long categoryId); + + /** + * 同步商品 会同步Sku(新增/修改字段/逻辑删除 不包含删除) 将源店铺的商品同步到 开了同步商品开关的子店铺 + * + * @param sourceShopId 主店ID + * @param productId 主店商品Id + */ + void syncProductBySourceShop(Long sourceShopId, Long productId); + + /** + * 同步分组 (新增/修改字段/逻辑删除 不包含删除) 将源店铺的分组同步到 开了同步商品开关的子店铺 + * + * @param sourceShopId 主店ID + * @param groupId 主店分组Id + */ + void syncGroupBySourceShop(Long sourceShopId, Long groupId); + + /** + * 同步耗材分组 (新增/修改字段/逻辑删除 不包含删除) 将源店铺的耗材分组同步到 开了同步耗材开关的子店铺 + * + * @param sourceShopId 主店ID + * @param consGroupId 主店耗材分组Id + */ + void syncConsGroupBySourceShop(Long sourceShopId, Long consGroupId); + + /** + * 同步耗材信息(新增/修改字段/逻辑删除 不包含删除) 将源店铺的耗材信息同步到 开了同步耗材开关的子店铺 + * + * @param sourceShopId 主店ID + * @param consInfoId 主店ID + */ + void syncConsInfoBySourceShop(Long sourceShopId, Long consInfoId); + + /** + * 同步商品绑定耗材关联关系 开了同步耗材开关的子店铺 + * + * @param sourceShopId 主店ID + * @param sourceProdId 主店商品ID + */ + void syncConsProBySourceShop(Long sourceShopId, Long sourceProdId); } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopConfigServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopConfigServiceImpl.java index d9bd07095..eb7486eeb 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopConfigServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopConfigServiceImpl.java @@ -10,6 +10,7 @@ import com.czg.utils.PageUtil; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import jakarta.annotation.Resource; +import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; /** @@ -18,7 +19,7 @@ import org.springframework.stereotype.Service; * @author Tankaikai tankaikai@aliyun.com * @since 1.0 2025-04-03 */ -@Service +@DubboService public class ShopConfigServiceImpl extends ServiceImpl implements ShopConfigService { @Resource diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 65ea14b2a..e9c002f48 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -3,9 +3,14 @@ package com.czg.service.product.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.JSONWriter; +import com.czg.account.entity.ShopConfig; import com.czg.account.entity.ShopInfo; +import com.czg.account.service.ShopConfigService; import com.czg.account.service.ShopInfoService; import com.czg.account.service.ShopUserService; import com.czg.account.service.SyncNoticeService; @@ -14,20 +19,20 @@ import com.czg.product.entity.*; import com.czg.product.service.*; import com.czg.product.vo.ProductGroupVo; import com.czg.utils.AssertUtil; +import com.mybatisflex.core.query.QueryWrapper; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.stream.Collectors; import static com.mybatisflex.core.query.QueryMethods.column; @@ -36,11 +41,12 @@ import static com.mybatisflex.core.query.QueryMethods.column; * @description */ @Slf4j -@Service @DubboService public class ShopSyncServiceImpl implements ShopSyncService { @DubboReference private ShopInfoService shopInfoService; + @DubboReference + private ShopConfigService shopConfigService; @Resource private ShopProdUnitService unitService; @Resource @@ -81,7 +87,37 @@ public class ShopSyncServiceImpl implements ShopSyncService { } } + /** + * 校验主店 + * + * @param sourceShopId 主店铺ID + * @param type 1-同步商品内容 2-内部耗材内容 + * @return 开启该开关的子店集合 + */ + private Set checkSourceShopInfo(Long sourceShopId, int type) { + AssertUtil.isNull(sourceShopId, "{}不能为空", "源店铺ID"); + ShopInfo sourceShop = shopInfoService.getById(sourceShopId); + if (StrUtil.isBlank(sourceShop.getShopType()) || "only".equals(sourceShop.getShopType()) + || sourceShop.getIsHeadShop() == null || sourceShop.getIsHeadShop() != 1) { + throw new CzgException("同步失败,源店铺不是主店铺或源店铺是单店"); + } + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.select(column(ShopConfig::getId)); + queryWrapper.eq(ShopConfig::getMainId, sourceShopId); + switch (type) { + case 1: + queryWrapper.eq(ShopConfig::getIsEnableProdSync, 1); + break; + case 2: + queryWrapper.eq(ShopConfig::getIsEnableConsSync, 1); + break; + } + List ids = shopConfigService.listAs(queryWrapper, Long.class); + return new HashSet<>(ids); + } + @Override + @Transactional(rollbackFor = Exception.class) public void sync(Long sourceShopId, Long targetShopId) { Map unitMap; Map specMap; @@ -138,6 +174,37 @@ public class ShopSyncServiceImpl implements ShopSyncService { return unitMap; } + @Override + @Transactional(rollbackFor = Exception.class) + public void syncUnitBySourceShop(Long sourceShopId, Long unitId) { + AssertUtil.isNull(unitId, "{}不能为空", "单位ID"); + Set shopIds = checkSourceShopInfo(sourceShopId, 1); + if (CollUtil.isEmpty(shopIds)) { + return; + } + ShopProdUnit mainUnit = unitService.getById(unitId); + AssertUtil.isNull(mainUnit, "需要同步的{}不存在", "单位"); + List list = unitService.queryChain().eq(ShopProdUnit::getSyncId, unitId).in(ShopProdUnit::getShopId, shopIds).list(); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + map = list.stream().collect(Collectors.toMap(ShopProdUnit::getShopId, t -> t)); + } + Map finalMap = map; + shopIds.forEach(shopId -> { + ShopProdUnit newUnit = BeanUtil.copyProperties(mainUnit, ShopProdUnit.class); + + newUnit.setSyncId(mainUnit.getId()); + newUnit.setShopId(shopId); + if (finalMap.containsKey(shopId)) { + ShopProdUnit unit = finalMap.get(shopId); + newUnit.setId(unit.getId()); + unitService.updateById(newUnit); + } else { + newUnit.setId(null); + unitService.save(newUnit); + } + }); + } //规格 public Map syncSpec(Long sourceShopId, Long pointShopId) { @@ -161,6 +228,38 @@ public class ShopSyncServiceImpl implements ShopSyncService { return specMap; } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncSpecBySourceShop(Long sourceShopId, Long specId) { + AssertUtil.isNull(specId, "{}不能为空", "规格ID"); + Set shopIds = checkSourceShopInfo(sourceShopId, 1); + if (CollUtil.isEmpty(shopIds)) { + return; + } + ShopProdSpec mainEntity = specService.getById(specId); + AssertUtil.isNull(mainEntity, "需要同步的{}不存在", "规格"); + List list = specService.queryChain().eq(ShopProdSpec::getSyncId, specId).in(ShopProdSpec::getShopId, shopIds).list(); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + map = list.stream().collect(Collectors.toMap(ShopProdSpec::getShopId, t -> t)); + } + Map finalMap = map; + shopIds.forEach(shopId -> { + ShopProdSpec newEntity = BeanUtil.copyProperties(mainEntity, ShopProdSpec.class); + newEntity.setSyncId(mainEntity.getId()); + newEntity.setShopId(shopId); + if (finalMap.containsKey(shopId)) { + ShopProdSpec childEntity = finalMap.get(shopId); + newEntity.setId(childEntity.getId()); + specService.updateById(newEntity); + } else { + newEntity.setId(null); + specService.save(newEntity); + } + }); + } + // 分类 public Map syncCategory(Long sourceShopId, Long pointShopId) { Map categoryMap = new HashMap<>(); @@ -209,6 +308,45 @@ public class ShopSyncServiceImpl implements ShopSyncService { return categoryMap; } + @Override + @Transactional(rollbackFor = Exception.class) + public void syncCategoryBySourceShop(Long sourceShopId, Long categoryId) { + AssertUtil.isNull(categoryId, "{}不能为空", "分类ID"); + Set shopIds = checkSourceShopInfo(sourceShopId, 1); + if (CollUtil.isEmpty(shopIds)) { + return; + } + ShopProdCategory mainEntity = categoryService.getById(categoryId); + AssertUtil.isNull(mainEntity, "需要同步的{}不存在", "分类"); + List list = categoryService.queryChain().eq(ShopProdCategory::getSyncId, categoryId).in(ShopProdCategory::getShopId, shopIds).list(); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + map = list.stream().collect(Collectors.toMap(ShopProdCategory::getShopId, t -> t)); + } + Map categoryMap = new HashMap<>(); + if (mainEntity.getPid() != null) { + List categoryList = categoryService.queryChain().eq(ShopProdCategory::getSyncId, mainEntity.getPid()).in(ShopProdCategory::getShopId, shopIds).list(); + if (CollUtil.isNotEmpty(categoryList)) { + categoryMap = categoryList.stream().collect(Collectors.toMap(ShopProdCategory::getShopId, ShopProdCategory::getId)); + } + } + Map finalMap = map; + for (Long shopId : shopIds) { + ShopProdCategory newEntity = BeanUtil.copyProperties(mainEntity, ShopProdCategory.class); + newEntity.setSyncId(mainEntity.getId()); + newEntity.setShopId(shopId); + newEntity.setPid(newEntity.getPid() != null ? categoryMap.get(shopId) : null); + if (finalMap.containsKey(shopId)) { + ShopProdCategory childEntity = finalMap.get(shopId); + newEntity.setId(childEntity.getId()); + categoryService.updateById(newEntity); + } else { + newEntity.setId(null); + categoryService.save(newEntity); + } + } + } + public Map syncProduct(Long sourceShopId, Long pointShopId, Map unitMap, Map specMap, Map cateGoryMap) { List pointProducts = productService.queryChain() @@ -240,11 +378,71 @@ public class ShopSyncServiceImpl implements ShopSyncService { return proMap; } + @Override + @Transactional(rollbackFor = Exception.class) + public void syncProductBySourceShop(Long sourceShopId, Long productId) { + AssertUtil.isNull(productId, "{}不能为空", "商品ID"); + Set shopIds = checkSourceShopInfo(sourceShopId, 1); + if (CollUtil.isEmpty(shopIds)) { + return; + } + Product mainEntity = productService.getById(productId); + AssertUtil.isNull(mainEntity, "需要同步的{}不存在", "商品"); + List list = productService.queryChain().eq(Product::getSyncId, productId).in(Product::getShopId, shopIds).list(); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + map = list.stream().collect(Collectors.toMap(Product::getShopId, t -> t)); + } + List specList = specService.queryChain().eq(ShopProdSpec::getSyncId, productId).in(ShopProdSpec::getShopId, shopIds).list(); + Map specMap = new HashMap<>(); + if (CollUtil.isNotEmpty(specList)) { + specMap = specList.stream().collect(Collectors.toMap(ShopProdSpec::getShopId, ShopProdSpec::getId)); + } + List unitList = unitService.queryChain().eq(ShopProdUnit::getSyncId, productId).in(ShopProdUnit::getShopId, shopIds).list(); + Map unitMap = new HashMap<>(); + if (CollUtil.isNotEmpty(unitList)) { + unitMap = unitList.stream().collect(Collectors.toMap(ShopProdUnit::getShopId, ShopProdUnit::getId)); + } + List categoryList = categoryService.queryChain().eq(ShopProdCategory::getSyncId, productId).in(ShopProdCategory::getShopId, shopIds).list(); + Map categoryMap = new HashMap<>(); + if (CollUtil.isNotEmpty(categoryList)) { + categoryMap = categoryList.stream().collect(Collectors.toMap(ShopProdCategory::getShopId, ShopProdCategory::getId)); + } + Map finalMap = map; + for (Long shopId : shopIds) { + Product newEntity = BeanUtil.copyProperties(mainEntity, Product.class); + newEntity.setSyncId(mainEntity.getSyncId()); + newEntity.setShopId(shopId); + newEntity.setCategoryId(newEntity.getCategoryId() != null ? categoryMap.get(newEntity.getSpecId()) : null); + newEntity.setSpecId(newEntity.getSpecId() != null ? specMap.get(newEntity.getSpecId()) : null); + newEntity.setUnitId(newEntity.getUnitId() != null ? unitMap.get(newEntity.getUnitId()) : null); + if (finalMap.containsKey(shopId)) { + Product childEntity = finalMap.get(shopId); + newEntity.setId(childEntity.getId()); + productService.updateById(newEntity); + } else { + newEntity.setId(null); + newEntity.setIsSale(0); + newEntity.setStockNumber(0); + productService.save(newEntity); + } + syncSkuBySourceShop(sourceShopId, shopId, productId, newEntity.getId()); + if ("package".equals(newEntity.getType()) || "coupon".equals(newEntity.getType())) { + syncProductPackageBySourceShop(newEntity, shopId); + } + } + } + public Map syncGroup(Long sourceShopId, Long pointShopId, Map pros) { Map groupMap = new HashMap<>(); List pointGroup = groupService.queryChain().select(ProdGroup::getSyncId).eq(ProdGroup::getShopId, pointShopId) .isNotNull(ProdGroup::getSyncId).listAs(Long.class); List list = groupService.queryChain().eq(ProdGroup::getShopId, sourceShopId).list(); + if (CollUtil.isEmpty(list)) { + log.info("分组同步,分组数据为空"); + return new HashMap<>(); + + } for (ProdGroup prodGroup : list) { if (CollUtil.isEmpty(pointGroup) || !pointGroup.contains(prodGroup.getId())) { ProdGroup tbProductGroupNew = BeanUtil.copyProperties(prodGroup, ProdGroup.class); @@ -265,11 +463,75 @@ public class ShopSyncServiceImpl implements ShopSyncService { return groupMap; } - //分组 + @Override + @Transactional(rollbackFor = Exception.class) + public void syncGroupBySourceShop(Long sourceShopId, Long groupId) { + AssertUtil.isNull(groupId, "{}不能为空", "分组ID"); + Set shopIds = checkSourceShopInfo(sourceShopId, 1); + if (CollUtil.isEmpty(shopIds)) { + return; + } + ProdGroup mainEntity = groupService.getById(groupId); + AssertUtil.isNull(mainEntity, "需要同步的{}不存在", "分组"); + List list = groupService.queryChain().eq(ProdGroup::getSyncId, groupId).in(ProdGroup::getShopId, shopIds).list(); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + map = list.stream().collect(Collectors.toMap(ProdGroup::getShopId, t -> t)); + } + List groupRelations = prodGroupRelationService.queryChain().eq(ProdGroupRelation::getProdGroupId, mainEntity.getId()).list(); + Map groupRelationMap = new HashMap<>(); + if (CollUtil.isNotEmpty(groupRelations)) { + groupRelationMap = groupRelations.stream().collect(Collectors.toMap(ProdGroupRelation::getProductId, ProdGroupRelation::getSort)); + } + List groupRelationList = new ArrayList<>(); + for (Long shopId : shopIds) { + ProdGroup newEntity = BeanUtil.copyProperties(mainEntity, ProdGroup.class); + newEntity.setSyncId(mainEntity.getId()); + newEntity.setShopId(shopId); + if (map.containsKey(shopId)) { + ProdGroup childEntity = map.get(shopId); + newEntity.setId(childEntity.getId()); + groupService.updateById(newEntity); + } else { + newEntity.setId(null); + groupService.save(newEntity); + } + if (CollUtil.isEmpty(groupRelationMap)) { + List oldProdGroup = prodGroupRelationService.queryChain().eq(ProdGroupRelation::getProdGroupId, newEntity.getId()).list(); + if(CollUtil.isEmpty(oldProdGroup)){ + continue; + } + Set oldProds = oldProdGroup.stream().map(ProdGroupRelation::getProductId).collect(Collectors.toSet()); + List rmIds = productService.queryChain().select(Product::getId).eq(Product::getShopId, shopId) + .in(Product::getId, oldProds).isNotNull(Product::getSyncId).listAs(Long.class); + if(CollUtil.isEmpty(rmIds)){ + continue; + } + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq(ProdGroupRelation::getProdGroupId, newEntity.getId()); + queryWrapper.in(ProdGroupRelation::getProductId, rmIds); + prodGroupRelationService.remove(queryWrapper); + } else { + List prods = productService.queryChain().select(Product::getId).eq(Product::getShopId, shopId).in(Product::getSyncId, groupRelationMap.keySet()).list(); + for (Product prod : prods) { + ProdGroupRelation newProdGroupRelation = new ProdGroupRelation(); + newProdGroupRelation.setProdGroupId(newEntity.getId()); + newProdGroupRelation.setProductId(prod.getId()); + newProdGroupRelation.setSort(groupRelationMap.get(prod.getSyncId())); + groupRelationList.add(newProdGroupRelation); + } + } + } + if (CollUtil.isNotEmpty(groupRelations)) { + prodGroupRelationService.saveOrUpdateBatch(groupRelationList, 100); + } + } + + //套餐 public void syncProductPackage(Long shopId, Map pros, Map skus) { List list = productService.queryChain() .eq(Product::getShopId, shopId) - .and(column(Product::getType).eq("weight").or(column(Product::getType).eq("coupon"))) + .and(column(Product::getType).eq("package").or(column(Product::getType).eq("coupon"))) .list(); for (Product product : list) { if (StrUtil.isNotBlank(product.getGroupSnap()) && product.getGroupSnap().length() > 5) { @@ -293,8 +555,41 @@ public class ShopSyncServiceImpl implements ShopSyncService { proGroupVo.setNumber(proGroupVo.getCount()); } } + product.setGroupSnap(JSON.toJSONString(proGroupVo, JSONWriter.Feature.WriteMapNullValue)); } } + productService.saveOrUpdateBatch(list, 100); + } + + public void syncProductPackageBySourceShop(Product product, Long pointShopId) { + if (StrUtil.isNotBlank(product.getGroupSnap()) && product.getGroupSnap().length() > 5) { + ProductGroupVo proGroupVo = JSONObject.parseObject(product.getGroupSnap(), ProductGroupVo.class); + List goodList = new ArrayList<>(); + for (ProductGroupVo.Food goods : proGroupVo.getGoods()) { + if (goods.getProId() != null) { + Product sourceProduct = productService.queryChain().eq(Product::getShopId, pointShopId).eq(Product::getSyncId, goods.getProId()).one(); + if (sourceProduct != null) { + goods.setProId(sourceProduct.getId()); + goods.setProName(sourceProduct.getName()); + } + } + if (goods.getSkuId() != null) { + ProdSku sourceSku = skuService.queryChain().eq(ProdSku::getShopId, pointShopId).eq(ProdSku::getSyncId, goods.getSkuId()).one(); + goods.setSkuId(sourceSku.getId()); + goods.setSkuName(sourceSku.getSpecInfo()); + } + goodList.add(goods); + } + proGroupVo.setCount(goodList.size()); + proGroupVo.setGoods(goodList); + if (proGroupVo.getNumber() != null && proGroupVo.getNumber() > 0) { + if (proGroupVo.getNumber() > proGroupVo.getCount()) { + proGroupVo.setNumber(proGroupVo.getCount()); + } + } + product.setGroupSnap(JSON.toJSONString(proGroupVo, JSONWriter.Feature.WriteMapNullValue)); + productService.saveOrUpdate(product); + } } //分组 @@ -320,6 +615,35 @@ public class ShopSyncServiceImpl implements ShopSyncService { return skuMap; } + public void syncSkuBySourceShop(Long sourceShopId, Long pointShopId, Long sourceProductId, Long pointProductId) { + List sourceSkus = skuService.queryChain() + .eq(ProdSku::getShopId, sourceShopId) + .eq(ProdSku::getProductId, sourceProductId) + .list(); + if (CollUtil.isEmpty(sourceSkus)) { + return; + } + List newSaveSkus = new ArrayList<>(); + Set sourceIds = sourceSkus.stream().map(ProdSku::getId).collect(Collectors.toSet()); + + List childSkus = skuService.queryChain().eq(ProdSku::getShopId, pointShopId).in(ProdSku::getSyncId, sourceIds).list(); + Map childSkuMap = childSkus.stream().collect(Collectors.toMap(ProdSku::getSyncId, t -> t)); + for (ProdSku skus : sourceSkus) { + ProdSku newSku = BeanUtil.copyProperties(skus, ProdSku.class); + newSku.setSyncId(skus.getId()); + newSku.setShopId(pointShopId); + newSku.setProductId(pointProductId); + if (childSkuMap.containsKey(skus.getId())) { + ProdSku childSku = childSkuMap.get(skus.getId()); + newSku.setId(childSku.getId()); + } else { + newSku.setId(null); + } + newSaveSkus.add(newSku); + } + skuService.saveOrUpdateBatch(newSaveSkus, 100); + } + public Map syncConsGroup(Long sourceShopId, Long pointShopId) { Map consGroupMap = new HashMap<>(); List pointConsGroup = consGroupService.queryChain().select(ConsGroup::getSyncId) @@ -341,6 +665,37 @@ public class ShopSyncServiceImpl implements ShopSyncService { return consGroupMap; } + @Override + @Transactional(rollbackFor = Exception.class) + public void syncConsGroupBySourceShop(Long sourceShopId, Long consGroupId) { + AssertUtil.isNull(consGroupId, "{}不能为空", "耗材分组ID"); + Set shopIds = checkSourceShopInfo(sourceShopId, 2); + if (CollUtil.isEmpty(shopIds)) { + return; + } + ConsGroup mainEntity = consGroupService.getById(consGroupId); + AssertUtil.isNull(mainEntity, "需要同步的{}不存在", "耗材分组"); + List list = consGroupService.queryChain().eq(ConsGroup::getSyncId, consGroupId).in(ConsGroup::getShopId, shopIds).list(); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + map = list.stream().collect(Collectors.toMap(ConsGroup::getShopId, t -> t)); + } + Map finalMap = map; + shopIds.forEach(shopId -> { + ConsGroup newEntity = BeanUtil.copyProperties(mainEntity, ConsGroup.class); + newEntity.setSyncId(mainEntity.getId()); + newEntity.setShopId(shopId); + if (finalMap.containsKey(shopId)) { + ConsGroup childEntity = finalMap.get(shopId); + newEntity.setId(childEntity.getId()); + consGroupService.updateById(newEntity); + } else { + newEntity.setId(null); + consGroupService.save(newEntity); + } + }); + } + // 耗材 public Map syncConsInfo(Long sourceShopId, Long pointShopId, Map consGroupMap) { Map consMap = new HashMap<>(); @@ -365,6 +720,43 @@ public class ShopSyncServiceImpl implements ShopSyncService { return consMap; } + @Override + @Transactional(rollbackFor = Exception.class) + public void syncConsInfoBySourceShop(Long sourceShopId, Long consInfoId) { + AssertUtil.isNull(consInfoId, "{}不能为空", "耗材ID"); + Set shopIds = checkSourceShopInfo(sourceShopId, 2); + if (CollUtil.isEmpty(shopIds)) { + return; + } + ConsInfo mainEntity = consInfoService.getById(consInfoId); + AssertUtil.isNull(mainEntity, "需要同步的{}不存在", "耗材"); + List list = consInfoService.queryChain().eq(ConsInfo::getSyncId, consInfoId).in(ConsInfo::getShopId, shopIds).list(); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + map = list.stream().collect(Collectors.toMap(ConsInfo::getShopId, t -> t)); + } + Map finalMap = map; + for (Long shopId : shopIds) { + ConsInfo newEntity = BeanUtil.copyProperties(mainEntity, ConsInfo.class); + newEntity.setSyncId(mainEntity.getId()); + newEntity.setShopId(shopId); + if (newEntity.getConsGroupId() != null) { + Long consGroupId = consGroupService.queryChain().select(ConsGroup::getId) + .eq(ConsGroup::getSyncId, newEntity.getConsGroupId()).eq(ConsGroup::getShopId, shopId).oneAs(Long.class); + newEntity.setConsGroupId(consGroupId); + } + if (finalMap.containsKey(shopId)) { + ConsInfo childEntity = finalMap.get(shopId); + newEntity.setId(childEntity.getId()); + consInfoService.updateById(newEntity); + } else { + newEntity.setId(null); + newEntity.setStockNumber(BigDecimal.ZERO); + consInfoService.save(newEntity); + } + } + } + public void syncConsPro(Long sourceShopId, Long pointShopId, Map consMap, Map proMap) { List list = prodConsRelationService.queryChain().eq(ProdConsRelation::getShopId, sourceShopId).list(); for (ProdConsRelation prodConsRelation : list) { @@ -376,4 +768,47 @@ public class ShopSyncServiceImpl implements ShopSyncService { log.info("耗材与商品关联关系,同步{}个", list.size()); } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncConsProBySourceShop(Long sourceShopId, Long sourceProdId) { + AssertUtil.isNull(sourceProdId, "{}不能为空", "商品ID"); + Set shopIds = checkSourceShopInfo(sourceShopId, 2); + if (CollUtil.isEmpty(shopIds)) { + return; + } + List newSaveList = new ArrayList<>(); + List list = prodConsRelationService.queryChain() + .eq(ProdConsRelation::getShopId, sourceShopId).eq(ProdConsRelation::getProductId, sourceProdId).list(); + for (Long shopId : shopIds) { + Product product = productService.queryChain().eq(Product::getSyncId, sourceProdId).eq(Product::getShopId, shopId).one(); + if (product != null) { + if (CollUtil.isEmpty(list)) { + List prods = prodConsRelationService.queryChain().select(ProdConsRelation::getProductId) + .eq(ProdConsRelation::getShopId, shopId).eq(ProdConsRelation::getProductId, product.getId()).listAs(Long.class); + if (CollUtil.isNotEmpty(prods)) { + List remIds = productService.queryChain().select(Product::getId).in(Product::getId, prods).isNotNull(Product::getSyncId).listAs(Long.class); + if (CollUtil.isNotEmpty(remIds)) { + prodConsRelationService.remove(new QueryWrapper().eq(ProdConsRelation::getShopId, shopId).in(ProdConsRelation::getProductId, remIds)); + } + } + } else { + Map map = list.stream().collect(Collectors.toMap(ProdConsRelation::getConsInfoId, ProdConsRelation::getSurplusStock)); + List newCons = consInfoService.queryChain().select(ConsInfo::getId) + .in(ConsInfo::getSyncId, map.keySet()).eq(ConsInfo::getShopId, shopId).list(); + for (ConsInfo newCon : newCons) { + ProdConsRelation prodConsRelation = new ProdConsRelation(); + prodConsRelation.setShopId(shopId); + prodConsRelation.setProductId(product.getId()); + prodConsRelation.setConsInfoId(newCon.getId()); + prodConsRelation.setSurplusStock(map.get(newCon.getSyncId())); + newSaveList.add(prodConsRelation); + } + } + } + } + if (CollUtil.isNotEmpty(newSaveList)) { + prodConsRelationService.saveOrUpdateBatch(newSaveList, 100); + } + } } From d76ccdfbb070af919f981c1e5d6557fabb2cfb96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Thu, 10 Apr 2025 09:13:23 +0800 Subject: [PATCH 062/162] =?UTF-8?q?=E8=80=97=E6=9D=90=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/product/dto/ConsStockFlowDTO.java | 3 ++- .../product/mapper/ConsStockFlowMapper.java | 3 +++ .../impl/ConsStockFlowServiceImpl.java | 19 +++++-------------- .../resources/mapper/ConsStockFlowMapper.xml | 15 +++++++++++++++ 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsStockFlowDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsStockFlowDTO.java index c0b0cedfe..80bf88926 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsStockFlowDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsStockFlowDTO.java @@ -97,6 +97,7 @@ public class ConsStockFlowDTO implements Serializable { * 商品id */ private Long productId; + private String productName; /** * sku id */ @@ -127,4 +128,4 @@ public class ConsStockFlowDTO implements Serializable { */ private String remark; -} \ No newline at end of file +} diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ConsStockFlowMapper.java b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ConsStockFlowMapper.java index 5ea8a4d12..787d2c663 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ConsStockFlowMapper.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ConsStockFlowMapper.java @@ -1,5 +1,6 @@ package com.czg.service.product.mapper; +import com.czg.product.dto.ConsStockFlowDTO; import com.czg.product.entity.ConsStockFlow; import com.czg.product.param.ConsInfoParam; import com.czg.product.vo.ConsStatisticsVo; @@ -24,4 +25,6 @@ public interface ConsStockFlowMapper extends BaseMapper { List selectByVendorId(@Param("shopId") Long shopId, @Param("vendorId") Integer vendorId, @Param("key") String key); List selectUnPaid(@Param("shopId") Long shopId, @Param("vendorIds") @NotEmpty List vendorIds); + + List findConsStockFlowPage(@Param("shopId") Long shopId, @Param("inOutType") String inOutType, @Param("inOutItem") String inOutItem, @Param("conId") Long conId); } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java index 7d18798e9..935a9d171 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java @@ -26,6 +26,8 @@ import com.czg.service.product.mapper.ConsStockFlowMapper; import com.czg.service.product.mapper.ProductMapper; import com.czg.service.product.util.WxAccountUtil; import com.czg.utils.PageUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; @@ -217,19 +219,8 @@ public class ConsStockFlowServiceImpl extends ServiceImpl findConsStockFlowPage(ConsStockFlowParam param) { Long shopId = StpKit.USER.getShopId(0L); - QueryWrapper queryWrapper = QueryWrapper.create(); - queryWrapper.eq(ConsStockFlow::getShopId, shopId); - if (StrUtil.isNotBlank(param.getInOutType())) { - queryWrapper.eq(ConsStockFlow::getInOutType, param.getInOutType()); - } - if (StrUtil.isNotBlank(param.getInOutItem())) { - queryWrapper.eq(ConsStockFlow::getInOutItem, param.getInOutItem()); - } - if (ObjUtil.isNotNull(param.getConId())) { - queryWrapper.eq(ConsStockFlow::getConId, param.getConId()); - } - queryWrapper.orderBy(ConsStockFlow::getId, false); - return pageAs(PageUtil.buildPage(), queryWrapper, ConsStockFlowDTO.class); + PageHelper.startPage(PageUtil.buildPageHelp()); + return PageUtil.convert(new PageInfo<>(mapper.findConsStockFlowPage(shopId, param.getInOutType(), param.getInOutItem(), param.getConId()))); } @Override @@ -264,4 +255,4 @@ public class ConsStockFlowServiceImpl extends ServiceImpl + From 648dc97a49027b8f9c080f1d2472da8db2090ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Thu, 10 Apr 2025 09:20:32 +0800 Subject: [PATCH 063/162] =?UTF-8?q?=E8=80=97=E6=9D=90=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/product/dto/ConsStockFlowDTO.java | 2 ++ .../src/main/resources/mapper/ConsStockFlowMapper.xml | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsStockFlowDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsStockFlowDTO.java index 80bf88926..4aa231d98 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsStockFlowDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsStockFlowDTO.java @@ -128,4 +128,6 @@ public class ConsStockFlowDTO implements Serializable { */ private String remark; + private String vendorName; + } diff --git a/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml b/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml index bee545ca1..9f883e259 100644 --- a/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml +++ b/cash-service/product-service/src/main/resources/mapper/ConsStockFlowMapper.xml @@ -61,8 +61,10 @@ + From e46e515666a75006dae008b3a0937a167b9a9949 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Fri, 11 Apr 2025 15:21:54 +0800 Subject: [PATCH 096/162] =?UTF-8?q?=E5=85=B3=E8=81=94=E5=85=B3=E7=B3=BB?= =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ShopSyncServiceImpl.java | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index cabe79964..5c6b31835 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -549,8 +549,13 @@ public class ShopSyncServiceImpl implements ShopSyncService { public Map syncGroup(Long sourceShopId, Long pointShopId, Map pros, List> mainMapList) { Map groupMap = new HashMap<>(); - List pointGroup = groupService.queryChain().select(ProdGroup::getSyncId).eq(ProdGroup::getShopId, pointShopId) - .isNotNull(ProdGroup::getSyncId).listAs(Long.class); + List pointGroup = new ArrayList<>(); + List pointList = groupService.queryChain().eq(ProdGroup::getShopId, pointShopId) + .isNotNull(ProdGroup::getSyncId).list(); + for (ProdGroup prodGroup : pointList) { + pointGroup.add(prodGroup.getSyncId()); + groupMap.put(prodGroup.getSyncId(), prodGroup.getId()); + } List list = groupService.queryChain().eq(ProdGroup::getShopId, sourceShopId).list(); if (CollUtil.isEmpty(list)) { log.info("分组同步,分组数据为空"); @@ -567,14 +572,33 @@ public class ShopSyncServiceImpl implements ShopSyncService { groupMap.put(prodGroup.getId(), tbProductGroupNew.getId()); } } - List groupRelations = prodGroupRelationService.queryChain().in(ProdGroupRelation::getProdGroupId, groupMap.keySet()).list(); - for (ProdGroupRelation prodGroupRelation : groupRelations) { - prodGroupRelation.setProdGroupId(groupMap.get(prodGroupRelation.getProdGroupId())); - prodGroupRelation.setProductId(pros.get(prodGroupRelation.getProductId())); + if (CollUtil.isNotEmpty(groupMap)) { + List groupRelations = prodGroupRelationService.queryChain().in(ProdGroupRelation::getProdGroupId, groupMap.keySet()).list(); + List upList = new ArrayList<>(); + List addList = new ArrayList<>(); + for (ProdGroupRelation prodGroupRelation : groupRelations) { + prodGroupRelation.setProdGroupId(groupMap.get(prodGroupRelation.getProdGroupId())); + prodGroupRelation.setProductId(pros.get(prodGroupRelation.getProductId())); + ProdGroupRelation oldRelation = prodGroupRelationService.queryChain() + .eq(ProdGroupRelation::getProdGroupId, prodGroupRelation.getProdGroupId()) + .eq(ProdGroupRelation::getProductId, prodGroupRelation.getProductId()).one(); + if (oldRelation == null) { + addList.add(prodGroupRelation); + } else { + if (oldRelation.getSort().equals(prodGroupRelation.getSort())) { + upList.add(prodGroupRelation); + } + } + } + if (CollUtil.isNotEmpty(addList)) { + prodGroupRelationService.saveBatch(addList, 100); + } + if (CollUtil.isNotEmpty(upList)) { + prodGroupRelationService.updateBatch(addList, 100); + } } - prodGroupRelationService.saveOrUpdateBatch(groupRelations, 100); - log.info("分组同步,源{}个,已有{}个,同步{}个", list.size(), pointGroup.size(), groupMap.size()); - buildNotice(mainMapList, "分组同步", groupMap.size(), null, null); + log.info("分组同步,源{}个,已有{}个,同步{}个", list.size(), pointGroup.size(), groupMap.size() - pointGroup.size()); + buildNotice(mainMapList, "分组同步", groupMap.size() - pointGroup.size(), null, null); return groupMap; } From 1cccbfcf08103e78050c5a6d1214997ba20f515b Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Fri, 11 Apr 2025 15:55:08 +0800 Subject: [PATCH 097/162] =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=BA=97=E9=93=BA?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=20=E2=88=9A=20=E4=B8=8B=E5=8D=95=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E5=AE=8C=E5=96=84=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E5=8F=B7=20=E2=88=9A=20=E4=BC=9A=E5=91=98=E6=B5=81?= =?UTF-8?q?=E6=B0=B4=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5=20=E2=88=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysMenuServiceImpl.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java index 85496abda..fcb16c44f 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java @@ -6,19 +6,22 @@ import cn.hutool.core.util.StrUtil; import com.czg.account.dto.menu.MenuAddDTO; import com.czg.account.dto.menu.MenuEditDTO; import com.czg.account.entity.SysMenu; +import com.czg.account.entity.SysUsersRoles; import com.czg.account.service.SysMenuService; import com.czg.account.vo.MenuVO; import com.czg.exception.ApiNotPrintException; import com.czg.sa.StpKit; import com.czg.service.account.mapper.SysMenuMapper; +import com.czg.service.account.mapper.SysUsersRolesMapper; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -import java.util.Arrays; /** * 系统菜单 服务层实现。 @@ -27,10 +30,25 @@ import java.util.Arrays; @Service public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { + @Resource + private SysMenuMapper sysMenuMapper; + @Resource + private SysUsersRolesMapper sysUsersRolesMapper; + @Override public List getMenu() { long sysUserId = StpKit.USER.getLoginIdAsLong(); List allMenus = mapper.selectByUserId(sysUserId, null); + List roleList = sysUsersRolesMapper.selectListByQuery(query().select(SysUsersRoles::getRoleId).eq(SysUsersRoles::getUserId, sysUserId)); + List roleIdList = roleList.stream().map(SysUsersRoles::getRoleId).toList(); + Long shopId = StpKit.USER.getShopId(0L); + boolean isEnableSync = StpKit.USER.isEnableSync(shopId); + if (isEnableSync && roleIdList.contains(2L)) { + List headShopPromissionList = sysMenuMapper.selectByRoleId(2L); + List branchShopPromissionList = sysMenuMapper.selectByRoleId(3L); + allMenus.removeAll(headShopPromissionList); + allMenus.addAll(branchShopPromissionList); + } List menuVos = allMenus.stream() .map(menu -> BeanUtil.copyProperties(menu, MenuVO.class)) .collect(Collectors.toList()); From 09848eea59e942baff9c5016e3f8d362c58fb595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=AD=E5=87=AF=E5=87=AF?= Date: Fri, 11 Apr 2025 16:26:33 +0800 Subject: [PATCH 098/162] =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=BA=97=E9=93=BA?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=20=E2=88=9A=20=E4=B8=8B=E5=8D=95=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E5=AE=8C=E5=96=84=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E5=8F=B7=20=E2=88=9A=20=E4=BC=9A=E5=91=98=E6=B5=81?= =?UTF-8?q?=E6=B0=B4=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5=20=E2=88=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/service/account/service/impl/SysMenuServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java index fcb16c44f..de2da001d 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java @@ -49,6 +49,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl allMenus.removeAll(headShopPromissionList); allMenus.addAll(branchShopPromissionList); } + List menuVos = allMenus.stream() .map(menu -> BeanUtil.copyProperties(menu, MenuVO.class)) .collect(Collectors.toList()); From b10b41917f6686001154f89fdc22f78d051400bf Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Fri, 11 Apr 2025 16:39:33 +0800 Subject: [PATCH 099/162] =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=BA=97=E9=93=BA?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=20=E2=88=9A=20=E4=B8=8B=E5=8D=95=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E5=AE=8C=E5=96=84=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E5=8F=B7=20=E2=88=9A=20=E4=BC=9A=E5=91=98=E6=B5=81?= =?UTF-8?q?=E6=B0=B4=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5=20=E2=88=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/service/impl/AuthorizationServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java index 9e421eaa6..849bc8e37 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java @@ -221,18 +221,19 @@ public class AuthorizationServiceImpl implements AuthorizationService { } // 权限赋予 List promissionList = sysMenuMapper.selectByUserId(sysUser.getId(), null).stream().map(SysMenu::getPermission).filter(StrUtil::isNotBlank).toList(); + List newPromissionList = new ArrayList<>(promissionList); boolean isEnableSync = StpKit.USER.isEnableSync(shopInfo.getId()); if (isEnableSync && CollUtil.contains(roleNames, "商户")) { roleNames.remove("商户"); roleNames.add("分店商户"); List headShopPromissionList = sysMenuMapper.selectByRoleId(2L).stream().map(SysMenu::getPermission).filter(StrUtil::isNotBlank).toList(); List branchShopPromissionList = sysMenuMapper.selectByRoleId(3L).stream().map(SysMenu::getPermission).filter(StrUtil::isNotBlank).toList(); - promissionList.removeAll(headShopPromissionList); - promissionList.addAll(branchShopPromissionList); + newPromissionList.removeAll(headShopPromissionList); + newPromissionList.addAll(branchShopPromissionList); } StpKit.USER.addRoleList(roleNames); StpKit.USER.switchTo(sysUser.getId().equals(headId), sysUser.getId(), sysUser.getAccount(), shopInfo.getId(), shopInfo.getShopName(), MyStpLogic.LoginType.MANAGER, sysUser.getIsAdmin()); - StpKit.USER.addPermissionList(promissionList); + StpKit.USER.addPermissionList(newPromissionList); StpKit.USER.addRoleList(roleNames); } From a12961e71fdc861a56eff63cadce19ceecfde415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Fri, 11 Apr 2025 17:37:26 +0800 Subject: [PATCH 100/162] =?UTF-8?q?=E6=9D=83=E9=99=90=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/controller/admin/AuthorizationController.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/AuthorizationController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/AuthorizationController.java index 7e64291cf..073486569 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/AuthorizationController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/AuthorizationController.java @@ -74,7 +74,7 @@ public class AuthorizationController { @GetMapping("/permission") public CzgResult getPermission() { - return CzgResult.success(); + return CzgResult.success(StpKit.USER.getPermissionList()); } @Resource @@ -90,7 +90,13 @@ public class AuthorizationController { // rabbitPublisher.sendOrderPrintMsg("552"); // printMqListener.orderPrint("1"); // return CzgResult.success(Map.of("token", StpKit.USER.getShopId())); - return CzgResult.success(shopInfoService.getById(1)); + return CzgResult.success(StpKit.USER.getLoginId()); + } + + @GetMapping("test1") + public CzgResult login1() throws IOException { + authorizationService.switchTo(86L); + return CzgResult.success(StpKit.USER.getLoginId()); } /** From 8d27753cf4d75480fcab3d63c9ba8c6beac530c9 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Fri, 11 Apr 2025 17:46:22 +0800 Subject: [PATCH 101/162] =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=BA=97=E9=93=BA?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=20=E2=88=9A=20=E4=B8=8B=E5=8D=95=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E5=AE=8C=E5=96=84=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E5=8F=B7=20=E2=88=9A=20=E4=BC=9A=E5=91=98=E6=B5=81?= =?UTF-8?q?=E6=B0=B4=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5=20=E2=88=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/controller/admin/ShopUserController.java | 12 ++++++------ .../com/czg/controller/user/UShopUserController.java | 6 +++--- .../java/com/czg/controller/user/UserController.java | 2 +- .../main/java/com/czg/config/SaTokenConfigure.java | 10 ++++++---- .../service/impl/MemberPointsServiceImpl.java | 2 +- .../account/service/impl/ShopUserServiceImpl.java | 4 ++-- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java index 628db585d..f64e58273 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java @@ -43,7 +43,7 @@ public class ShopUserController { @GetMapping("/summary") @SaStaffCheckPermission("yun_xu_guan_li_hui_yuan_xin_xi") public CzgResult summary(Integer isVip) { - return CzgResult.success(shopUserService.getSummary(StpKit.USER.getVipHeadShopId(), isVip)); + return CzgResult.success(shopUserService.getSummary(StpKit.USER.getUsableShopId(), isVip)); } /** @@ -67,7 +67,7 @@ public class ShopUserController { @GetMapping("/flow") @SaStaffCheckPermission("yun_xu_guan_li_hui_yuan_xin_xi") public CzgResult> flow(Integer userId, String bizCode, String startTime, String endTime) { - return CzgResult.success(shopUserFlowService.pageInfo(StpKit.USER.getVipHeadShopId(), userId, bizCode, startTime, endTime)); + return CzgResult.success(shopUserFlowService.pageInfo(StpKit.USER.getUsableShopId(), userId, bizCode, startTime, endTime)); } /** @@ -83,7 +83,7 @@ public class ShopUserController { @GetMapping("/flow/download") @SaStaffCheckPermission("yun_xu_guan_li_hui_yuan_xin_xi") public void flowDownload(Integer userId, String bizCode, String startTime, String endTime, HttpServletResponse response) throws IOException { - shopUserFlowService.flowDownload(StpKit.USER.getVipHeadShopId(), userId, bizCode, startTime, endTime, response); + shopUserFlowService.flowDownload(StpKit.USER.getUsableShopId(), userId, bizCode, startTime, endTime, response); } /** @@ -125,7 +125,7 @@ public class ShopUserController { @SaAdminCheckPermission(value = "shopUser:add", name = "店铺用户添加") @PostMapping public CzgResult add(@RequestBody @Validated ShopUserAddDTO shopUserAddDTO) { - return CzgResult.success(shopUserService.add(StpKit.USER.getVipHeadShopId(), shopUserAddDTO)); + return CzgResult.success(shopUserService.add(StpKit.USER.getUsableShopId(), shopUserAddDTO)); } /** @@ -137,7 +137,7 @@ public class ShopUserController { @SaAdminCheckPermission(value = "shopUser:edit", name = "店铺用户修改") @PutMapping public CzgResult edit(@RequestBody @Validated ShopUserEditDTO shopUserEditDTO) { - return CzgResult.success(shopUserService.updateInfo(StpKit.USER.getVipHeadShopId(), shopUserEditDTO)); + return CzgResult.success(shopUserService.updateInfo(StpKit.USER.getUsableShopId(), shopUserEditDTO)); } /** @@ -150,7 +150,7 @@ public class ShopUserController { @PutMapping("/money") public CzgResult editMoney(@RequestBody @Validated ShopUserMoneyEditDTO shopUserMoneyEditDTO) { shopUserMoneyEditDTO.setBizEnum(ShopUserFlowBizEnum.ADMIN_IN); - return CzgResult.success(shopUserService.updateMoney(StpKit.USER.getVipHeadShopId(), shopUserMoneyEditDTO) > 0L); + return CzgResult.success(shopUserService.updateMoney(StpKit.USER.getUsableShopId(), shopUserMoneyEditDTO) > 0L); } } diff --git a/cash-api/account-server/src/main/java/com/czg/controller/user/UShopUserController.java b/cash-api/account-server/src/main/java/com/czg/controller/user/UShopUserController.java index 347bd3f3d..7c3dc6f87 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/user/UShopUserController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/user/UShopUserController.java @@ -45,7 +45,7 @@ public class UShopUserController { */ @GetMapping public CzgResult get(Long shopId) { - return CzgResult.success(shopUserService.getInfo(shopId == null ? StpKit.USER.getVipHeadShopId() : shopId, StpKit.USER.getLoginIdAsLong())); + return CzgResult.success(shopUserService.getInfo(shopId == null ? StpKit.USER.getUsableShopId() : shopId, StpKit.USER.getLoginIdAsLong())); } /** @@ -65,7 +65,7 @@ public class UShopUserController { */ @GetMapping("/code") public CzgResult code(Long shopId) { - return shopUserService.getCode(StpKit.USER.getLoginIdAsLong(), shopId == null ? StpKit.USER.getVipHeadShopId() : shopId); + return shopUserService.getCode(StpKit.USER.getLoginIdAsLong(), shopId == null ? StpKit.USER.getUsableShopId() : shopId); } /** @@ -76,7 +76,7 @@ public class UShopUserController { @PostMapping @Debounce("#shopUserAddDTO.phone") public CzgResult join(@RequestBody @Validated ShopUserAddDTO shopUserAddDTO) { - return CzgResult.success(shopUserService.join(StpKit.USER.getVipHeadShopId(), StpKit.USER.getLoginIdAsLong(), shopUserAddDTO)); + return CzgResult.success(shopUserService.join(StpKit.USER.getUsableShopId(), StpKit.USER.getLoginIdAsLong(), shopUserAddDTO)); } diff --git a/cash-api/account-server/src/main/java/com/czg/controller/user/UserController.java b/cash-api/account-server/src/main/java/com/czg/controller/user/UserController.java index 63c16406c..2c4fc6a4b 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/user/UserController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/user/UserController.java @@ -34,7 +34,7 @@ public class UserController { */ @PutMapping public CzgResult update(@RequestBody UserInfoEditDTO userInfoEditDTO) { - return CzgResult.success(userInfoService.updateInfo(StpKit.USER.getVipHeadShopId(), StpKit.USER.getLoginIdAsLong(), userInfoEditDTO)); + return CzgResult.success(userInfoService.updateInfo(StpKit.USER.getUsableShopId(), StpKit.USER.getLoginIdAsLong(), userInfoEditDTO)); } /** diff --git a/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java b/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java index c07aac7fc..cf58f9514 100644 --- a/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java +++ b/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java @@ -61,15 +61,17 @@ public class SaTokenConfigure implements WebMvcConfigurer { SaRouter.match("/user/**").notMatch("/user/login", "/user/test", "/user/geo/**", "/user/home/**", "/user/home/**", "/user/dict/**", "/user/openId") .notMatch("/pay/**") - .notMatch("/notify/**") + .notMatch("/order/notify/**") + .notMatch("/user/product/**") .check(r -> MyStpLogic.CLIENT_LOGIC.checkLogin()) .setHit(true) // .match("/**") .notMatch("/user/**") .notMatch("/pay/**") - .notMatch("/notify/**") - .notMatch("/admin/auth/**") - .notMatch("/admin/shopMsgPush/subscribe/**") + .notMatch("/order/notify/**") + .notMatch("/account/admin/auth/**") + .notMatch("/user/product/**") + .notMatch("/account/admin/shopMsgPush/subscribe/**") .check(r -> MyStpLogic.ADMIN_LOGIC.checkLogin()); })).addPathPatterns("/**"); diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/MemberPointsServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/MemberPointsServiceImpl.java index 9f0b388a0..aea63114b 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/MemberPointsServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/MemberPointsServiceImpl.java @@ -52,7 +52,7 @@ public class MemberPointsServiceImpl extends ServiceImpl i @Override public Page getPage(String key, Integer isVip, BigDecimal amount) { - Long shopId = StpKit.USER.getVipHeadShopId(); + Long shopId = StpKit.USER.getUsableShopId(); PageHelper.startPage(PageUtil.buildPageHelp()); return PageUtil.convert(new PageInfo<>(mapper.selectPageByKeyAndIsVip(shopId, isVip, key, amount))); } @@ -353,7 +353,7 @@ public class ShopUserServiceImpl extends ServiceImpl i @Override public ShopUser getDetail(Integer id, Integer userId) { - ShopUser shopUser = getOne(new QueryWrapper().eq(ShopUser::getShopId, StpKit.USER.getVipHeadShopId()).eq(ShopUser::getId, id).eq(ShopUser::getUserId, userId)); + ShopUser shopUser = getOne(new QueryWrapper().eq(ShopUser::getShopId, StpKit.USER.getUsableShopId()).eq(ShopUser::getId, id).eq(ShopUser::getUserId, userId)); long count = shopActivateCouponRecordService.count(new QueryWrapper().eq(ShopActivateCouponRecord::getShopUserId, shopUser.getId()).eq(ShopActivateCouponRecord::getStatus, 0)); ShopUserDTO shopUserDTO = BeanUtil.copyProperties(shopUser, ShopUserDTO.class); shopUserDTO.setCouponNum(count); From fd577af7df6fa5f7c4b9bff5501a072d2931234b Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Fri, 11 Apr 2025 17:46:42 +0800 Subject: [PATCH 102/162] =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=BA=97=E9=93=BA?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=20=E2=88=9A=20=E4=B8=8B=E5=8D=95=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E5=AE=8C=E5=96=84=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E5=8F=B7=20=E2=88=9A=20=E4=BC=9A=E5=91=98=E6=B5=81?= =?UTF-8?q?=E6=B0=B4=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5=20=E2=88=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/sa/MyStpLogic.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java b/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java index afcc9a12b..722672b62 100644 --- a/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java +++ b/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java @@ -203,13 +203,13 @@ public class MyStpLogic { } /** - * 获取店铺会员查询主店id + * 获取适用的店铺id(主分店模式使用,若全部开启同步返回主店id。若未开启同步则返回分店id) * * @return 主店id */ - public Long getVipHeadShopId() { + public Long getUsableShopId() { Long shopId = getShopId(0L); - Long mainId = DbChain.table("tb_shop_config").select("main_id").where("id = ? and is_enable_vip_sync = ?", shopId, 1).objAs(Long.class); + Long mainId = DbChain.table("tb_shop_config").select("main_id").where("id = ? and is_enable_prod_sync = 1 and is_enable_vip_sync = 1 and is_enable_cons_sync = 1", shopId).objAs(Long.class); if (mainId != null) { return mainId; } @@ -218,6 +218,7 @@ public class MyStpLogic { /** * 获取主店id + * * @return 主店id */ public Long getHeadShopId() { @@ -231,6 +232,7 @@ public class MyStpLogic { /** * 获取主店id + * * @param shopId 店铺id * @return 主店id */ @@ -244,6 +246,7 @@ public class MyStpLogic { /** * 是否启用同步功能 + * * @param shopId 店铺id * @return 主店id */ From 4c15fc12d2162492376bc95641c3d7b6675afb00 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Fri, 11 Apr 2025 17:47:27 +0800 Subject: [PATCH 103/162] =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=BA=97=E9=93=BA?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=20=E2=88=9A=20=E4=B8=8B=E5=8D=95=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E4=BC=9A=E5=91=98=20=E2=88=9A=20=E5=AE=8C=E5=96=84=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E5=8F=B7=20=E2=88=9A=20=E4=BC=9A=E5=91=98=E6=B5=81?= =?UTF-8?q?=E6=B0=B4=E4=BF=A1=E6=81=AF=E5=90=8C=E6=AD=A5=20=E2=88=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/config/SaTokenConfigure.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java b/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java index cf58f9514..c07aac7fc 100644 --- a/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java +++ b/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java @@ -61,17 +61,15 @@ public class SaTokenConfigure implements WebMvcConfigurer { SaRouter.match("/user/**").notMatch("/user/login", "/user/test", "/user/geo/**", "/user/home/**", "/user/home/**", "/user/dict/**", "/user/openId") .notMatch("/pay/**") - .notMatch("/order/notify/**") - .notMatch("/user/product/**") + .notMatch("/notify/**") .check(r -> MyStpLogic.CLIENT_LOGIC.checkLogin()) .setHit(true) // .match("/**") .notMatch("/user/**") .notMatch("/pay/**") - .notMatch("/order/notify/**") - .notMatch("/account/admin/auth/**") - .notMatch("/user/product/**") - .notMatch("/account/admin/shopMsgPush/subscribe/**") + .notMatch("/notify/**") + .notMatch("/admin/auth/**") + .notMatch("/admin/shopMsgPush/subscribe/**") .check(r -> MyStpLogic.ADMIN_LOGIC.checkLogin()); })).addPathPatterns("/**"); From 4b9587bae559732c5ef485043f2ed4dcdc27ac9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Sat, 12 Apr 2025 10:31:17 +0800 Subject: [PATCH 104/162] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/controller/admin/SyncNoticeController.java | 2 +- .../src/main/java/com/czg/product/dto/SyncNoticeReadDTO.java | 1 - .../service/account/service/impl/SyncNoticeServiceImpl.java | 3 +++ 3 files changed, 4 insertions(+), 2 deletions(-) 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 index 534759847..ff13ad298 100644 --- 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 @@ -50,7 +50,7 @@ public class SyncNoticeController { /** - * 已读消息 + * 已读消息, 不传递已读所有 * @return 是否成功 */ @PutMapping("/read") 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 index 89838a2a5..481b2b17c 100644 --- 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 @@ -13,6 +13,5 @@ public class SyncNoticeReadDTO { /** * 消息id */ - @NotEmpty private List noticeIdList; } 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 index f323c7ae9..8c52b1a1c 100644 --- 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 @@ -83,6 +83,9 @@ public class SyncNoticeServiceImpl extends ServiceImpl listed = list(new QueryWrapper().eq(SyncNotice::getShopId, shopId).in(SyncNotice::getId, syncNoticeReadDTO.getNoticeIdList())); listed.forEach(item -> { if (item.getIsRead() == 0) { From 69ba9ec48c3f4f41216a45719b25985cfedf8b65 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Sat, 12 Apr 2025 10:45:45 +0800 Subject: [PATCH 105/162] =?UTF-8?q?=E5=BA=97=E9=93=BA=E6=BF=80=E6=B4=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/account/service/impl/ShopInfoServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index f565d9254..e9193fa92 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -256,7 +256,7 @@ public class ShopInfoServiceImpl extends ServiceImpl i String shopType = shopInfo.getShopType(); Long mainId = shopInfo.getMainId(); Integer isHeadShop = shopInfo.getIsHeadShop(); - if (shopType.equals(shopInfoEditDTO.getShopType())) { + if (StrUtil.isEmpty(shopInfoEditDTO.getShopType()) || shopType.equals(shopInfoEditDTO.getShopType())) { // 原来是单店,现在不是单店,那么就允许修改,否则不允许修改 } else if (ShopTypeEnum.ONLY.getValue().equals(shopType) && !ShopTypeEnum.ONLY.getValue().equals(shopInfoEditDTO.getShopType())) { if (shopInfoEditDTO.getIsHeadShop() == null) { From ffb4a5eb46e9e14a78515a8fa443ff055886623d Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 11:09:30 +0800 Subject: [PATCH 106/162] =?UTF-8?q?=E4=BE=9B=E5=BA=94=E5=95=86=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/product/entity/ShopVendor.java | 1 + .../czg/product/service/ShopSyncService.java | 8 +++ .../service/impl/ShopSyncServiceImpl.java | 64 +++++++++++++++++++ sqls/250403/tb_shop_vendor.sql | 2 + 4 files changed, 75 insertions(+) create mode 100644 sqls/250403/tb_shop_vendor.sql diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopVendor.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopVendor.java index e419707cc..4aa4297da 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopVendor.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ShopVendor.java @@ -32,6 +32,7 @@ public class ShopVendor implements Serializable { * 店铺Id */ private Long shopId; + private Long syncId; /** * 排序 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java index bb78ac196..f1620def1 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ShopSyncService.java @@ -77,4 +77,12 @@ public interface ShopSyncService { * @param sourceProdId 主店商品ID */ void syncConsProBySourceShop(Long sourceShopId, Long sourceProdId, Long sysUserId); + + /** + * 同步供应商 开了同步耗材开关的子店铺 + * + * @param sourceShopId 主店ID + * @param vendorId 供应商Id + */ + void syncVendorBySourceShop(Long sourceShopId, Long vendorId, Long sysUserId); } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 5c6b31835..ca2b980e0 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -69,6 +69,8 @@ public class ShopSyncServiceImpl implements ShopSyncService { private ProdConsRelationService prodConsRelationService; @Resource private ShopUserService shopUserService; + @Resource + private ShopVendorService vendorService; @DubboReference private SyncNoticeService syncNoticeService; @@ -154,6 +156,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { Map conGroupMap = syncConsGroup(sourceShopId, targetShopId, mainMapList); Map consInfoMap = syncConsInfo(sourceShopId, targetShopId, conGroupMap, mainMapList); syncConsPro(sourceShopId, targetShopId, consInfoMap, proMap); + syncVendor(sourceShopId, targetShopId, mainMapList); syncNoticeService.addNotice(targetShopId, sysUserId, "数据同步", JSON.toJSONString(mainMapList), null); } catch (Exception e) { log.error("同步异常", e); @@ -1017,6 +1020,67 @@ public class ShopSyncServiceImpl implements ShopSyncService { } } + public Map syncVendor(Long sourceShopId, Long pointShopId, List> mainMapList) { + Map vendorMap = new HashMap<>(); + List pointShopVendor = vendorService.queryChain().select(ShopVendor::getSyncId) + .eq(ShopVendor::getShopId, pointShopId) + .isNotNull(ShopVendor::getSyncId) + .listAs(Long.class); + + List list = vendorService.queryChain().eq(ShopVendor::getShopId, sourceShopId).list(); + list.forEach(vendor -> { + if (CollUtil.isEmpty(pointShopVendor) || !pointShopVendor.contains(vendor.getId())) { + ShopVendor vendorNew = BeanUtil.copyProperties(vendor, ShopVendor.class); + vendorNew.setId(null); + vendorNew.setSyncId(vendor.getId()); + vendorNew.setShopId(pointShopId); + vendorService.save(vendorNew); + vendorMap.put(vendor.getId(), vendorNew.getId()); + } + }); + buildNotice(mainMapList, "单位同步", vendorMap.size(), null, null); + log.info("供应商同步,源{}个,已有{}个,同步{}个", list.size(), pointShopVendor.size(), vendorMap.size()); + return vendorMap; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncVendorBySourceShop(Long sourceShopId, Long vendorId, Long sysUserId) { + assertAutoSync(sourceShopId); + AssertUtil.isNull(vendorId, "{}不能为空", "供应商ID"); + Set shopIds = checkSourceShopInfo(sourceShopId, 2); + if (CollUtil.isEmpty(shopIds)) { + return; + } + ShopVendor mainVendor = vendorService.getById(vendorId); + AssertUtil.isNull(mainVendor, "需要同步的{}不存在", "单位"); + List list = vendorService.queryChain().eq(ShopVendor::getSyncId, vendorId).in(ShopVendor::getShopId, shopIds).list(); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + map = list.stream().collect(Collectors.toMap(ShopVendor::getShopId, t -> t)); + } + Map finalMap = map; + shopIds.forEach(shopId -> { + List> mainMapList = new ArrayList<>(); + Map vendorDataMap = new HashMap<>(); + ShopVendor newVendor = BeanUtil.copyProperties(mainVendor, ShopVendor.class); + + newVendor.setSyncId(mainVendor.getId()); + newVendor.setShopId(shopId); + if (finalMap.containsKey(shopId)) { + ShopVendor vendor = finalMap.get(shopId); + newVendor.setId(vendor.getId()); + vendorService.updateById(newVendor); + } else { + newVendor.setId(null); + vendorService.save(newVendor); + } + vendorDataMap.put(newVendor.getId(), newVendor.getName()); + buildNotice(mainMapList, "供应商变动", 1, "vendor", vendorDataMap); + syncNoticeService.addNotice(shopId, sysUserId, "数据变动", JSON.toJSONString(mainMapList), JSON.toJSONString(newVendor)); + }); + } + /** * 断言是否支持自动同步 * diff --git a/sqls/250403/tb_shop_vendor.sql b/sqls/250403/tb_shop_vendor.sql new file mode 100644 index 000000000..4979c7f07 --- /dev/null +++ b/sqls/250403/tb_shop_vendor.sql @@ -0,0 +1,2 @@ +ALTER TABLE `tb_shop_vendor` + ADD COLUMN `sync_id` bigint NULL DEFAULT NULL COMMENT '同步Id' AFTER `id`; \ No newline at end of file From c660421d393a7b1b0081c01d81e40fd1d23abb0f Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Sat, 12 Apr 2025 11:17:44 +0800 Subject: [PATCH 107/162] =?UTF-8?q?=E5=91=98=E5=B7=A5=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E4=B8=BB=E5=BA=97=E4=B8=8D=E9=9C=80=E8=A6=81=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E4=B8=BB=E5=BA=97=E4=B8=8B=E9=9D=A2=E7=9A=84=E5=88=86=E5=BA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/account/service/impl/ShopInfoServiceImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index e9193fa92..83bc8fd54 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -16,6 +16,7 @@ import com.czg.enums.YesNoEnum; import com.czg.exception.ApiNotPrintException; import com.czg.exception.CzgException; import com.czg.resp.CzgResult; +import com.czg.sa.MyStpLogic; import com.czg.sa.StpKit; import com.czg.service.RedisService; import com.czg.service.account.mapper.ShopInfoMapper; @@ -380,6 +381,10 @@ public class ShopInfoServiceImpl extends ServiceImpl i head.setShopId(shopInfo.getId()); head.setShopName(shopInfo.getShopName()); list.add(head); + MyStpLogic.LoginType loginType = (MyStpLogic.LoginType) StpKit.USER.getSession().get("loginType"); + if(loginType.compareTo(MyStpLogic.LoginType.STAFF) == 0){ + return list; + } List branchList = mapper.selectListByQuery(query().select(ShopInfo::getId, ShopInfo::getShopName).eq(ShopInfo::getMainId, shopId).orderBy(ShopInfo::getId, true)); for (ShopInfo info : branchList) { ShopBranchSelectDTO branch = new ShopBranchSelectDTO(); From bd8f5caa8fad626df906583f63b7b1853598682c Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Sat, 12 Apr 2025 11:24:52 +0800 Subject: [PATCH 108/162] =?UTF-8?q?=E5=BA=97=E9=93=BA=E4=BE=9B=E5=BA=94?= =?UTF-8?q?=E5=95=86=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/ShopVendorController.java | 22 +++++++++++++++++++ .../service/impl/ShopVendorServiceImpl.java | 1 + 2 files changed, 23 insertions(+) diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java index 95f7f7f41..ca4d44b8c 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ShopVendorController.java @@ -1,8 +1,10 @@ package com.czg.controller.admin; +import cn.hutool.core.thread.ThreadUtil; import com.czg.log.annotation.OperationLog; import com.czg.product.dto.ShopVendorBillPayDTO; import com.czg.product.dto.ShopVendorDTO; +import com.czg.product.service.ShopSyncService; import com.czg.product.service.ShopVendorService; import com.czg.product.vo.ShopVendorBillPayRecordVO; import com.czg.product.vo.ShopVendorBillRecordVO; @@ -15,6 +17,7 @@ import com.czg.validator.group.DefaultGroup; import com.czg.validator.group.InsertGroup; import com.czg.validator.group.UpdateGroup; import com.mybatisflex.core.paginate.Page; +import jakarta.annotation.Resource; import lombok.AllArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -33,6 +36,8 @@ import java.util.List; @RequestMapping("/admin/product/vendor") public class ShopVendorController { private final ShopVendorService shopVendorService; + @Resource + private ShopSyncService shopSyncService; /** * 分页 @@ -77,6 +82,7 @@ public class ShopVendorController { //@SaAdminCheckPermission("shopVendor:add") public CzgResult addShopVendor(@RequestBody @Validated({InsertGroup.class, DefaultGroup.class}) ShopVendorDTO dto) { shopVendorService.addShopVendor(dto); + asyncToBranchShop(dto.getId()); return CzgResult.success(); } @@ -88,11 +94,13 @@ public class ShopVendorController { //@SaAdminCheckPermission("shopVendor:update") public CzgResult updateShopVendor(@RequestBody @Validated({UpdateGroup.class, DefaultGroup.class}) ShopVendorDTO dto) { shopVendorService.updateShopVendor(dto); + asyncToBranchShop(dto.getId()); return CzgResult.success(); } /** * 删除 + * * @param id 供应商id */ @DeleteMapping("{id}") @@ -102,11 +110,13 @@ public class ShopVendorController { //效验数据 AssertUtil.isNull(id, "{}不能为空", "id"); shopVendorService.deleteShopVendor(id); + asyncToBranchShop(id); return CzgResult.success(); } /** * 供应商账单统计 + * * @return 统计信息 */ @GetMapping("summary") @@ -117,6 +127,7 @@ public class ShopVendorController { /** * 账单列表 + * * @return 账单列表 */ @GetMapping("/bill") @@ -127,6 +138,7 @@ public class ShopVendorController { /** * 账单记录 + * * @return 记录list */ @GetMapping("/bill/record") @@ -138,6 +150,7 @@ public class ShopVendorController { /** * 账单支付 + * * @return 记录list */ @PostMapping("/bill/pay") @@ -149,6 +162,7 @@ public class ShopVendorController { /** * 账单支付记录 + * * @return 记录list */ @GetMapping("/bill/pay/record") @@ -157,4 +171,12 @@ public class ShopVendorController { return CzgResult.success(shopVendorService.payRecord(StpKit.USER.getShopId(), flowId)); } + private void asyncToBranchShop(Long id) { + long shopId = StpKit.USER.getShopId(0L); + long sysUserId = StpKit.USER.getLoginIdAsLong(); + ThreadUtil.execAsync(() -> { + shopSyncService.syncVendorBySourceShop(shopId, id, sysUserId); + }); + } + } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java index 1005e1647..f1cbf4db6 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopVendorServiceImpl.java @@ -92,6 +92,7 @@ public class ShopVendorServiceImpl extends ServiceImpl Date: Sat, 12 Apr 2025 13:35:14 +0800 Subject: [PATCH 109/162] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=8E=BB=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/service/account/service/impl/SysMenuServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java index de2da001d..456b2157a 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/SysMenuServiceImpl.java @@ -51,6 +51,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl } List menuVos = allMenus.stream() + .distinct() .map(menu -> BeanUtil.copyProperties(menu, MenuVO.class)) .collect(Collectors.toList()); return buildMenuWithPermissions(menuVos); From ad803c859ef03fc314729ad55ff776c251ad97ac Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Sat, 12 Apr 2025 13:39:17 +0800 Subject: [PATCH 110/162] =?UTF-8?q?=E4=B8=BB=E5=BA=97=E5=91=98=E5=B7=A5?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BA=97=E9=93=BA=E9=85=8D=E7=BD=AEbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/account/service/impl/ShopInfoServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java index 83bc8fd54..768cabd35 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopInfoServiceImpl.java @@ -247,7 +247,7 @@ public class ShopInfoServiceImpl extends ServiceImpl i public Boolean edit(ShopInfoEditDTO shopInfoEditDTO) { ShopInfo shopInfo; if (!StpKit.USER.isAdmin()) { - shopInfo = queryChain().eq(ShopInfo::getId, StpKit.USER.getLoginIdAsLong()).one(); + shopInfo = queryChain().eq(ShopInfo::getId, StpKit.USER.getShopId()).one(); } else { shopInfo = getById(shopInfoEditDTO.getId()); } From d06c6b8bcc15428cd92c87bfe3a618765194e7fb Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 13:45:09 +0800 Subject: [PATCH 111/162] =?UTF-8?q?=E5=95=86=E5=93=81=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ShopSyncServiceImpl.java | 154 +++++++++--------- 1 file changed, 80 insertions(+), 74 deletions(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index ca2b980e0..d7783a1d9 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -467,86 +467,92 @@ public class ShopSyncServiceImpl implements ShopSyncService { @Override @Transactional(rollbackFor = Exception.class) public void syncProductBySourceShop(Long sourceShopId, Long productId, Long sysUserId) { - assertAutoSync(sourceShopId); - AssertUtil.isNull(productId, "{}不能为空", "商品ID"); - Set shopIds = checkSourceShopInfo(sourceShopId, 1); - if (CollUtil.isEmpty(shopIds)) { - return; - } - Product mainEntity = productService.getById(productId); - AssertUtil.isNull(mainEntity, "需要同步的{}不存在", "商品"); - List list = productService.queryChain().eq(Product::getSyncId, productId).in(Product::getShopId, shopIds).list(); - Map map = new HashMap<>(); - if (CollUtil.isNotEmpty(list)) { - map = list.stream().collect(Collectors.toMap(Product::getShopId, t -> t)); - } - Map specMap = new HashMap<>(); - if (mainEntity.getSpecId() != null) { - List specList = specService.queryChain().eq(ShopProdSpec::getSyncId, mainEntity.getSpecId()) - .in(ShopProdSpec::getShopId, shopIds).list(); - if (CollUtil.isNotEmpty(specList)) { - specMap = specList.stream().collect(Collectors.toMap(ShopProdSpec::getShopId, ShopProdSpec::getId)); + try { + log.info("商品同步开始,源店铺ID:{},商品ID:{}", sourceShopId, productId); + assertAutoSync(sourceShopId); + AssertUtil.isNull(productId, "{}不能为空", "商品ID"); + Set shopIds = checkSourceShopInfo(sourceShopId, 1); + if (CollUtil.isEmpty(shopIds)) { + return; } - } - Map unitMap = new HashMap<>(); - Set sysUnitMap = new HashSet<>(); - if (mainEntity.getUnitId() != null) { - List unitList = unitService.queryChain().eq(ShopProdUnit::getSyncId, mainEntity.getUnitId()) - .in(ShopProdUnit::getShopId, shopIds).list(); - if (CollUtil.isNotEmpty(unitList)) { - unitMap = unitList.stream().collect(Collectors.toMap(ShopProdUnit::getShopId, ShopProdUnit::getId)); + Product mainEntity = productService.getById(productId); + AssertUtil.isNull(mainEntity, "需要同步的{}不存在", "商品"); + List list = productService.queryChain().eq(Product::getSyncId, productId).in(Product::getShopId, shopIds).list(); + Map map = new HashMap<>(); + if (CollUtil.isNotEmpty(list)) { + map = list.stream().collect(Collectors.toMap(Product::getShopId, t -> t)); } - for (ShopProdUnit shopProdUnit : unitService.queryChain().eq(ShopProdUnit::getIsSystem, 1).list()) { - sysUnitMap.add(shopProdUnit.getId()); - } - } - Map categoryMap = new HashMap<>(); - if (mainEntity.getCategoryId() != null) { - List categoryList = categoryService.queryChain().eq(ShopProdCategory::getSyncId, mainEntity.getCategoryId()).in(ShopProdCategory::getShopId, shopIds).list(); - if (CollUtil.isNotEmpty(categoryList)) { - categoryMap = categoryList.stream().collect(Collectors.toMap(ShopProdCategory::getShopId, ShopProdCategory::getId)); - } - } - Map finalMap = map; - for (Long shopId : shopIds) { - List> mainMapList = new ArrayList<>(); - Map dataMap = new HashMap<>(); - Product newEntity = BeanUtil.copyProperties(mainEntity, Product.class); - newEntity.setSyncId(mainEntity.getSyncId()); - newEntity.setShopId(shopId); - newEntity.setCategoryId(newEntity.getCategoryId() != null ? categoryMap.get(shopId) : null); - newEntity.setSpecId(newEntity.getSpecId() != null ? specMap.get(shopId) : null); - if (newEntity.getUnitId() != null) { - if (!sysUnitMap.contains(newEntity.getUnitId())) { - newEntity.setUnitId(unitMap.get(shopId)); + Map specMap = new HashMap<>(); + if (mainEntity.getSpecId() != null) { + List specList = specService.queryChain().eq(ShopProdSpec::getSyncId, mainEntity.getSpecId()) + .in(ShopProdSpec::getShopId, shopIds).list(); + if (CollUtil.isNotEmpty(specList)) { + specMap = specList.stream().collect(Collectors.toMap(ShopProdSpec::getShopId, ShopProdSpec::getId)); } } - if (finalMap.containsKey(shopId)) { - Product childEntity = finalMap.get(shopId); - newEntity.setId(childEntity.getId()); - newEntity.setStartTime(null); - newEntity.setEndTime(null); - newEntity.setDays(null); - newEntity.setIsHot(null); - newEntity.setIsStock(null); - newEntity.setIsSoldStock(null); - newEntity.setStockNumber(null); - newEntity.setIsSale(null); - newEntity.setIsRefundStock(null); - productService.updateById(newEntity); - } else { - newEntity.setId(null); - newEntity.setIsSale(0); - newEntity.setStockNumber(0); - productService.save(newEntity); + Map unitMap = new HashMap<>(); + Set sysUnitMap = new HashSet<>(); + if (mainEntity.getUnitId() != null) { + List unitList = unitService.queryChain().eq(ShopProdUnit::getSyncId, mainEntity.getUnitId()) + .in(ShopProdUnit::getShopId, shopIds).list(); + if (CollUtil.isNotEmpty(unitList)) { + unitMap = unitList.stream().collect(Collectors.toMap(ShopProdUnit::getShopId, ShopProdUnit::getId)); + } + for (ShopProdUnit shopProdUnit : unitService.queryChain().eq(ShopProdUnit::getIsSystem, 1).list()) { + sysUnitMap.add(shopProdUnit.getId()); + } } - syncSkuBySourceShop(sourceShopId, shopId, productId, newEntity.getId()); - if ("package".equals(newEntity.getType()) || "coupon".equals(newEntity.getType())) { - syncProductPackageBySourceShop(newEntity, shopId); + Map categoryMap = new HashMap<>(); + if (mainEntity.getCategoryId() != null) { + List categoryList = categoryService.queryChain().eq(ShopProdCategory::getSyncId, mainEntity.getCategoryId()).in(ShopProdCategory::getShopId, shopIds).list(); + if (CollUtil.isNotEmpty(categoryList)) { + categoryMap = categoryList.stream().collect(Collectors.toMap(ShopProdCategory::getShopId, ShopProdCategory::getId)); + } } - dataMap.put(newEntity.getId(), newEntity.getName()); - buildNotice(mainMapList, "商品变动", 1, "product", dataMap); - syncNoticeService.addNotice(shopId, sysUserId, "数据变动", JSON.toJSONString(mainMapList), JSON.toJSONString(newEntity)); + Map finalMap = map; + for (Long shopId : shopIds) { + List> mainMapList = new ArrayList<>(); + Map dataMap = new HashMap<>(); + Product newEntity = BeanUtil.copyProperties(mainEntity, Product.class); + newEntity.setSyncId(mainEntity.getSyncId()); + newEntity.setShopId(shopId); + newEntity.setCategoryId(newEntity.getCategoryId() != null ? categoryMap.get(shopId) : null); + newEntity.setSpecId(newEntity.getSpecId() != null ? specMap.get(shopId) : null); + if (newEntity.getUnitId() != null) { + if (!sysUnitMap.contains(newEntity.getUnitId())) { + newEntity.setUnitId(unitMap.get(shopId)); + } + } + if (finalMap.containsKey(shopId)) { + Product childEntity = finalMap.get(shopId); + newEntity.setId(childEntity.getId()); + newEntity.setStartTime(null); + newEntity.setEndTime(null); + newEntity.setDays(null); + newEntity.setIsHot(null); + newEntity.setIsStock(null); + newEntity.setIsSoldStock(null); + newEntity.setStockNumber(null); + newEntity.setIsSale(null); + newEntity.setIsRefundStock(null); + productService.updateById(newEntity); + } else { + newEntity.setId(null); + newEntity.setIsSale(0); + newEntity.setStockNumber(0); + productService.save(newEntity); + } + syncSkuBySourceShop(sourceShopId, shopId, productId, newEntity.getId()); + if ("package".equals(newEntity.getType()) || "coupon".equals(newEntity.getType())) { + syncProductPackageBySourceShop(newEntity, shopId); + } + dataMap.put(newEntity.getId(), newEntity.getName()); + buildNotice(mainMapList, "商品变动", 1, "product", dataMap); + syncNoticeService.addNotice(shopId, sysUserId, "数据变动", JSON.toJSONString(mainMapList), JSON.toJSONString(newEntity)); + } + } catch (Exception e) { + log.error("商品同步异常", e); + throw new CzgException("商品同步失败"); } } From fda1d5f9a5c7af8d054f3ad7c756e6af3741a2de Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Sat, 12 Apr 2025 14:36:06 +0800 Subject: [PATCH 112/162] =?UTF-8?q?=E5=95=86=E5=93=81=E5=90=8C=E6=AD=A5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/product/service/impl/ProductServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java index 571e81cab..48fc010e9 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java @@ -245,6 +245,7 @@ public class ProductServiceImpl extends ServiceImpl impl entity.setIsDel(DeleteEnum.NORMAL.value()); entity.setShopId(shopId); super.save(entity); + dto.setId(entity.getId()); List skuList = dto.getSkuList(); if (CollUtil.isNotEmpty(skuList)) { List prodSkuList = new ArrayList<>(); @@ -278,7 +279,6 @@ public class ProductServiceImpl extends ServiceImpl impl flow.setInOutType(InOutTypeEnum.IN.value()); flow.setInOutItem(InOutItemEnum.WIN_IN.value()); productStockFlowService.saveFlow(flow); - dto.setId(entity.getId()); } @Override From 86370e97814130391e5e685140ac763904336434 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 15:09:06 +0800 Subject: [PATCH 113/162] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=97=B6=20=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E5=90=8C=E6=AD=A5=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ShopSyncServiceImpl.java | 188 ++++++++++++++++-- 1 file changed, 166 insertions(+), 22 deletions(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index d7783a1d9..fda39d45c 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -196,14 +196,15 @@ public class ShopSyncServiceImpl implements ShopSyncService { public Map syncUnit(Long sourceShopId, Long pointShopId, List> mainMapList) { Map unitMap = new HashMap<>(); + Map unitEntityMap = new HashMap<>(); List pointShopUnits = new ArrayList<>(); - List pointUnits = unitService.queryChain() + List pointUnits = unitService.queryChain().select(ShopProdUnit::getSyncId) .eq(ShopProdUnit::getShopId, pointShopId) .isNotNull(ShopProdUnit::getSyncId) .list(); pointUnits.stream().forEach(tbShopUnit -> { - unitMap.put(tbShopUnit.getSyncId(), tbShopUnit.getId()); pointShopUnits.add(tbShopUnit.getSyncId()); + unitEntityMap.put(tbShopUnit.getSyncId(), tbShopUnit); }); List list = unitService.queryChain().eq(ShopProdUnit::getShopId, sourceShopId).list(); list.forEach(tbShopUnit -> { @@ -214,9 +215,17 @@ public class ShopSyncServiceImpl implements ShopSyncService { unitNew.setShopId(pointShopId); unitService.save(unitNew); unitMap.put(tbShopUnit.getId(), unitNew.getId()); + } else { + ShopProdUnit unit = unitEntityMap.get(tbShopUnit.getId()); + unit.setUnitType(tbShopUnit.getUnitType()); + unit.setName(tbShopUnit.getName()); + unit.setStatus(tbShopUnit.getStatus()); + unitService.updateById(unit, false); + unitMap.put(tbShopUnit.getSyncId(), tbShopUnit.getId()); } }); - buildNotice(mainMapList, "单位同步", unitMap.size() - pointShopUnits.size(), null, null); + buildNotice(mainMapList, "单位同步", pointShopUnits.size(), null, null); + buildNotice(mainMapList, "单位新增", unitMap.size() - pointShopUnits.size(), null, null); log.info("单位同步,源{}个,已有{}个,同步{}个", list.size(), pointShopUnits.size(), unitMap.size() - pointShopUnits.size()); return unitMap; } @@ -262,14 +271,16 @@ public class ShopSyncServiceImpl implements ShopSyncService { //规格 public Map syncSpec(Long sourceShopId, Long pointShopId, List> mainMapList) { Map specMap = new HashMap<>(); + Map specEntityMap = new HashMap<>(); List pointShopSpecs = new ArrayList<>(); + List newPointList = new ArrayList<>(); List pointList = specService.queryChain() .eq(ShopProdSpec::getShopId, pointShopId) .isNotNull(ShopProdSpec::getSyncId) .list(); for (ShopProdSpec shopProdSpec : pointList) { pointShopSpecs.add(shopProdSpec.getSyncId()); - specMap.put(shopProdSpec.getSyncId(), shopProdSpec.getId()); + specEntityMap.put(shopProdSpec.getSyncId(), shopProdSpec); } List list = specService.queryChain().eq(ShopProdSpec::getShopId, sourceShopId.toString()).list(); list.forEach(spec -> { @@ -279,11 +290,37 @@ public class ShopSyncServiceImpl implements ShopSyncService { newSpec.setSyncId(spec.getId()); newSpec.setShopId(pointShopId); specService.save(newSpec); + newPointList.add(newSpec); specMap.put(spec.getId(), newSpec.getId()); + } else { + ShopProdSpec newSpec = specEntityMap.get(spec.getId()); + newSpec.setName(spec.getName()); + newSpec.setFullName(spec.getFullName()); + newSpec.setLevel(spec.getLevel()); + newSpec.setSort(spec.getSort()); + newSpec.setStatus(spec.getStatus()); + specService.updateById(newSpec, false); + specMap.put(spec.getId(), newSpec.getId()); + newPointList.add(newSpec); } }); + for (ShopProdSpec shopProdSpec : newPointList) { + if (shopProdSpec.getPid() != null && !shopProdSpec.getPid().equals(0L)) { + shopProdSpec.setPid(specMap.get(shopProdSpec.getPid())); + String[] split = shopProdSpec.getPids().split(","); + for (String pid : split) { + if ("0".equals(pid)) { + shopProdSpec.setPids("0,"); + } else { + shopProdSpec.setPids(shopProdSpec.getPids() + specMap.get(Long.valueOf(pid)) + ","); + } + } + specService.updateById(shopProdSpec); + } + } log.info("规格同步,源{}个,已有{}个,同步{}个", list.size(), pointShopSpecs.size(), specMap.size() - pointShopSpecs.size()); - buildNotice(mainMapList, "规格同步", specMap.size() - pointShopSpecs.size(), null, null); + buildNotice(mainMapList, "规格同步", pointShopSpecs.size(), null, null); + buildNotice(mainMapList, "规格新增", specMap.size() - pointShopSpecs.size(), null, null); return specMap; } @@ -328,14 +365,16 @@ public class ShopSyncServiceImpl implements ShopSyncService { // 分类 public Map syncCategory(Long sourceShopId, Long pointShopId, List> mainMapList) { Map categoryMap = new HashMap<>(); + Map categoryEntityMap = new HashMap<>(); List pointShopCateGory = new ArrayList<>(); + List newPointShopCateGory = new ArrayList<>(); List pointList = categoryService.queryChain() .eq(ShopProdCategory::getShopId, pointShopId) .isNotNull(ShopProdCategory::getSyncId) .list(); for (ShopProdCategory shopProdCategory : pointList) { pointShopCateGory.add(shopProdCategory.getSyncId()); - categoryMap.put(shopProdCategory.getSyncId(), shopProdCategory.getId()); + categoryEntityMap.put(shopProdCategory.getSyncId(), shopProdCategory); } List tbShopCategories = categoryService.queryChain() .eq(ShopProdCategory::getShopId, sourceShopId) @@ -351,10 +390,22 @@ public class ShopSyncServiceImpl implements ShopSyncService { tbShopCategoryNew.setSyncId(shopProdCategory.getId()); categoryService.save(tbShopCategoryNew); categoryMap.put(shopProdCategory.getId(), tbShopCategoryNew.getId()); + newPointShopCateGory.add(tbShopCategoryNew); + } else { + ShopProdCategory tbShopCategoryNew = categoryEntityMap.get(shopProdCategory.getId()); + tbShopCategoryNew.setName(shopProdCategory.getName()); + tbShopCategoryNew.setShortName(shopProdCategory.getShortName()); + tbShopCategoryNew.setPic(shopProdCategory.getPic()); + tbShopCategoryNew.setDetail(shopProdCategory.getDetail()); + tbShopCategoryNew.setSort(shopProdCategory.getSort()); + tbShopCategoryNew.setKeyWord(shopProdCategory.getKeyWord()); + tbShopCategoryNew.setStatus(shopProdCategory.getStatus()); + categoryService.updateById(tbShopCategoryNew, false); + categoryMap.put(shopProdCategory.getId(), tbShopCategoryNew.getId()); + newPointShopCateGory.add(tbShopCategoryNew); } } int childrenSize = 0; - int syncSize = categoryMap.size(); if (CollectionUtil.isNotEmpty(treeIds)) { List children = categoryService.queryChain() .eq(ShopProdCategory::getShopId, sourceShopId) @@ -370,12 +421,28 @@ public class ShopSyncServiceImpl implements ShopSyncService { tbShopCategoryNew.setPid(categoryMap.get(child.getPid())); categoryService.save(tbShopCategoryNew); categoryMap.put(child.getId(), tbShopCategoryNew.getId()); + newPointShopCateGory.add(tbShopCategoryNew); + } else { + ShopProdCategory tbShopCategoryNew = categoryEntityMap.get(child.getId()); + tbShopCategoryNew.setName(child.getName()); + tbShopCategoryNew.setShortName(child.getShortName()); + tbShopCategoryNew.setPic(child.getPic()); + tbShopCategoryNew.setDetail(child.getDetail()); + tbShopCategoryNew.setSort(child.getSort()); + tbShopCategoryNew.setKeyWord(child.getKeyWord()); + tbShopCategoryNew.setStatus(child.getStatus()); + categoryService.updateById(tbShopCategoryNew, false); + categoryMap.put(child.getId(), tbShopCategoryNew.getId()); + newPointShopCateGory.add(tbShopCategoryNew); } } } - log.info("分类同步,源 父类分类{}个,同步{}个", tbShopCategories.size(), syncSize); - log.info("分类同步,源 子类分类{}个,同步{}个", childrenSize, categoryMap.size() - syncSize); - buildNotice(mainMapList, "分类同步", categoryMap.size(), null, null); +// for (ShopProdCategory shopProdCategory : newPointShopCateGory) { +// shopProdCategory.getPid() +// } + log.info("分类同步,同步{}个", categoryMap.size()); + buildNotice(mainMapList, "分类同步", tbShopCategories.size() + childrenSize - pointShopCateGory.size(), null, null); + buildNotice(mainMapList, "分类新增", categoryMap.size() - pointShopCateGory.size(), null, null); return categoryMap; } @@ -427,6 +494,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { public Map syncProduct(Long sourceShopId, Long pointShopId, Map unitMap, Map specMap, Map cateGoryMap, List> mainMapList) { Map proMap = new HashMap<>(); + Map pointMap = new HashMap<>(); List pointProducts = new ArrayList<>(); List pointList = productService.queryChain() .eq(Product::getShopId, pointShopId) @@ -434,7 +502,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { .list(); for (Product product : pointList) { pointProducts.add(product.getSyncId()); - proMap.put(product.getSyncId(), product.getId()); + pointMap.put(product.getSyncId(), product); } List products = productService.queryChain().eq(Product::getShopId, sourceShopId).list(); if (CollectionUtil.isNotEmpty(products)) { @@ -456,11 +524,31 @@ public class ShopSyncServiceImpl implements ShopSyncService { } productService.save(tbProductNew); proMap.put(tbProduct.getId(), tbProductNew.getId()); + } else { + Product tbProductNew = pointMap.get(tbProduct.getId()); + tbProductNew.setCategoryId(tbProduct.getCategoryId() != null ? cateGoryMap.get(tbProduct.getCategoryId()) : null); + tbProductNew.setSpecId(tbProduct.getSpecId() != null ? specMap.get(tbProduct.getSpecId()) : null); + tbProductNew.setUnitId(tbProduct.getUnitId() != null ? unitMap.get(tbProduct.getUnitId()) : null); + tbProductNew.setName(tbProduct.getName()); + tbProductNew.setShortTitle(tbProduct.getShortTitle()); + tbProductNew.setType(tbProduct.getType()); + tbProductNew.setGroupType(tbProduct.getGroupType()); + tbProductNew.setPackFee(tbProduct.getPackFee()); + tbProductNew.setCoverImg(tbProduct.getCoverImg()); + tbProductNew.setImages(tbProduct.getImages()); + tbProductNew.setWarnLine(tbProduct.getWarnLine()); + tbProductNew.setWeight(tbProduct.getWeight()); + tbProductNew.setSelectSpecInfo(tbProduct.getSelectSpecInfo()); + tbProductNew.setSort(tbProduct.getSort()); + tbProductNew.setIsDel(tbProduct.getIsDel()); + productService.updateById(tbProductNew, false); + proMap.put(tbProductNew.getSyncId(), tbProductNew.getId()); } } } log.info("商品同步,源{}个,已有{}个,同步{}个", products.size(), pointProducts.size(), proMap.size() - pointProducts.size()); - buildNotice(mainMapList, "商品同步", proMap.size() - pointProducts.size(), null, null); + buildNotice(mainMapList, "商品同步", pointProducts.size(), null, null); + buildNotice(mainMapList, "商品新增", proMap.size() - pointProducts.size(), null, null); return proMap; } @@ -751,10 +839,16 @@ public class ShopSyncServiceImpl implements ShopSyncService { //分组 public Map syncSku(Long sourceShopId, Long pointShopId, Map prods) { Map skuMap = new HashMap<>(); - List pointSkus = skuService.queryChain().select(ProdSku::getSyncId) + Map pointSkuMap = new HashMap<>(); + List pointSkus = new ArrayList<>(); + List skus = skuService.queryChain() .eq(ProdSku::getShopId, pointShopId) .isNotNull(ProdSku::getSyncId) - .listAs(Long.class); + .list(); + skus.forEach(tbShopSku -> { + pointSkus.add(tbShopSku.getSyncId()); + pointSkuMap.put(tbShopSku.getSyncId(), tbShopSku); + }); List list = skuService.queryChain().eq(ProdSku::getShopId, sourceShopId).list(); for (ProdSku prodSku : list) { if (prods.containsKey(prodSku.getProductId()) && (CollUtil.isEmpty(pointSkus) || !pointSkus.contains(prodSku.getId()))) { @@ -765,6 +859,13 @@ public class ShopSyncServiceImpl implements ShopSyncService { newSku.setSyncId(prodSku.getId()); skuService.save(newSku); skuMap.put(prodSku.getId(), newSku.getId()); + } else { + ProdSku newSku = pointSkuMap.get(prodSku.getId()); + newSku.setSpecInfo(prodSku.getSpecInfo()); + newSku.setCoverImg(prodSku.getCoverImg()); + newSku.setIsDel(prodSku.getIsDel()); + skuService.updateById(newSku, false); + skuMap.put(prodSku.getId(), newSku.getId()); } } log.info("商品SKU同步,源{}个,已有{}个,同步{}个", list.size(), pointSkus.size(), skuMap.size()); @@ -805,6 +906,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { public Map syncConsGroup(Long sourceShopId, Long pointShopId, List> mainMapList) { Map consGroupMap = new HashMap<>(); + Map pointConsGroupMap = new HashMap<>(); List pointConsGroup = new ArrayList<>(); List consGroupList = consGroupService.queryChain() .eq(ConsGroup::getShopId, pointShopId) @@ -812,7 +914,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { .list(); for (ConsGroup consGroup : consGroupList) { pointConsGroup.add(consGroup.getSyncId()); - consGroupMap.put(consGroup.getSyncId(), consGroup.getId()); + pointConsGroupMap.put(consGroup.getSyncId(), consGroup); } List list = consGroupService.queryChain().eq(ConsGroup::getShopId, sourceShopId).list(); for (ConsGroup consGroup : list) { @@ -823,10 +925,17 @@ public class ShopSyncServiceImpl implements ShopSyncService { newConsGroup.setShopId(pointShopId); consGroupService.save(newConsGroup); consGroupMap.put(consGroup.getId(), newConsGroup.getId()); + } else { + ConsGroup newConsGroup = pointConsGroupMap.get(consGroup.getId()); + newConsGroup.setName(consGroup.getName()); + newConsGroup.setStatus(consGroup.getStatus()); + consGroupService.updateById(newConsGroup, false); + consGroupMap.put(consGroup.getId(), newConsGroup.getId()); } } log.info("耗材分组同步,源{}个,已有{}个,同步{}个", list.size(), pointConsGroup.size(), consGroupMap.size() - pointConsGroup.size()); - buildNotice(mainMapList, "耗材分组同步", consGroupMap.size() - pointConsGroup.size(), null, null); + buildNotice(mainMapList, "耗材分组同步", pointConsGroup.size(), null, null); + buildNotice(mainMapList, "耗材分组新增", consGroupMap.size() - pointConsGroup.size(), null, null); return consGroupMap; } @@ -870,6 +979,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { // 耗材 public Map syncConsInfo(Long sourceShopId, Long pointShopId, Map consGroupMap, List> mainMapList) { Map consMap = new HashMap<>(); + Map pointConsMap = new HashMap<>(); List pointConsInfo = new ArrayList<>(); List pointList = consInfoService.queryChain() .eq(ConsInfo::getShopId, pointShopId) @@ -877,7 +987,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { .list(); for (ConsInfo consInfo : pointList) { pointConsInfo.add(consInfo.getSyncId()); - consMap.put(consInfo.getSyncId(), consInfo.getId()); + pointConsMap.put(consInfo.getSyncId(), consInfo); } List list = consInfoService.queryChain().eq(ConsInfo::getShopId, sourceShopId).list(); for (ConsInfo cons : list) { @@ -890,10 +1000,25 @@ public class ShopSyncServiceImpl implements ShopSyncService { conInfo.setStockNumber(BigDecimal.ZERO); consInfoService.save(conInfo); consMap.put(cons.getId(), conInfo.getId()); + } else { + ConsInfo conInfo = pointConsMap.get(cons.getId()); + conInfo.setConsGroupId(consGroupMap.get(conInfo.getConsGroupId())); + conInfo.setConName(cons.getConName()); + conInfo.setPrice(cons.getPrice()); + conInfo.setStatus(cons.getStatus()); + conInfo.setConUnit(cons.getConUnit()); + conInfo.setConWarning(cons.getConWarning()); + conInfo.setIsStock(cons.getIsStock()); + conInfo.setConUnitTwo(cons.getConUnitTwo()); + conInfo.setConUnitTwoConvert(cons.getConUnitTwoConvert()); + conInfo.setDefaultUnit(cons.getDefaultUnit()); + consInfoService.updateById(conInfo, false); + consMap.put(cons.getId(), conInfo.getId()); } } log.info("耗材同步,源{}个,已有{}个,同步{}个", list.size(), pointConsInfo.size(), consMap.size() - pointConsInfo.size()); - buildNotice(mainMapList, "耗材信息同步", consMap.size() - pointConsInfo.size(), null, null); + buildNotice(mainMapList, "耗材信息同步", pointConsInfo.size(), null, null); + buildNotice(mainMapList, "耗材信息新增", consMap.size() - pointConsInfo.size(), null, null); return consMap; } @@ -1028,11 +1153,16 @@ public class ShopSyncServiceImpl implements ShopSyncService { public Map syncVendor(Long sourceShopId, Long pointShopId, List> mainMapList) { Map vendorMap = new HashMap<>(); - List pointShopVendor = vendorService.queryChain().select(ShopVendor::getSyncId) + Map pointVendorMap = new HashMap<>(); + List pointShopVendor = new ArrayList<>(); + List pointShopVendorList = vendorService.queryChain() .eq(ShopVendor::getShopId, pointShopId) .isNotNull(ShopVendor::getSyncId) - .listAs(Long.class); - + .list(); + for (ShopVendor shopVendor : pointShopVendorList) { + pointShopVendor.add(shopVendor.getSyncId()); + pointVendorMap.put(shopVendor.getSyncId(), shopVendor); + } List list = vendorService.queryChain().eq(ShopVendor::getShopId, sourceShopId).list(); list.forEach(vendor -> { if (CollUtil.isEmpty(pointShopVendor) || !pointShopVendor.contains(vendor.getId())) { @@ -1042,9 +1172,23 @@ public class ShopSyncServiceImpl implements ShopSyncService { vendorNew.setShopId(pointShopId); vendorService.save(vendorNew); vendorMap.put(vendor.getId(), vendorNew.getId()); + } else { + ShopVendor vendorNew = pointVendorMap.get(vendor.getId()); + vendorNew.setSort(vendor.getSort()); + vendorNew.setName(vendor.getName()); + vendorNew.setContactName(vendor.getContactName()); + vendorNew.setTelephone(vendor.getTelephone()); + vendorNew.setAddress(vendor.getAddress()); + vendorNew.setPeriod(vendor.getPeriod()); + vendorNew.setTip(vendor.getTip()); + vendorNew.setRemark(vendor.getRemark()); + vendorNew.setIsDel(vendor.getIsDel()); + vendorService.updateById(vendorNew, false); + vendorMap.put(vendor.getId(), vendorNew.getId()); } }); - buildNotice(mainMapList, "单位同步", vendorMap.size(), null, null); + buildNotice(mainMapList, "供应商同步", pointShopVendor.size(), null, null); + buildNotice(mainMapList, "供应商新增", vendorMap.size() - pointShopVendor.size(), null, null); log.info("供应商同步,源{}个,已有{}个,同步{}个", list.size(), pointShopVendor.size(), vendorMap.size()); return vendorMap; } From 8f3f313a471f4d79c8c9d8359deade371384496e Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 15:20:33 +0800 Subject: [PATCH 114/162] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=97=B6=20=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E5=90=8C=E6=AD=A5=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/product/service/impl/ShopSyncServiceImpl.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index fda39d45c..e63d08c53 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -864,6 +864,14 @@ public class ShopSyncServiceImpl implements ShopSyncService { newSku.setSpecInfo(prodSku.getSpecInfo()); newSku.setCoverImg(prodSku.getCoverImg()); newSku.setIsDel(prodSku.getIsDel()); + newSku.setBarCode(prodSku.getBarCode()); + + newSku.setOriginPrice(prodSku.getOriginPrice()); + newSku.setCostPrice(prodSku.getCostPrice()); + newSku.setMemberPrice(prodSku.getMemberPrice()); + newSku.setSalePrice(prodSku.getSalePrice()); + newSku.setSuitNum(prodSku.getSuitNum()); + newSku.setWeight(prodSku.getWeight()); skuService.updateById(newSku, false); skuMap.put(prodSku.getId(), newSku.getId()); } From caf42d0b0ccf85909f12d03bdfc924bc2303d215 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 15:33:11 +0800 Subject: [PATCH 115/162] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=97=B6=20=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E5=90=8C=E6=AD=A5=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/product/service/impl/ShopSyncServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index e63d08c53..0b84a3885 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -198,7 +198,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { Map unitMap = new HashMap<>(); Map unitEntityMap = new HashMap<>(); List pointShopUnits = new ArrayList<>(); - List pointUnits = unitService.queryChain().select(ShopProdUnit::getSyncId) + List pointUnits = unitService.queryChain() .eq(ShopProdUnit::getShopId, pointShopId) .isNotNull(ShopProdUnit::getSyncId) .list(); From e1fab524f1310332f30fc7377a6c41881bdc280f Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 15:45:28 +0800 Subject: [PATCH 116/162] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=97=B6=20=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E5=90=8C=E6=AD=A5=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ShopSyncServiceImpl.java | 40 +++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 0b84a3885..6d6892431 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -207,7 +207,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { unitEntityMap.put(tbShopUnit.getSyncId(), tbShopUnit); }); List list = unitService.queryChain().eq(ShopProdUnit::getShopId, sourceShopId).list(); - list.forEach(tbShopUnit -> { + for (ShopProdUnit tbShopUnit : list) { if (CollUtil.isEmpty(pointShopUnits) || !pointShopUnits.contains(tbShopUnit.getId())) { ShopProdUnit unitNew = BeanUtil.copyProperties(tbShopUnit, ShopProdUnit.class); unitNew.setId(null); @@ -217,13 +217,16 @@ public class ShopSyncServiceImpl implements ShopSyncService { unitMap.put(tbShopUnit.getId(), unitNew.getId()); } else { ShopProdUnit unit = unitEntityMap.get(tbShopUnit.getId()); + if (unit == null) { + continue; + } unit.setUnitType(tbShopUnit.getUnitType()); unit.setName(tbShopUnit.getName()); unit.setStatus(tbShopUnit.getStatus()); unitService.updateById(unit, false); unitMap.put(tbShopUnit.getSyncId(), tbShopUnit.getId()); } - }); + }; buildNotice(mainMapList, "单位同步", pointShopUnits.size(), null, null); buildNotice(mainMapList, "单位新增", unitMap.size() - pointShopUnits.size(), null, null); log.info("单位同步,源{}个,已有{}个,同步{}个", list.size(), pointShopUnits.size(), unitMap.size() - pointShopUnits.size()); @@ -283,7 +286,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { specEntityMap.put(shopProdSpec.getSyncId(), shopProdSpec); } List list = specService.queryChain().eq(ShopProdSpec::getShopId, sourceShopId.toString()).list(); - list.forEach(spec -> { + for (ShopProdSpec spec : list) { if (CollUtil.isEmpty(pointShopSpecs) || !pointShopSpecs.contains(spec.getId())) { ShopProdSpec newSpec = BeanUtil.copyProperties(spec, ShopProdSpec.class); newSpec.setId(null); @@ -294,6 +297,9 @@ public class ShopSyncServiceImpl implements ShopSyncService { specMap.put(spec.getId(), newSpec.getId()); } else { ShopProdSpec newSpec = specEntityMap.get(spec.getId()); + if (newSpec == null) { + continue; + } newSpec.setName(spec.getName()); newSpec.setFullName(spec.getFullName()); newSpec.setLevel(spec.getLevel()); @@ -303,7 +309,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { specMap.put(spec.getId(), newSpec.getId()); newPointList.add(newSpec); } - }); + } for (ShopProdSpec shopProdSpec : newPointList) { if (shopProdSpec.getPid() != null && !shopProdSpec.getPid().equals(0L)) { shopProdSpec.setPid(specMap.get(shopProdSpec.getPid())); @@ -312,7 +318,9 @@ public class ShopSyncServiceImpl implements ShopSyncService { if ("0".equals(pid)) { shopProdSpec.setPids("0,"); } else { - shopProdSpec.setPids(shopProdSpec.getPids() + specMap.get(Long.valueOf(pid)) + ","); + if (!"null".equals(pid) && specMap.containsKey(Long.valueOf(pid))) { + shopProdSpec.setPids(shopProdSpec.getPids() + specMap.get(Long.valueOf(pid)) + ","); + } } } specService.updateById(shopProdSpec); @@ -393,6 +401,9 @@ public class ShopSyncServiceImpl implements ShopSyncService { newPointShopCateGory.add(tbShopCategoryNew); } else { ShopProdCategory tbShopCategoryNew = categoryEntityMap.get(shopProdCategory.getId()); + if (tbShopCategoryNew == null) { + continue; + } tbShopCategoryNew.setName(shopProdCategory.getName()); tbShopCategoryNew.setShortName(shopProdCategory.getShortName()); tbShopCategoryNew.setPic(shopProdCategory.getPic()); @@ -526,6 +537,9 @@ public class ShopSyncServiceImpl implements ShopSyncService { proMap.put(tbProduct.getId(), tbProductNew.getId()); } else { Product tbProductNew = pointMap.get(tbProduct.getId()); + if (tbProductNew == null) { + continue; + } tbProductNew.setCategoryId(tbProduct.getCategoryId() != null ? cateGoryMap.get(tbProduct.getCategoryId()) : null); tbProductNew.setSpecId(tbProduct.getSpecId() != null ? specMap.get(tbProduct.getSpecId()) : null); tbProductNew.setUnitId(tbProduct.getUnitId() != null ? unitMap.get(tbProduct.getUnitId()) : null); @@ -861,6 +875,9 @@ public class ShopSyncServiceImpl implements ShopSyncService { skuMap.put(prodSku.getId(), newSku.getId()); } else { ProdSku newSku = pointSkuMap.get(prodSku.getId()); + if (newSku == null) { + continue; + } newSku.setSpecInfo(prodSku.getSpecInfo()); newSku.setCoverImg(prodSku.getCoverImg()); newSku.setIsDel(prodSku.getIsDel()); @@ -935,6 +952,9 @@ public class ShopSyncServiceImpl implements ShopSyncService { consGroupMap.put(consGroup.getId(), newConsGroup.getId()); } else { ConsGroup newConsGroup = pointConsGroupMap.get(consGroup.getId()); + if (newConsGroup == null) { + continue; + } newConsGroup.setName(consGroup.getName()); newConsGroup.setStatus(consGroup.getStatus()); consGroupService.updateById(newConsGroup, false); @@ -1010,6 +1030,9 @@ public class ShopSyncServiceImpl implements ShopSyncService { consMap.put(cons.getId(), conInfo.getId()); } else { ConsInfo conInfo = pointConsMap.get(cons.getId()); + if (conInfo == null) { + continue; + } conInfo.setConsGroupId(consGroupMap.get(conInfo.getConsGroupId())); conInfo.setConName(cons.getConName()); conInfo.setPrice(cons.getPrice()); @@ -1172,7 +1195,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { pointVendorMap.put(shopVendor.getSyncId(), shopVendor); } List list = vendorService.queryChain().eq(ShopVendor::getShopId, sourceShopId).list(); - list.forEach(vendor -> { + for (ShopVendor vendor : list) { if (CollUtil.isEmpty(pointShopVendor) || !pointShopVendor.contains(vendor.getId())) { ShopVendor vendorNew = BeanUtil.copyProperties(vendor, ShopVendor.class); vendorNew.setId(null); @@ -1182,6 +1205,9 @@ public class ShopSyncServiceImpl implements ShopSyncService { vendorMap.put(vendor.getId(), vendorNew.getId()); } else { ShopVendor vendorNew = pointVendorMap.get(vendor.getId()); + if (vendorNew == null) { + continue; + } vendorNew.setSort(vendor.getSort()); vendorNew.setName(vendor.getName()); vendorNew.setContactName(vendor.getContactName()); @@ -1194,7 +1220,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { vendorService.updateById(vendorNew, false); vendorMap.put(vendor.getId(), vendorNew.getId()); } - }); + } buildNotice(mainMapList, "供应商同步", pointShopVendor.size(), null, null); buildNotice(mainMapList, "供应商新增", vendorMap.size() - pointShopVendor.size(), null, null); log.info("供应商同步,源{}个,已有{}个,同步{}个", list.size(), pointShopVendor.size(), vendorMap.size()); From eadc2f0d51d682496a1c72278ea101624911289e Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 15:52:13 +0800 Subject: [PATCH 117/162] =?UTF-8?q?=E8=A7=84=E6=A0=BC=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/product/service/impl/ShopSyncServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 6d6892431..08be4db6a 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -300,6 +300,8 @@ public class ShopSyncServiceImpl implements ShopSyncService { if (newSpec == null) { continue; } + newSpec.setPid(spec.getPid()); + newSpec.setPids(spec.getPids()); newSpec.setName(spec.getName()); newSpec.setFullName(spec.getFullName()); newSpec.setLevel(spec.getLevel()); From 5f391a98985ed78c7f4d3350c689a892bf2b8dfc Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 15:58:43 +0800 Subject: [PATCH 118/162] =?UTF-8?q?=E5=8D=95=E4=BD=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/product/service/impl/ShopSyncServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 08be4db6a..3ea996e9d 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -224,7 +224,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { unit.setName(tbShopUnit.getName()); unit.setStatus(tbShopUnit.getStatus()); unitService.updateById(unit, false); - unitMap.put(tbShopUnit.getSyncId(), tbShopUnit.getId()); + unitMap.put(unit.getSyncId(), unit.getId()); } }; buildNotice(mainMapList, "单位同步", pointShopUnits.size(), null, null); From f07a5b8f6750ffbec50a381fedfebde10cdf609d Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 16:01:52 +0800 Subject: [PATCH 119/162] =?UTF-8?q?=E5=A5=97=E9=A4=90=E5=95=86=E5=93=81=20?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/product/service/impl/ShopSyncServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 3ea996e9d..c5463b4a4 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -557,6 +557,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { tbProductNew.setSelectSpecInfo(tbProduct.getSelectSpecInfo()); tbProductNew.setSort(tbProduct.getSort()); tbProductNew.setIsDel(tbProduct.getIsDel()); + tbProductNew.setGroupSnap(tbProduct.getGroupSnap()); productService.updateById(tbProductNew, false); proMap.put(tbProductNew.getSyncId(), tbProductNew.getId()); } From 55a25e0cdb56547c97c8faded3d9eba480d7528e Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 16:18:07 +0800 Subject: [PATCH 120/162] =?UTF-8?q?=E5=95=86=E5=93=81=E8=80=97=E6=9D=90?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ShopSyncServiceImpl.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index c5463b4a4..7bed0d70b 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -226,7 +226,8 @@ public class ShopSyncServiceImpl implements ShopSyncService { unitService.updateById(unit, false); unitMap.put(unit.getSyncId(), unit.getId()); } - }; + } + ; buildNotice(mainMapList, "单位同步", pointShopUnits.size(), null, null); buildNotice(mainMapList, "单位新增", unitMap.size() - pointShopUnits.size(), null, null); log.info("单位同步,源{}个,已有{}个,同步{}个", list.size(), pointShopUnits.size(), unitMap.size() - pointShopUnits.size()); @@ -1101,8 +1102,8 @@ public class ShopSyncServiceImpl implements ShopSyncService { } public void syncConsPro(Long sourceShopId, Long pointShopId, Map consMap, Map proMap) { + prodConsRelationService.remove(QueryWrapper.create().eq(ProdConsRelation::getShopId, pointShopId)); List list = prodConsRelationService.queryChain().eq(ProdConsRelation::getShopId, sourceShopId).list(); - List upList = new ArrayList<>(); List addList = new ArrayList<>(); for (ProdConsRelation prodConsRelation : list) { prodConsRelation.setShopId(pointShopId); @@ -1112,24 +1113,11 @@ public class ShopSyncServiceImpl implements ShopSyncService { log.info("关联关系同步失败 商品ID:{}或耗材ID:{}不存在", prodConsRelation.getProductId(), prodConsRelation.getConsInfoId()); continue; } - ProdConsRelation oldRelation = prodConsRelationService.queryChain() - .eq(ProdConsRelation::getShopId, pointShopId) - .eq(ProdConsRelation::getProductId, prodConsRelation.getProductId()) - .eq(ProdConsRelation::getConsInfoId, prodConsRelation.getConsInfoId()).one(); - if (oldRelation == null) { - addList.add(prodConsRelation); - } else { - if (oldRelation.getSurplusStock().compareTo(prodConsRelation.getSurplusStock()) != 0) { - upList.add(prodConsRelation); - } - } + addList.add(prodConsRelation); } if (CollUtil.isNotEmpty(addList)) { prodConsRelationService.saveBatch(addList, 100); } - if (CollUtil.isNotEmpty(upList)) { - prodConsRelationService.updateBatch(addList, 100); - } log.info("耗材与商品关联关系,同步{}个", list.size()); } From 912bc7819a267976882ff45086cbe339b3170107 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 16:23:55 +0800 Subject: [PATCH 121/162] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=95=86=E5=93=81=20?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=85=B3=E8=81=94=E5=85=B3=E8=81=94=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/product/service/impl/ProductServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java index 48fc010e9..6bd05d67e 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java @@ -428,7 +428,7 @@ public class ProductServiceImpl extends ServiceImpl impl .eq(Product::getId, id) .eq(Product::getShopId, shopId) .update(); - prodGroupRelationMapper.deleteByQuery(query().eq(ProdGroupRelation::getProductId, id).eq(ProdGroup::getShopId, shopId)); + prodGroupRelationMapper.deleteByQuery(query().eq(ProdGroupRelation::getProductId, id)); } @Override From 46e932450f68efc5c7263dabded5376cacf890c1 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Sat, 12 Apr 2025 16:43:49 +0800 Subject: [PATCH 122/162] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=95=86=E5=93=81?= =?UTF-8?q?=EF=BC=8C=E5=90=8C=E6=AD=A5=E5=88=A0=E9=99=A4=E8=80=97=E6=9D=90?= =?UTF-8?q?=E5=95=86=E5=93=81=E5=85=B3=E7=B3=BB=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=80=97=E6=9D=90=EF=BC=8C=E5=90=8C=E6=AD=A5=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=80=97=E6=9D=90=E5=95=86=E5=93=81=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/ShopOrderStatisticMapper.xml | 1 + .../service/product/service/impl/ConsInfoServiceImpl.java | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cash-service/order-service/src/main/resources/mapper/ShopOrderStatisticMapper.xml b/cash-service/order-service/src/main/resources/mapper/ShopOrderStatisticMapper.xml index e739c65bc..d09c8cbef 100644 --- a/cash-service/order-service/src/main/resources/mapper/ShopOrderStatisticMapper.xml +++ b/cash-service/order-service/src/main/resources/mapper/ShopOrderStatisticMapper.xml @@ -26,6 +26,7 @@ sum(recharge_amount) as recharge_amount, avg(customer_unit_price) as customer_unit_price, avg(table_turnover_rate) as table_turnover_rate, + sum(new_member_count) as new_member_count, max(update_time) as update_time from tb_shop_order_statistic where shop_id = #{shopId} diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java index 702f904fa..dd894c70c 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.czg.product.dto.ConsInfoDTO; import com.czg.product.dto.ProductBriefDTO; import com.czg.product.entity.ConsGroup; import com.czg.product.entity.ConsInfo; +import com.czg.product.entity.ProdConsRelation; import com.czg.product.param.ConsInfoParam; import com.czg.product.param.ConsSubUnitParam; import com.czg.product.service.ConsInfoService; @@ -148,7 +149,9 @@ public class ConsInfoServiceImpl extends ServiceImpl i @Override public boolean deleteConsInfo(Long id) { Long shopId = StpKit.USER.getShopId(0L); - return super.remove(query().eq(ConsInfo::getId, id).eq(ConsInfo::getShopId, shopId)); + super.remove(query().eq(ConsInfo::getId, id).eq(ConsInfo::getShopId, shopId)); + prodConsRelationMapper.deleteByQuery(query().eq(ProdConsRelation::getConsInfoId, id).eq(ProdConsRelation::getShopId, shopId)); + return true; } @Override From eb885016f5d8008296d573aca26dc6e7efbf8be2 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Sat, 12 Apr 2025 16:45:17 +0800 Subject: [PATCH 123/162] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=95=86=E5=93=81?= =?UTF-8?q?=EF=BC=8C=E5=90=8C=E6=AD=A5=E5=88=A0=E9=99=A4=E8=80=97=E6=9D=90?= =?UTF-8?q?=E5=95=86=E5=93=81=E5=85=B3=E7=B3=BB=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=80=97=E6=9D=90=EF=BC=8C=E5=90=8C=E6=AD=A5=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=80=97=E6=9D=90=E5=95=86=E5=93=81=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/product/service/impl/ConsInfoServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java index dd894c70c..dbaa266da 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java @@ -150,7 +150,7 @@ public class ConsInfoServiceImpl extends ServiceImpl i public boolean deleteConsInfo(Long id) { Long shopId = StpKit.USER.getShopId(0L); super.remove(query().eq(ConsInfo::getId, id).eq(ConsInfo::getShopId, shopId)); - prodConsRelationMapper.deleteByQuery(query().eq(ProdConsRelation::getConsInfoId, id).eq(ProdConsRelation::getShopId, shopId)); + prodConsRelationMapper.deleteByQuery(query().eq(ProdConsRelation::getConsInfoId, id)); return true; } From 683885420945b5584f4e26a9405d51d160826927 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 16:51:24 +0800 Subject: [PATCH 124/162] =?UTF-8?q?=E5=90=8C=E6=AD=A5=20=E5=85=B3=E8=81=94?= =?UTF-8?q?=E5=85=B3=E8=81=94=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ShopSyncServiceImpl.java | 88 ++++++++++--------- 1 file changed, 47 insertions(+), 41 deletions(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 7bed0d70b..8abca37d5 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -1125,51 +1125,57 @@ public class ShopSyncServiceImpl implements ShopSyncService { @Override @Transactional(rollbackFor = Exception.class) public void syncConsProBySourceShop(Long sourceShopId, Long sourceProdId, Long sysUserId) { - assertAutoSync(sourceShopId); - AssertUtil.isNull(sourceProdId, "{}不能为空", "商品ID"); - Set shopIds = checkSourceShopInfo(sourceShopId, 2); - if (CollUtil.isEmpty(shopIds)) { - return; - } - List newSaveList = new ArrayList<>(); - List list = prodConsRelationService.queryChain() - .eq(ProdConsRelation::getShopId, sourceShopId).eq(ProdConsRelation::getProductId, sourceProdId).list(); - for (Long shopId : shopIds) { - Product product = productService.queryChain().eq(Product::getSyncId, sourceProdId).eq(Product::getShopId, shopId).one(); - if (product != null) { - List newCons = new ArrayList<>(); - if (CollUtil.isEmpty(list)) { - newCons = consInfoService.queryChain() - .isNotNull(ConsInfo::getSyncId).eq(ConsInfo::getShopId, shopId).list(); - if (CollUtil.isNotEmpty(newCons)) { - prodConsRelationService.remove(QueryWrapper.create() - .eq(ProdConsRelation::getShopId, shopId) - .eq(ProdConsRelation::getProductId, product.getId()) - .in(ProdConsRelation::getConsInfoId, newCons.stream().map(ConsInfo::getId).collect(Collectors.toList()))); - } - } else { - Map map = list.stream().collect(Collectors.toMap(ProdConsRelation::getConsInfoId, ProdConsRelation::getSurplusStock)); - newCons = consInfoService.queryChain() - .in(ConsInfo::getSyncId, map.keySet()).eq(ConsInfo::getShopId, shopId).list(); - if (CollUtil.isNotEmpty(newCons)) { - prodConsRelationService.remove(QueryWrapper.create() - .eq(ProdConsRelation::getShopId, shopId) - .eq(ProdConsRelation::getProductId, product.getId()) - .in(ProdConsRelation::getConsInfoId, newCons.stream().map(ConsInfo::getId).collect(Collectors.toList()))); - for (ConsInfo newCon : newCons) { - ProdConsRelation prodConsRelation = new ProdConsRelation(); - prodConsRelation.setShopId(shopId); - prodConsRelation.setProductId(product.getId()); - prodConsRelation.setConsInfoId(newCon.getId()); - prodConsRelation.setSurplusStock(map.get(newCon.getSyncId())); - newSaveList.add(prodConsRelation); + try { + log.info("同步商品耗材关系开始"); + assertAutoSync(sourceShopId); + AssertUtil.isNull(sourceProdId, "{}不能为空", "商品ID"); + Set shopIds = checkSourceShopInfo(sourceShopId, 2); + if (CollUtil.isEmpty(shopIds)) { + return; + } + List newSaveList = new ArrayList<>(); + List list = prodConsRelationService.queryChain() + .eq(ProdConsRelation::getShopId, sourceShopId).eq(ProdConsRelation::getProductId, sourceProdId).list(); + for (Long shopId : shopIds) { + Product product = productService.queryChain().eq(Product::getSyncId, sourceProdId).eq(Product::getShopId, shopId).one(); + if (product != null) { + List newCons = new ArrayList<>(); + if (CollUtil.isEmpty(list)) { + newCons = consInfoService.queryChain() + .isNotNull(ConsInfo::getSyncId).eq(ConsInfo::getShopId, shopId).list(); + if (CollUtil.isNotEmpty(newCons)) { + prodConsRelationService.remove(QueryWrapper.create() + .eq(ProdConsRelation::getShopId, shopId) + .eq(ProdConsRelation::getProductId, product.getId()) + .in(ProdConsRelation::getConsInfoId, newCons.stream().map(ConsInfo::getId).collect(Collectors.toList()))); + } + } else { + Map map = list.stream().collect(Collectors.toMap(ProdConsRelation::getConsInfoId, ProdConsRelation::getSurplusStock)); + newCons = consInfoService.queryChain() + .in(ConsInfo::getSyncId, map.keySet()).eq(ConsInfo::getShopId, shopId).list(); + if (CollUtil.isNotEmpty(newCons)) { + prodConsRelationService.remove(QueryWrapper.create() + .eq(ProdConsRelation::getShopId, shopId) + .eq(ProdConsRelation::getProductId, product.getId()) + .in(ProdConsRelation::getConsInfoId, newCons.stream().map(ConsInfo::getId).collect(Collectors.toList()))); + for (ConsInfo newCon : newCons) { + ProdConsRelation prodConsRelation = new ProdConsRelation(); + prodConsRelation.setShopId(shopId); + prodConsRelation.setProductId(product.getId()); + prodConsRelation.setConsInfoId(newCon.getId()); + prodConsRelation.setSurplusStock(map.get(newCon.getSyncId())); + newSaveList.add(prodConsRelation); + } } } } } - } - if (CollUtil.isNotEmpty(newSaveList)) { - prodConsRelationService.saveBatch(newSaveList, 100); + if (CollUtil.isNotEmpty(newSaveList)) { + prodConsRelationService.saveBatch(newSaveList, 100); + } + log.info("同步商品耗材关系结束"); + } catch (Exception e) { + log.error("同步商品耗材关系异常", e); } } From 03f40c4ae7ca28a059ec3fea72555006fcb355bb Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 17:00:41 +0800 Subject: [PATCH 125/162] =?UTF-8?q?=E5=95=86=E5=93=81=E8=80=97=E6=9D=90?= =?UTF-8?q?=E5=85=B3=E8=81=94=E5=85=B3=E7=B3=BB=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ShopSyncServiceImpl.java | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 8abca37d5..381117af6 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -1139,25 +1139,14 @@ public class ShopSyncServiceImpl implements ShopSyncService { for (Long shopId : shopIds) { Product product = productService.queryChain().eq(Product::getSyncId, sourceProdId).eq(Product::getShopId, shopId).one(); if (product != null) { - List newCons = new ArrayList<>(); - if (CollUtil.isEmpty(list)) { - newCons = consInfoService.queryChain() - .isNotNull(ConsInfo::getSyncId).eq(ConsInfo::getShopId, shopId).list(); - if (CollUtil.isNotEmpty(newCons)) { - prodConsRelationService.remove(QueryWrapper.create() - .eq(ProdConsRelation::getShopId, shopId) - .eq(ProdConsRelation::getProductId, product.getId()) - .in(ProdConsRelation::getConsInfoId, newCons.stream().map(ConsInfo::getId).collect(Collectors.toList()))); - } - } else { + prodConsRelationService.remove(QueryWrapper.create() + .eq(ProdConsRelation::getShopId, shopId) + .eq(ProdConsRelation::getProductId, product.getId())); + if(CollUtil.isNotEmpty(list)){ Map map = list.stream().collect(Collectors.toMap(ProdConsRelation::getConsInfoId, ProdConsRelation::getSurplusStock)); - newCons = consInfoService.queryChain() + List newCons = consInfoService.queryChain() .in(ConsInfo::getSyncId, map.keySet()).eq(ConsInfo::getShopId, shopId).list(); if (CollUtil.isNotEmpty(newCons)) { - prodConsRelationService.remove(QueryWrapper.create() - .eq(ProdConsRelation::getShopId, shopId) - .eq(ProdConsRelation::getProductId, product.getId()) - .in(ProdConsRelation::getConsInfoId, newCons.stream().map(ConsInfo::getId).collect(Collectors.toList()))); for (ConsInfo newCon : newCons) { ProdConsRelation prodConsRelation = new ProdConsRelation(); prodConsRelation.setShopId(shopId); From 154a1a0930a9dda3714de34d62b9ff73798d7b8b Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 17:30:03 +0800 Subject: [PATCH 126/162] =?UTF-8?q?=E5=95=86=E5=93=81=E5=90=8C=E6=AD=A5=20?= =?UTF-8?q?=E5=85=B3=E8=81=94Id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/product/service/impl/ShopSyncServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 381117af6..4230f341c 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -620,7 +620,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { List> mainMapList = new ArrayList<>(); Map dataMap = new HashMap<>(); Product newEntity = BeanUtil.copyProperties(mainEntity, Product.class); - newEntity.setSyncId(mainEntity.getSyncId()); + newEntity.setSyncId(mainEntity.getId()); newEntity.setShopId(shopId); newEntity.setCategoryId(newEntity.getCategoryId() != null ? categoryMap.get(shopId) : null); newEntity.setSpecId(newEntity.getSpecId() != null ? specMap.get(shopId) : null); From 31253884dc6cb8e30a94e04de63308ccd626372c Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Sat, 12 Apr 2025 17:39:34 +0800 Subject: [PATCH 127/162] =?UTF-8?q?=E5=95=86=E5=93=81=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BD=86=E5=A4=9A=E8=A7=84=E6=A0=BC=E5=88=87=E6=8D=A2=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E7=B1=BB=E5=9E=8B=E6=97=B6=E6=B8=85=E7=A9=BAspecId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/product/service/impl/ProductServiceImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java index 6bd05d67e..be83bf13b 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java @@ -307,6 +307,10 @@ public class ProductServiceImpl extends ServiceImpl impl } entity.setIsDel(DeleteEnum.NORMAL.value()); entity.setShopId(shopId); + if(!ProductTypeEnum.SKU.value().equals(entity.getType())){ + entity.setSpecId(null); + } + entity.setSpecId(null); super.updateById(entity); List skuList = dto.getSkuList(); // 商品SKU-ID列表 @@ -429,6 +433,7 @@ public class ProductServiceImpl extends ServiceImpl impl .eq(Product::getShopId, shopId) .update(); prodGroupRelationMapper.deleteByQuery(query().eq(ProdGroupRelation::getProductId, id)); + prodConsRelationMapper.deleteByQuery(query().eq(ProdConsRelation::getProductId, id)); } @Override From c7a74d04c16e90df775932cd50df618d010813da Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 12 Apr 2025 17:42:10 +0800 Subject: [PATCH 128/162] =?UTF-8?q?=E5=A5=97=E9=A4=90=E5=95=86=E5=93=81=20?= =?UTF-8?q?=E5=AE=9E=E6=97=B6=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ShopSyncServiceImpl.java | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java index 4230f341c..7b734e85b 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopSyncServiceImpl.java @@ -825,31 +825,33 @@ public class ShopSyncServiceImpl implements ShopSyncService { public void syncProductPackageBySourceShop(Product product, Long pointShopId) { if (StrUtil.isNotBlank(product.getGroupSnap()) && product.getGroupSnap().length() > 5) { - ProductGroupVo proGroupVo = JSONObject.parseObject(product.getGroupSnap(), ProductGroupVo.class); - List goodList = new ArrayList<>(); - for (ProductGroupVo.Food goods : proGroupVo.getGoods()) { - if (goods.getProId() != null) { - Product sourceProduct = productService.queryChain().eq(Product::getShopId, pointShopId).eq(Product::getSyncId, goods.getProId()).one(); - if (sourceProduct != null) { - goods.setProId(sourceProduct.getId()); - goods.setProName(sourceProduct.getName()); + List proGroupVos = JSON.parseArray(product.getGroupSnap(), ProductGroupVo.class); + for (ProductGroupVo proGroupVo : proGroupVos) { + List goodList = new ArrayList<>(); + for (ProductGroupVo.Food goods : proGroupVo.getGoods()) { + if (goods.getProId() != null) { + Product sourceProduct = productService.queryChain().eq(Product::getShopId, pointShopId).eq(Product::getSyncId, goods.getProId()).one(); + if (sourceProduct != null) { + goods.setProId(sourceProduct.getId()); + goods.setProName(sourceProduct.getName()); + } + } + if (goods.getSkuId() != null) { + ProdSku sourceSku = skuService.queryChain().eq(ProdSku::getShopId, pointShopId).eq(ProdSku::getSyncId, goods.getSkuId()).one(); + goods.setSkuId(sourceSku.getId()); + goods.setSkuName(sourceSku.getSpecInfo()); + } + goodList.add(goods); + } + proGroupVo.setCount(goodList.size()); + proGroupVo.setGoods(goodList); + if (proGroupVo.getNumber() != null && proGroupVo.getNumber() > 0) { + if (proGroupVo.getNumber() > proGroupVo.getCount()) { + proGroupVo.setNumber(proGroupVo.getCount()); } } - if (goods.getSkuId() != null) { - ProdSku sourceSku = skuService.queryChain().eq(ProdSku::getShopId, pointShopId).eq(ProdSku::getSyncId, goods.getSkuId()).one(); - goods.setSkuId(sourceSku.getId()); - goods.setSkuName(sourceSku.getSpecInfo()); - } - goodList.add(goods); } - proGroupVo.setCount(goodList.size()); - proGroupVo.setGoods(goodList); - if (proGroupVo.getNumber() != null && proGroupVo.getNumber() > 0) { - if (proGroupVo.getNumber() > proGroupVo.getCount()) { - proGroupVo.setNumber(proGroupVo.getCount()); - } - } - product.setGroupSnap(JSON.toJSONString(proGroupVo, JSONWriter.Feature.WriteMapNullValue)); + product.setGroupSnap(JSON.toJSONString(proGroupVos, JSONWriter.Feature.WriteMapNullValue)); productService.saveOrUpdate(product); } } @@ -1142,7 +1144,7 @@ public class ShopSyncServiceImpl implements ShopSyncService { prodConsRelationService.remove(QueryWrapper.create() .eq(ProdConsRelation::getShopId, shopId) .eq(ProdConsRelation::getProductId, product.getId())); - if(CollUtil.isNotEmpty(list)){ + if (CollUtil.isNotEmpty(list)) { Map map = list.stream().collect(Collectors.toMap(ProdConsRelation::getConsInfoId, ProdConsRelation::getSurplusStock)); List newCons = consInfoService.queryChain() .in(ConsInfo::getSyncId, map.keySet()).eq(ConsInfo::getShopId, shopId).list(); From 9e44696ce7c4973c1137279c45f92fc2b92a1dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 14 Apr 2025 14:13:21 +0800 Subject: [PATCH 129/162] =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=8A=A5=E6=8D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/controller/admin/ConsStockFlowController.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsStockFlowController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsStockFlowController.java index 669803197..c0020b192 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsStockFlowController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsStockFlowController.java @@ -17,6 +17,8 @@ import com.mybatisflex.core.paginate.Page; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 耗材进销存 @@ -90,9 +92,11 @@ public class ConsStockFlowController { @PostMapping("reportDamage") @OperationLog("耗材报损") //@SaAdminCheckPermission("consStockFlow:reportDamage") - public CzgResult reportDamage(@RequestBody ConsReportDamageParam param) { - ValidatorUtil.validateEntity(param, DefaultGroup.class); - consStockFlowService.reportDamage(param); + public CzgResult reportDamage(@RequestBody List params) { + params.forEach(item -> { + ValidatorUtil.validateEntity(item, DefaultGroup.class); + consStockFlowService.reportDamage(item); + }); return CzgResult.success(); } From 0f0527a4d7edbd1b028e235bd96e9593c2282fdb Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Tue, 15 Apr 2025 09:26:39 +0800 Subject: [PATCH 130/162] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=8F=96=E6=B6=88=20?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=8A=B6=E6=80=81=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/service/order/service/impl/OrderInfoServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java index 6069f13ab..a0e1bb3f3 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java @@ -1027,10 +1027,10 @@ public class OrderInfoServiceImpl extends ServiceImpl Date: Wed, 16 Apr 2025 13:36:13 +0800 Subject: [PATCH 131/162] =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=8F=AF=E5=94=AE=E5=8D=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/product/vo/ProductVO.java | 1 + .../service/impl/PadProdServiceImpl.java | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java index 5a74b0c75..917eadf43 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ProductVO.java @@ -16,4 +16,5 @@ import java.util.List; public class ProductVO extends Product { private BigDecimal lowPrice; private List skuList; + private Integer isSaleTime; } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java index 2c568f95f..b3c72d921 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/PadProdServiceImpl.java @@ -1,8 +1,12 @@ package com.czg.service.account.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; import com.czg.account.dto.pad.*; import com.czg.account.entity.*; import com.czg.account.service.*; +import com.czg.enums.YesNoEnum; import com.czg.exception.ApiNotPrintException; import com.czg.product.entity.ProdSku; import com.czg.product.entity.Product; @@ -20,8 +24,13 @@ import jakarta.annotation.Resource; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.stereotype.Service; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.TextStyle; import java.util.ArrayList; import java.util.List; +import java.util.Locale; /** * @author Administrator @@ -49,6 +58,40 @@ public class PadProdServiceImpl implements PadProdService { return PageUtil.convert(new PageInfo<>(padProductCategoryDetailMapper.selectPageByKeyAndShopId(shopId, productCategoryId))); } + /** + * 计算是否在可售时间内 + * + * @param days 星期几,例如 "Monday,Tuesday" + * @param startTime 起售时间 + * @param endTime 停售时间 + * @return 是否可售时间 1-是,0-否 + */ + public Integer calcIsSaleTime(String days, LocalTime startTime, LocalTime endTime) { + if (StrUtil.isBlank(days) || ObjUtil.isNull(startTime) || ObjUtil.isNull(endTime)) { + return YesNoEnum.NO.value(); + } + String today = getWeekDayEnName(); + List dayList = StrUtil.split(days, ","); + LocalTime now = LocalTime.now().withNano(0); + if (CollUtil.contains(dayList, today) && now.isAfter(startTime) && now.isBefore(endTime)) { + return YesNoEnum.YES.value(); + } + return YesNoEnum.NO.value(); + } + + /** + * 获取当前日期是星期几的英文名称 + * + * @return 星期几的英文名称,例如 "Monday" 或 "Friday" + */ + private String getWeekDayEnName() { + // 获取当前日期 + LocalDate currentDate = LocalDate.now(); + // 获取当前日期是星期几,返回一个 DayOfWeek 枚举类型的实例 + DayOfWeek dayOfWeek = currentDate.getDayOfWeek(); + return dayOfWeek.getDisplayName(TextStyle.FULL, Locale.ENGLISH); + } + @Override public PadDetailDTO detail(Long shopId, Long padProductCategory) { PadProductCategory padCategory = padProductCategoryService.getOne(new QueryWrapper().eq(PadProductCategory::getShopId, shopId).eq(PadProductCategory::getId, padProductCategory)); @@ -66,10 +109,13 @@ public class PadProdServiceImpl implements PadProdService { products.parallelStream().forEach(item -> { List skuList = prodSkuService.list(new QueryWrapper().eq(ProdSku::getProductId, item.getId())); item.setSkuList(skuList); + item.setIsSaleTime(calcIsSaleTime(item.getDays(), item.getStartTime(), item.getEndTime())); + }); padDetailDTO.setProductList(products); } + return padDetailDTO; } From e569e047396fa102804d4159b20862966403068d Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 16 Apr 2025 15:10:37 +0800 Subject: [PATCH 132/162] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=95=86=E5=93=81SKU?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/czg/product/vo/ShopProductSkuInfoVo.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductSkuInfoVo.java b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductSkuInfoVo.java index 04f0a5257..fdec2f1a2 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductSkuInfoVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductSkuInfoVo.java @@ -74,4 +74,12 @@ public class ShopProductSkuInfoVo implements Serializable { * 商品库存 */ private Integer stockNumber; + /** + * 是否售罄 + */ + private Integer isSoldStock; + /** + * 是否上架 + */ + private Integer isSale; } From ab41db4aaae5092cbe6962a215ebd1acf09cc5e4 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 16 Apr 2025 15:11:09 +0800 Subject: [PATCH 133/162] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=95=86=E5=93=81SKU?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/product/service/impl/UProductServiceImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java index ede8c9b97..a74fb0118 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/UProductServiceImpl.java @@ -1,5 +1,6 @@ package com.czg.service.product.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.NumberUtil; @@ -101,8 +102,9 @@ public class UProductServiceImpl extends ServiceImpl imp List productList = new ArrayList<>(); for (Long productId : productIdList) { ShopProductVo product = productKv.get(productId); + ShopProductVo prod = BeanUtil.copyProperties(product, ShopProductVo.class); if (product != null) { - productList.add(product); + productList.add(prod); } } // 1-价格从高到低; 2-价格从低到高; 3-销量由高到低;4-销量由低到高; @@ -148,6 +150,8 @@ public class UProductServiceImpl extends ServiceImpl imp // throw new CzgException("商品SKU不可售或不存在"); if (data != null) { data.setStockNumber(ObjUtil.defaultIfNull(product.getStockNumber(), 0)); + data.setIsSoldStock(product.getIsSoldStock()); + data.setIsSale(product.getIsSale()); return data; } return null; From ff8a1e5de244e2d068312eb54a21882f0289f351 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 16 Apr 2025 15:20:02 +0800 Subject: [PATCH 134/162] =?UTF-8?q?=E5=95=86=E5=93=81=E5=88=86=E7=BB=84?= =?UTF-8?q?=E7=A6=81=E7=94=A8=E6=B8=85=E7=A9=BA=E8=B5=B7=E6=AD=A2=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/service/impl/ProdGroupServiceImpl.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdGroupServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdGroupServiceImpl.java index d8b1bfc03..3053a1c86 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdGroupServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdGroupServiceImpl.java @@ -1,6 +1,7 @@ package com.czg.service.product.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; @@ -121,8 +122,13 @@ public class ProdGroupServiceImpl extends ServiceImpl Date: Wed, 16 Apr 2025 15:24:32 +0800 Subject: [PATCH 135/162] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BD=92=E6=A1=A3=E6=9F=A5=E8=AF=A2=E3=80=81=E5=95=86=E5=93=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=88=86=E7=B1=BB=E7=BC=93=E5=AD=98=E3=80=81?= =?UTF-8?q?=E5=B7=B2=E7=9F=A5=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/controller/NotifyController.java | 23 ++- .../admin/DataSummaryController.java | 2 +- .../main/java/com/czg/task/StatisticTask.java | 88 ++++++++++- .../controller/admin/ProductController.java | 24 +-- .../controller/user/UProductController.java | 10 +- .../java/com/czg/service/RedisService.java | 52 +++++++ .../czg/order/entity/ShopOrderStatistic.java | 2 - .../czg/order/entity/ShopProdStatistic.java | 11 +- .../order/entity/ShopTableOrderStatistic.java | 29 +++- .../czg/order/service/DataSummaryService.java | 4 +- .../service/ShopOrderStatisticService.java | 5 +- .../service/ShopProdStatisticService.java | 5 +- .../ShopTableOrderStatisticService.java | 5 +- .../czg/order/vo/DataSummaryDateAmountVo.java | 24 --- .../vo/DataSummaryProductSaleRankingVo.java | 15 ++ .../com/czg/order/vo/TableSummaryInfoVo.java | 5 + .../main/java/com/czg/order/vo/TotalVo.java | 38 +++++ .../czg/product/service/ProductService.java | 13 ++ .../src/main/java/com/czg/utils/PageUtil.java | 11 +- .../service/impl/DataSummaryServiceImpl.java | 25 +-- .../service/impl/SaleSummaryServiceImpl.java | 6 +- .../impl/ShopOrderStatisticServiceImpl.java | 54 +++++-- .../impl/ShopProdStatisticServiceImpl.java | 111 ++++++------- .../ShopTableOrderStatisticServiceImpl.java | 131 ++++++++-------- .../service/impl/TableSummaryServiceImpl.java | 2 +- .../mapper/ShopProdStatisticMapper.xml | 9 +- .../mapper/ShopTableOrderStatisticMapper.xml | 16 +- .../service/impl/ProductServiceImpl.java | 147 ++++++++++++++++-- .../impl/ShopProdCategoryServiceImpl.java | 17 +- 29 files changed, 611 insertions(+), 273 deletions(-) create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/order/vo/TotalVo.java diff --git a/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java b/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java index ab2857f59..9b45af1a4 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java @@ -1,5 +1,7 @@ package com.czg.controller; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.thread.ThreadUtil; import com.alibaba.fastjson2.JSONObject; import com.czg.CzgPayUtils; import com.czg.entity.CzgBaseRespParams; @@ -9,10 +11,9 @@ import com.czg.task.StatisticTask; import com.czg.utils.AssertUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -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 org.springframework.web.bind.annotation.*; + +import java.util.Date; /** * @author ww @@ -32,7 +33,7 @@ public class NotifyController { @RequestMapping("/payCallBack") - public String notifyCallBack(@RequestBody CzgBaseRespParams respParams){ + public String notifyCallBack(@RequestBody CzgBaseRespParams respParams) { JSONObject czg = CzgPayUtils.getCzg(respParams); AssertUtil.isNull(czg, "支付回调数据为空"); log.info("支付回调数据为:{}", czg); @@ -41,7 +42,7 @@ public class NotifyController { } @RequestMapping("/refundCallBack") - public String refundCallBack(@RequestBody CzgBaseRespParams respParams){ + public String refundCallBack(@RequestBody CzgBaseRespParams respParams) { JSONObject czg = CzgPayUtils.getCzg(respParams); AssertUtil.isNull(czg, "退款回调数据为空"); log.info("退款回调数据为:{}", czg); @@ -51,8 +52,18 @@ public class NotifyController { @Resource private PrintMqListener printMqListener; + @RequestMapping("/test") public void test(@RequestParam String id) { printMqListener.orderPrint(id); } + + @GetMapping("/anew/statistic/history/data") + public String statistic(@RequestParam String now) { + String format = DateUtil.format(new Date(), "yyyyMMddHHmm"); + if (format.equals(now)) { + ThreadUtil.execAsync(() -> statisticTask.statisticHistoryData()); + } + return SUCCESS; + } } diff --git a/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java b/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java index 69a606dd5..74bf84b34 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java @@ -47,7 +47,7 @@ public class DataSummaryController { if (param.getShopId() == null) { param.setShopId(shopId); } - ShopOrderStatistic data = dataSummaryService.getTradeData(param); + ShopOrderStatistic data = dataSummaryService.getArchiveTradeData(param); return CzgResult.success(data); } diff --git a/cash-api/order-server/src/main/java/com/czg/task/StatisticTask.java b/cash-api/order-server/src/main/java/com/czg/task/StatisticTask.java index e387fe681..b79d79794 100644 --- a/cash-api/order-server/src/main/java/com/czg/task/StatisticTask.java +++ b/cash-api/order-server/src/main/java/com/czg/task/StatisticTask.java @@ -1,13 +1,27 @@ package com.czg.task; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.czg.order.entity.ShopOrderStatistic; +import com.czg.order.entity.ShopProdStatistic; +import com.czg.order.entity.ShopTableOrderStatistic; import com.czg.order.service.ShopOrderStatisticService; import com.czg.order.service.ShopProdStatisticService; import com.czg.order.service.ShopTableOrderStatisticService; +import com.czg.service.order.mapper.ShopOrderStatisticMapper; +import com.czg.service.order.mapper.ShopProdStatisticMapper; +import com.czg.service.order.mapper.ShopTableOrderStatisticMapper; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.row.DbChain; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.time.LocalDate; +import java.util.List; + /** * @author Administrator */ @@ -20,15 +34,81 @@ public class StatisticTask { private ShopProdStatisticService shopProdStatisticService; @Resource private ShopOrderStatisticService shopOrderStatisticService; + @Resource + private ShopOrderStatisticMapper shopOrderStatisticMapper; + @Resource + private ShopProdStatisticMapper shopProdStatisticMapper; + @Resource + private ShopTableOrderStatisticMapper shopTableOrderStatisticMapper; -// @Scheduled(cron = "1/6 * * * * ? ") + /** + * 基础统计 + * + * @param dateTime 日期时间 + */ + private void baseStatistic(DateTime dateTime) { + try { + shopOrderStatisticService.statistic(dateTime); + } catch (Exception e) { + log.error("统计订单数据失败", e); + } + try { + shopProdStatisticService.statistic(dateTime); + } catch (Exception e) { + log.error("统计商品数据失败", e); + } + try { + shopTableOrderStatisticService.statistic(dateTime); + } catch (Exception e) { + log.error("统计桌台数据失败", e); + } + } + + // @Scheduled(cron = "1/6 * * * * ? ") @Scheduled(cron = "0 0 8 * * ?") public void run() { long start = System.currentTimeMillis(); log.info("定时任务执行,开始统计数据"); - shopOrderStatisticService.statistic(); - shopProdStatisticService.statistic(); - shopTableOrderStatisticService.statistic(); + // 获取前一天 + DateTime yesterday = DateUtil.yesterday(); + baseStatistic(yesterday); log.info("定时任务执行完毕,耗时:{}ms", start - System.currentTimeMillis()); } + + @Scheduled(cron = "0 0,15,30,45 * * * ? ") + public void run2() { + long start = System.currentTimeMillis(); + log.info("定时任务2执行,开始统计数据"); + // 获取当天 + DateTime today = DateUtil.date(); + baseStatistic(today); + log.info("定时任务2执行完毕,耗时:{}ms", start - System.currentTimeMillis()); + } + + /** + * 统计历史数据 + */ + public void statisticHistoryData() { + // 指定开始日期 + LocalDate startDate = LocalDate.of(2024, 3, 1); + // 指定结束日期 + LocalDate endDate = LocalDate.now(); + List shopIdList = DbChain.table("tb_shop_info").select("id").objListAs(Long.class); + List> split = CollUtil.split(shopIdList, 10); + // 1.清除历史统计的数据 + for (List splitIdList : split) { + splitIdList.parallelStream().forEach(shopId -> { + shopOrderStatisticMapper.deleteByQuery(QueryWrapper.create().eq(ShopOrderStatistic::getShopId, shopId)); + shopProdStatisticMapper.deleteByQuery(QueryWrapper.create().eq(ShopProdStatistic::getShopId, shopId)); + shopTableOrderStatisticMapper.deleteByQuery(QueryWrapper.create().eq(ShopTableOrderStatistic::getShopId, shopId)); + }); + } + // 2.开始从2024-3-1开始统计数据 + startDate.datesUntil(endDate.plusDays(1)).forEach(date -> { + System.out.println(date.toString()); + DateTime dateTime = DateUtil.parseDate(date.toString()); + System.out.println(dateTime); + baseStatistic(dateTime); + }); + } } diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java index 3aaa40506..334db1222 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java @@ -2,8 +2,6 @@ package com.czg.controller.admin; import cn.hutool.core.convert.Convert; import cn.hutool.core.thread.ThreadUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.StrUtil; import com.czg.account.service.ShopConfigService; import com.czg.annotation.SaStaffCheckPermission; import com.czg.config.RabbitPublisher; @@ -72,22 +70,9 @@ public class ProductController { public CzgResult> getProductList(ProductDTO param) { Long shopId = StpKit.USER.getShopId(0L); param.setShopId(shopId); - ProductDTO cacheParam = new ProductDTO(); - cacheParam.setShopId(shopId); - List data = getProductCacheList(cacheParam, param); - productService.refreshProductStock(param, data); - return CzgResult.success(data); - } - - private List getProductCacheList(ProductDTO cacheParam, ProductDTO param) { - List productList = productService.getProductList(cacheParam); - if (StrUtil.isNotEmpty(param.getName())) { - productList = productList.stream().filter(obj -> StrUtil.contains(obj.getName(), param.getName())).toList(); - } - if (ObjUtil.isNotNull(param.getCategoryId())) { - productList = productList.stream().filter(obj -> param.getCategoryId().equals(obj.getCategoryId())).toList(); - } - return productList; + List productList = productService.getProductCacheList(param); + productService.refreshProductStock(param, productList); + return CzgResult.success(productList); } /** @@ -160,6 +145,9 @@ public class ProductController { Long shopId = StpKit.USER.getShopId(0L); param.setShopId(shopId); productService.updateProductStock(param); + ThreadUtil.execAsync(() -> { + rabbitPublisher.sendProductInfoChangeMsg(Convert.toStr(shopId)); + }); return CzgResult.success(); } diff --git a/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java b/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java index 18f1e7163..fca30ef4d 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java @@ -1,6 +1,5 @@ package com.czg.controller.user; -import com.czg.product.dto.ProdGroupDTO; import com.czg.product.param.ShopProductSkuParam; import com.czg.product.service.ProdGroupService; import com.czg.product.service.UProductService; @@ -21,7 +20,6 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** @@ -57,19 +55,13 @@ public class UProductController { @GetMapping("/miniApp/group/query") public CzgResult> queryGroupProductList() { Long shopId = StpKit.USER.getShopId(0L); - ProdGroupDTO param = new ProdGroupDTO(); - List prodGroupList = prodGroupService.getProdGroupList(param); - Map groupMap = prodGroupList.stream().collect(Collectors.toMap(ProdGroupDTO::getId, i -> i)); List list = uProductService.queryGroupProductList(shopId); Map productStock = uProductService.findShopProductStock(shopId); list.forEach(item -> { uProductService.refreshProductStock(productStock, item.getProductList()); - ProdGroupDTO config = groupMap.get(item.getId()); item.getProductList().forEach(prod -> { prod.setIsSaleTime(uProductService.calcIsSaleTime(prod.getDays(), prod.getStartTime(), prod.getEndTime())); - if (config != null) { - prod.setIsSaleTime(uProductService.calcIsSaleTime(config.getUseTime(), config.getSaleStartTime(), config.getSaleEndTime())); - } + prod.setIsSaleTime(uProductService.calcIsSaleTime(item.getUseTime(), item.getSaleStartTime(), item.getSaleEndTime())); }); }); return CzgResult.success(list); diff --git a/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java b/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java index ad5c1a2d6..e84608854 100644 --- a/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java +++ b/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java @@ -1,5 +1,7 @@ package com.czg.service; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONWriter; import jakarta.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -598,4 +600,54 @@ public class RedisService { return redisTemplate.opsForList().rightPop(key); } + /** + * 右模糊查找key + * + * @param key 模糊匹配的key前缀 + * @return 匹配的keys + */ + public Set rightLikeKey(String key) { + return redisTemplate.keys(key + "*"); + } + + /** + * JsonString缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean setJsonStr(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, JSON.toJSONString(value, JSONWriter.Feature.WriteMapNullValue)); + return true; + } catch (Exception e) { + log.error("redis error:{}", e + ""); + return false; + } + } + + /** + * JsonString缓存获取 + * + * @param key 键 + * @return 值 + */ + public String getJsonStr(String key) { + return key == null ? null : (String) redisTemplate.opsForValue().get(key); + } + + /** + * JsonString缓存获取 + * + * @param key 键 + * @return 值 + */ + public List getJsonToBeanList(String key, Class type) { + String jsonStr = getJsonStr(key); + if (jsonStr == null) { + return null; + } + return JSON.parseArray(jsonStr, type); + } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java index 1b6f44da3..33fb14ba6 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java @@ -1,7 +1,6 @@ package com.czg.order.entity; import com.alibaba.fastjson2.annotation.JSONField; -import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; @@ -141,7 +140,6 @@ public class ShopOrderStatistic implements Serializable { /** * 新增会员数 */ - @Column(ignore = true) private Long newMemberCount = 0L; /** * 店铺id diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopProdStatistic.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopProdStatistic.java index 6dc26364b..e87bacbad 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopProdStatistic.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopProdStatistic.java @@ -3,16 +3,15 @@ package com.czg.order.entity; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; -import java.io.Serializable; -import java.math.BigDecimal; -import java.sql.Date; - -import java.io.Serial; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + /** * 实体类。 * diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopTableOrderStatistic.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopTableOrderStatistic.java index 6d5312e9a..7eeb9427f 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopTableOrderStatistic.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopTableOrderStatistic.java @@ -3,16 +3,15 @@ package com.czg.order.entity; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; -import java.io.Serializable; -import java.math.BigDecimal; -import java.sql.Date; - -import java.io.Serial; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + /** * 台桌订单统计表 实体类。 * @@ -32,8 +31,22 @@ public class ShopTableOrderStatistic implements Serializable { @Id(keyType = KeyType.Auto) private Long id; + /** + * 台桌id + */ private Long tableId; - + /** + * 台桌id + */ + private String tableCode; + /** + * 台桌名称 + */ + private String tableName; + /** + * 区域名称 + */ + private String areaName; /** * 订单数量 */ @@ -56,7 +69,7 @@ public class ShopTableOrderStatistic implements Serializable { /** * 退款数量 */ - private long refundCount; + private Long refundCount; /** * 退款金额 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/DataSummaryService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/DataSummaryService.java index c1ba00493..387702ca1 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/DataSummaryService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/DataSummaryService.java @@ -18,7 +18,9 @@ import java.util.List; */ public interface DataSummaryService { - ShopOrderStatistic getTradeData(DataSummaryTradeParam param); + ShopOrderStatistic getArchiveTradeData(DataSummaryTradeParam param); + + ShopOrderStatistic getRealTimeTradeData(DataSummaryTradeParam param); Page getProductSaleRankingPage(DataSummaryProductSaleParam param); diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopOrderStatisticService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopOrderStatisticService.java index 3cd54daa2..68dd4c8ab 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopOrderStatisticService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopOrderStatisticService.java @@ -1,7 +1,8 @@ package com.czg.order.service; -import com.mybatisflex.core.service.IService; +import cn.hutool.core.date.DateTime; import com.czg.order.entity.ShopOrderStatistic; +import com.mybatisflex.core.service.IService; /** * 服务层。 @@ -11,6 +12,6 @@ import com.czg.order.entity.ShopOrderStatistic; */ public interface ShopOrderStatisticService extends IService { - void statistic(); + void statistic(DateTime dateTime); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopProdStatisticService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopProdStatisticService.java index b7c27ee57..6e1b37906 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopProdStatisticService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopProdStatisticService.java @@ -1,7 +1,8 @@ package com.czg.order.service; -import com.mybatisflex.core.service.IService; +import cn.hutool.core.date.DateTime; import com.czg.order.entity.ShopProdStatistic; +import com.mybatisflex.core.service.IService; /** * 服务层。 @@ -11,6 +12,6 @@ import com.czg.order.entity.ShopProdStatistic; */ public interface ShopProdStatisticService extends IService { - void statistic(); + void statistic(DateTime dateTime); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopTableOrderStatisticService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopTableOrderStatisticService.java index 350826982..15f3314bc 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopTableOrderStatisticService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopTableOrderStatisticService.java @@ -1,8 +1,9 @@ package com.czg.order.service; +import cn.hutool.core.date.DateTime; +import com.czg.order.entity.ShopTableOrderStatistic; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; -import com.czg.order.entity.ShopTableOrderStatistic; import java.math.BigDecimal; @@ -25,5 +26,5 @@ public interface ShopTableOrderStatisticService extends IService total = new ArrayList<>(); - /** - * TotalVo - */ - @NoArgsConstructor - @Data - public static class TotalVo { - /** - * 实收金额 - */ - private BigDecimal actualAmount = BigDecimal.ZERO; - /** - * 优惠金额 - */ - private BigDecimal discountAmount = BigDecimal.ZERO; - /** - * 订单金额 - */ - private BigDecimal orderAmount = BigDecimal.ZERO; - /** - * 日期 - */ - private String tradeDay; - } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/DataSummaryProductSaleRankingVo.java b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/DataSummaryProductSaleRankingVo.java index 5f3ce9942..8c9d0a1a7 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/DataSummaryProductSaleRankingVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/DataSummaryProductSaleRankingVo.java @@ -19,6 +19,11 @@ public class DataSummaryProductSaleRankingVo implements Serializable { @Serial private static final long serialVersionUID = 1L; + /** + * 商品名称 + */ + private Long productId; + /** * 商品名称 */ @@ -34,4 +39,14 @@ public class DataSummaryProductSaleRankingVo implements Serializable { */ private BigDecimal amount; + /** + * 退单量 + */ + private BigDecimal refundCount; + + /** + * 退单金额 + */ + private BigDecimal refundAmount; + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TableSummaryInfoVo.java b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TableSummaryInfoVo.java index ccc960989..23418702f 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TableSummaryInfoVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TableSummaryInfoVo.java @@ -32,6 +32,11 @@ public class TableSummaryInfoVo implements Serializable { @ExcelIgnore @JSONField(serialize = false) private Long lineNum; + /** + * 台桌id + */ + @ExcelIgnore + private Long tableId; /** * 台桌码 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TotalVo.java b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TotalVo.java new file mode 100644 index 000000000..8b9c4741c --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TotalVo.java @@ -0,0 +1,38 @@ +package com.czg.order.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 销售趋势柱状图 左下 + * @author tankaikai + * @since 2025-03-07 16:08 + */ +@NoArgsConstructor +@Data +public class TotalVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 实收金额 + */ + private BigDecimal actualAmount = BigDecimal.ZERO; + /** + * 优惠金额 + */ + private BigDecimal discountAmount = BigDecimal.ZERO; + /** + * 订单金额 + */ + private BigDecimal orderAmount = BigDecimal.ZERO; + /** + * 日期 + */ + private String tradeDay; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java index 4b08b8386..48f8f053a 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java @@ -34,6 +34,19 @@ public interface ProductService extends IService { */ List getProductList(ProductDTO param); + /** + * 从缓存里面获取商品列表 + * + * @param param 查询参数 + * @return 商品列表数据 + */ + List getProductCacheList(ProductDTO param); + + /** + * 清除某个商品分类的缓存 + */ + void clearProductCache(Long... categoryIds); + /** * 获取商品详情 * diff --git a/cash-common/cash-common-tools/src/main/java/com/czg/utils/PageUtil.java b/cash-common/cash-common-tools/src/main/java/com/czg/utils/PageUtil.java index 9a9851d98..e175a116c 100644 --- a/cash-common/cash-common-tools/src/main/java/com/czg/utils/PageUtil.java +++ b/cash-common/cash-common-tools/src/main/java/com/czg/utils/PageUtil.java @@ -73,9 +73,14 @@ public class PageUtil { */ public QueryWrapper buildSortQueryWrapper() { QueryWrapper queryWrapper = QueryWrapper.create(); - String orderBy = ServletUtil.getRequest().getParameter(ORDER_BY); - if (StrUtil.isNotEmpty(orderBy)) { - queryWrapper.orderBy(SqlUtil.escapeOrderBySql(orderBy)); + try { + HttpServletRequest request = ServletUtil.getRequest(); + String orderBy = request.getParameter(ORDER_BY); + if (StrUtil.isNotEmpty(orderBy)) { + queryWrapper.orderBy(SqlUtil.escapeOrderBySql(orderBy)); + } + } catch (Exception e) { + //System.out.println("排序参数异常"); } return queryWrapper; } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/DataSummaryServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/DataSummaryServiceImpl.java index 77e0b6587..dd97233a7 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/DataSummaryServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/DataSummaryServiceImpl.java @@ -14,6 +14,7 @@ import com.czg.order.service.DataSummaryService; import com.czg.order.vo.DataSummaryDateAmountVo; import com.czg.order.vo.DataSummaryPayTypeVo; import com.czg.order.vo.DataSummaryProductSaleRankingVo; +import com.czg.order.vo.TotalVo; import com.czg.service.order.mapper.OrderInfoMapper; import com.czg.service.order.mapper.ShopOrderStatisticMapper; import com.czg.service.order.mapper.ShopProdStatisticMapper; @@ -50,7 +51,15 @@ public class DataSummaryServiceImpl implements DataSummaryService { private ShopProdStatisticMapper shopProdStatisticMapper; @Override - public ShopOrderStatistic getTradeData(DataSummaryTradeParam param) { + public ShopOrderStatistic getArchiveTradeData(DataSummaryTradeParam param) { + ShopOrderStatistic shopOrderStatistic = shopOrderStatisticMapper.getTradeData(param); + shopOrderStatistic.setCustomerUnitPrice(shopOrderStatistic.getCustomerUnitPrice().setScale(2, java.math.RoundingMode.HALF_UP)); + shopOrderStatistic.setTableTurnoverRate(shopOrderStatistic.getTableTurnoverRate().setScale(2, java.math.RoundingMode.HALF_UP)); + return shopOrderStatistic; + } + + @Override + public ShopOrderStatistic getRealTimeTradeData(DataSummaryTradeParam param) { List funs = Arrays.asList("getPayTypeAmountCount", "getVipRechargeAmountCount", "getNewMemberCount", "getCustomerUnitPrice", "getTableTurnoverRate"); Map collect = funs.parallelStream().collect(Collectors.toMap(fun -> fun, fun -> ReflectUtil.invoke(shopOrderStatisticMapper, fun, param) @@ -106,13 +115,6 @@ public class DataSummaryServiceImpl implements DataSummaryService { data.setDiscountAmount(discountAmount); data.setDiscountCount(discountCount); return data; - - /*ShopOrderStatistic shopOrderStatistic = shopOrderStatisticMapper.getTradeData(param); - long newMemberCount = shopOrderStatisticMapper.getNewMemberCount(param); - data.setNewMemberCount(newMemberCount); - shopOrderStatistic.setCustomerUnitPrice(shopOrderStatistic.getCustomerUnitPrice().setScale(2, java.math.RoundingMode.HALF_UP)); - shopOrderStatistic.setTableTurnoverRate(shopOrderStatistic.getTableTurnoverRate().setScale(2, java.math.RoundingMode.HALF_UP)); - return shopOrderStatistic;*/ } @Override @@ -129,7 +131,7 @@ public class DataSummaryServiceImpl implements DataSummaryService { param.setBeginDate(days.getFirst() + " 00:00:00"); param.setEndDate(days.getLast() + " 23:59:59"); PageHelper.startPage(PageUtil.buildPageHelp()); - PageInfo pageInfo = new PageInfo<>(shopProdStatisticMapper.findProdRandingSummaryPage2(param)); + PageInfo pageInfo = new PageInfo<>(shopProdStatisticMapper.findProdRandingSummaryPage(param)); return PageUtil.convert(pageInfo); } @@ -138,7 +140,7 @@ public class DataSummaryServiceImpl implements DataSummaryService { LocalDate now = LocalDate.now(); LocalDate beginDate = now.plusDays(-day); DataSummaryDateAmountVo data = new DataSummaryDateAmountVo(); - List total = new ArrayList<>(); + List total = new ArrayList<>(); for (int i = 1; i <= day; i++) { String thisDay = beginDate.plusDays(i).format(DatePattern.NORM_DATE_FORMATTER); OrderInfo orderInfo = orderInfoMapper.selectOneByQuery(QueryWrapper.create() @@ -147,7 +149,7 @@ public class DataSummaryServiceImpl implements DataSummaryService { .eq(OrderInfo::getTradeDay, thisDay) .isNotNull(OrderInfo::getPaidTime) ); - DataSummaryDateAmountVo.TotalVo totalVo = new DataSummaryDateAmountVo.TotalVo(); + TotalVo totalVo = new TotalVo(); if (orderInfo != null) { totalVo.setOrderAmount(orderInfo.getOrderAmount()); totalVo.setActualAmount(orderInfo.getPayAmount()); @@ -209,4 +211,5 @@ public class DataSummaryServiceImpl implements DataSummaryService { public List getShopIdList() { return shopOrderStatisticMapper.getShopIdList(); } + } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/SaleSummaryServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/SaleSummaryServiceImpl.java index 2b2f6d6a5..e8c62aa6d 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/SaleSummaryServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/SaleSummaryServiceImpl.java @@ -27,7 +27,7 @@ public class SaleSummaryServiceImpl implements SaleSummaryService { @Override public SaleSummaryCountVo summaryCount(SaleSummaryCountParam param) { - SaleSummaryCountVo saleSummaryCount = shopProdStatisticMapper.getSaleSummaryCount2(param); + SaleSummaryCountVo saleSummaryCount = shopProdStatisticMapper.getSaleSummaryCount(param); if (saleSummaryCount == null) { saleSummaryCount = new SaleSummaryCountVo(); } @@ -37,12 +37,12 @@ public class SaleSummaryServiceImpl implements SaleSummaryService { @Override public Page summaryPage(SaleSummaryCountParam param) { PageHelper.startPage(PageUtil.buildPageHelp()); - PageInfo pageInfo = new PageInfo<>(shopProdStatisticMapper.findSaleSummaryList2(param)); + PageInfo pageInfo = new PageInfo<>(shopProdStatisticMapper.findSaleSummaryList(param)); return PageUtil.convert(pageInfo); } @Override public List summaryList(SaleSummaryCountParam param) { - return shopProdStatisticMapper.findSaleSummaryList2(param); + return shopProdStatisticMapper.findSaleSummaryList(param); } } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java index 7d59aed8a..93688ed45 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java @@ -10,9 +10,9 @@ import com.czg.order.service.ShopOrderStatisticService; import com.czg.service.order.mapper.ShopOrderStatisticMapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -23,34 +23,54 @@ import java.util.List; * @since 2025-03-07 */ @Service +@Slf4j public class ShopOrderStatisticServiceImpl extends ServiceImpl implements ShopOrderStatisticService { @Resource private DataSummaryService dataSummaryService; @Override - public void statistic() { - // 获取前一天 - DateTime yesterday = DateUtil.yesterday(); + public void statistic(DateTime dateTime) { // 获取前一天的开始时间(00:00:00) - DateTime startOfDay = DateUtil.beginOfDay(yesterday); + DateTime startOfDay = DateUtil.beginOfDay(dateTime); // 获取前一天的结束时间(23:59:59) - DateTime endOfDay = DateUtil.endOfDay(yesterday); + DateTime endOfDay = DateUtil.endOfDay(dateTime); List shopIdList = dataSummaryService.getShopIdList(); if (CollUtil.isEmpty(shopIdList)) { return; } - shopIdList.parallelStream().forEach(shopId -> { - DataSummaryTradeParam param = new DataSummaryTradeParam(); - param.setShopId(shopId); - param.setBeginDate(startOfDay.toStringDefaultTimeZone()); - param.setEndDate(endOfDay.toStringDefaultTimeZone()); - ShopOrderStatistic statistic = dataSummaryService.getTradeData(param); - statistic.setShopId(shopId); - statistic.setCreateDay(LocalDate.now()); - statistic.setUpdateTime(LocalDateTime.now()); - saveOrUpdate(statistic); - }); + List> split = CollUtil.split(shopIdList, 5); + for (List splitIdList : split) { + splitIdList.parallelStream().forEach(shopId -> { + DataSummaryTradeParam param = new DataSummaryTradeParam(); + param.setShopId(shopId); + param.setBeginDate(startOfDay.toStringDefaultTimeZone()); + param.setEndDate(endOfDay.toStringDefaultTimeZone()); + ShopOrderStatistic statistic = dataSummaryService.getRealTimeTradeData(param); + statistic.setShopId(shopId); + statistic.setCreateDay(dateTime.toLocalDateTime().toLocalDate()); + statistic.setUpdateTime(LocalDateTime.now()); + if (statistic.getNewMemberCount() != 0L) { + System.out.println("newMemberCount:" + statistic.getNewMemberCount()); + } + // 如果没有订单和退款,则不更新数据,否则会产出很多数据 + if (statistic.getSaleCount() == 0 + && statistic.getRefundCount() == 0 + && statistic.getMemberPayCount() == 0 + && statistic.getNewMemberCount() == 0 + ) { + log.info("店铺:{},{},没有要存档的订单统计数据", shopId, dateTime.toDateStr()); + } else { + ShopOrderStatistic entity = getMapper().selectOneByQuery(query().eq(ShopOrderStatistic::getShopId, shopId).eq(ShopOrderStatistic::getCreateDay, dateTime.toDateStr())); + if (entity != null) { + statistic.setId(entity.getId()); + updateById(statistic); + } else { + save(statistic); + } + } + }); + } } } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java index 5d3e9e02f..796d95387 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java @@ -1,35 +1,41 @@ package com.czg.service.order.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; -import com.czg.order.entity.OrderDetail; -import com.czg.order.service.OrderDetailService; +import cn.hutool.core.util.NumberUtil; +import com.czg.order.entity.ShopProdStatistic; +import com.czg.order.param.DataSummaryProductSaleParam; +import com.czg.order.service.DataSummaryService; +import com.czg.order.service.ShopProdStatisticService; +import com.czg.order.vo.DataSummaryProductSaleRankingVo; +import com.czg.service.order.mapper.ShopProdStatisticMapper; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; -import com.czg.order.entity.ShopProdStatistic; -import com.czg.order.service.ShopProdStatisticService; -import com.czg.service.order.mapper.ShopProdStatisticMapper; import jakarta.annotation.Resource; import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** - * 服务层实现。 + * 服务层实现。 * * @author zs * @since 2025-03-07 */ @Service -public class ShopProdStatisticServiceImpl extends ServiceImpl implements ShopProdStatisticService{ +@Slf4j +public class ShopProdStatisticServiceImpl extends ServiceImpl implements ShopProdStatisticService { @Resource - private OrderDetailService orderDetailService; + private DataSummaryService dataSummaryService; + @Resource + private ShopProdStatisticMapper shopProdStatisticMapper; + @Data - private static class StatisticTask{ + private static class StatisticTask { private BigDecimal successCount = BigDecimal.ZERO; private BigDecimal successAmount = BigDecimal.ZERO; private BigDecimal refundCount = BigDecimal.ZERO; @@ -37,57 +43,42 @@ public class ShopProdStatisticServiceImpl extends ServiceImpl orderDetails = orderDetailService.list(new QueryWrapper() - .ge(OrderDetail::getCreateTime, startOfDay) - .le(OrderDetail::getCreateTime, endOfDay) - .ne(OrderDetail::getStatus, "wait-pay")); - - - HashMap> countInfo = new HashMap<>(); - for (OrderDetail item : orderDetails) { - Map map = countInfo.computeIfAbsent(item.getShopId(), k -> new HashMap<>()); - StatisticTask statisticTask = map.get(item.getProductId()); - if (statisticTask == null) { - map.put(item.getProductId(), statisticTask = new StatisticTask()); - } - if ("refunding".equals(item.getStatus()) || "refund".equals(item.getStatus()) || "part-refund".equals(item.getStatus())) { - statisticTask.setRefundAmount(statisticTask.getRefundAmount().add(item.getReturnAmount())); - statisticTask.setRefundCount(statisticTask.getRefundCount().add(item.getRefundNum())); - if (item.getReturnNum().compareTo(item.getNum()) < 0) { - statisticTask.setSuccessAmount(statisticTask.getSuccessAmount().add(item.getPayAmount().subtract(item.getReturnAmount()))); - statisticTask.setSuccessCount(statisticTask.getSuccessCount().add(item.getNum().subtract(item.getReturnAmount()))); - } - }else { - statisticTask.setSuccessCount(statisticTask.getSuccessCount().add(item.getNum())); - statisticTask.setSuccessAmount(statisticTask.getSuccessAmount().add(item.getPayAmount())); - } + DateTime endOfDay = DateUtil.endOfDay(dateTime); + List shopIdList = dataSummaryService.getShopIdList(); + if (CollUtil.isEmpty(shopIdList)) { + return; + } + List> split = CollUtil.split(shopIdList, 5); + for (List splitIdList : split) { + splitIdList.parallelStream().forEach(shopId -> { + DataSummaryProductSaleParam param = new DataSummaryProductSaleParam(); + param.setShopId(shopId); + param.setBeginDate(startOfDay.toStringDefaultTimeZone()); + param.setEndDate(endOfDay.toStringDefaultTimeZone()); + // 删除之前统计数据 + getMapper().deleteByQuery(QueryWrapper.create().eq(ShopProdStatistic::getShopId, shopId).eq(ShopProdStatistic::getCreateDay, dateTime.toDateStr())); + // 重新统计数据 + List list = shopProdStatisticMapper.findProdRandingSummaryPage2(param); + for (DataSummaryProductSaleRankingVo dto : list) { + ShopProdStatistic entity = new ShopProdStatistic(); + entity.setProdId(dto.getProductId()); + entity.setSaleCount(dto.getNumber()); + entity.setSaleAmount(dto.getAmount()); + entity.setRefundCount(dto.getRefundCount()); + entity.setRefundAmount(dto.getRefundAmount()); + entity.setShopId(shopId); + entity.setCreateDay(dateTime.toJdkDate()); + if (NumberUtil.isLessOrEqual(entity.getSaleCount(), BigDecimal.ZERO) && NumberUtil.isLessOrEqual(entity.getRefundCount(), BigDecimal.ZERO)) { + log.info("店铺:{},{},没有要存档的商品统计数据", shopId, dateTime.toDateStr()); + } else { + save(entity); + } + } + }); } - - countInfo.forEach((shopId, map) -> map.forEach((productId, statisticTask) -> { - ShopProdStatistic statistic = getOne(new QueryWrapper().eq(ShopProdStatistic::getShopId, shopId).eq(ShopProdStatistic::getCreateDay, yesterday.toSqlDate())); - if (statistic == null) { - statistic = new ShopProdStatistic(); - statistic.setShopId(shopId); - statistic.setCreateDay(yesterday.toSqlDate()); - } - statistic.setProdId(productId); - statistic.setSaleCount(statisticTask.getSuccessCount()); - statistic.setSaleAmount(statisticTask.getSuccessAmount()); - statistic.setRefundCount(statisticTask.getRefundCount()); - statistic.setRefundAmount(statisticTask.getRefundAmount()); - saveOrUpdate(statistic); - })); - - } - - } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopTableOrderStatisticServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopTableOrderStatisticServiceImpl.java index ccadfb5d1..f3ac76f5a 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopTableOrderStatisticServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopTableOrderStatisticServiceImpl.java @@ -1,25 +1,26 @@ package com.czg.service.order.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; -import com.czg.config.RedisCst; -import com.czg.order.entity.OrderInfo; -import com.czg.order.service.OrderInfoService; +import com.czg.order.entity.ShopTableOrderStatistic; +import com.czg.order.param.TableSummaryParam; +import com.czg.order.service.DataSummaryService; +import com.czg.order.service.ShopTableOrderStatisticService; +import com.czg.order.vo.TableSummaryInfoVo; +import com.czg.service.order.mapper.ShopTableOrderStatisticMapper; import com.czg.utils.PageUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; -import com.czg.order.entity.ShopTableOrderStatistic; -import com.czg.order.service.ShopTableOrderStatisticService; -import com.czg.service.order.mapper.ShopTableOrderStatisticMapper; import jakarta.annotation.Resource; import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.HashMap; import java.util.List; /** @@ -29,35 +30,38 @@ import java.util.List; * @since 2025-03-07 */ @Service -public class ShopTableOrderStatisticServiceImpl extends ServiceImpl implements ShopTableOrderStatisticService{ +@Slf4j +public class ShopTableOrderStatisticServiceImpl extends ServiceImpl implements ShopTableOrderStatisticService { @Resource - private OrderInfoService orderInfoService; + private DataSummaryService dataSummaryService; + @Resource + private ShopTableOrderStatisticMapper shopTableOrderStatisticMapper; @Override public Page summary(Long shopId, String startTime, String endTime) { Page page = PageUtil.buildPage(); - PageHelper.startPage(Math.toIntExact(page.getPageNumber()),Math.toIntExact(page.getPageSize())); + PageHelper.startPage(Math.toIntExact(page.getPageNumber()), Math.toIntExact(page.getPageSize())); return PageUtil.convert(new PageInfo<>(mapper.selectSummary(shopId, startTime, endTime))); } @Override public boolean addInfo(long shopId, long tableId, long count, BigDecimal amount) { - ShopTableOrderStatistic statistic = getOne(new QueryWrapper().eq(ShopTableOrderStatistic::getShopId, shopId).eq(ShopTableOrderStatistic::getTableId, tableId) - .eq(ShopTableOrderStatistic::getCreateDay, DateUtil.date().toDateStr())); - if (statistic == null) { - statistic = new ShopTableOrderStatistic(); - statistic.setShopId(shopId); - statistic.setTableId(tableId); - statistic.setCreateDay(DateUtil.date().toSqlDate()); - statistic.setOrderCount(count); - statistic.setOrderAmount(amount); - save(statistic); - } - return mapper.incrInfo(shopId, tableId, count, amount, DateUtil.date().toDateStr()); + ShopTableOrderStatistic statistic = getOne(new QueryWrapper().eq(ShopTableOrderStatistic::getShopId, shopId).eq(ShopTableOrderStatistic::getTableId, tableId) + .eq(ShopTableOrderStatistic::getCreateDay, DateUtil.date().toDateStr())); + if (statistic == null) { + statistic = new ShopTableOrderStatistic(); + statistic.setShopId(shopId); + statistic.setTableId(tableId); + statistic.setCreateDay(DateUtil.date().toSqlDate()); + statistic.setOrderCount(count); + statistic.setOrderAmount(amount); + save(statistic); + } + return mapper.incrInfo(shopId, tableId, count, amount, DateUtil.date().toDateStr()); } @Data - private static class StatisticTask{ + private static class StatisticTask { private long successCount = 0; private BigDecimal successAmount = BigDecimal.ZERO; private long refundCount = 0; @@ -65,53 +69,46 @@ public class ShopTableOrderStatisticServiceImpl extends ServiceImpl orderInfos = orderInfoService.list(new QueryWrapper() - .ge(OrderInfo::getCreateTime, startOfDay) - .le(OrderInfo::getCreateTime, endOfDay) - .ne(OrderInfo::getStatus, "unpaid").ne(OrderInfo::getStatus, "cancelled")); - - HashMap countInfo = new HashMap<>(); - for (OrderInfo item : orderInfos) { - StatisticTask statisticTask = countInfo.get(item.getShopId()); - if (statisticTask == null) { - countInfo.put(item.getShopId(), statisticTask = new StatisticTask()); - } - if ("refunding".equals(item.getStatus()) || "refund".equals(item.getStatus()) || "part-refund".equals(item.getStatus())) { - statisticTask.setRefundAmount(statisticTask.getRefundAmount().add(item.getRefundAmount())); - statisticTask.setRefundCount(statisticTask.getRefundCount() + 1); - if (item.getRefundAmount().compareTo(item.getPayAmount()) < 0) { - statisticTask.setSuccessAmount(statisticTask.getSuccessAmount().add(item.getPayAmount().subtract(item.getRefundAmount()))); - } - }else { - statisticTask.setSuccessCount(statisticTask.getSuccessCount() + 1); - statisticTask.setSuccessAmount(statisticTask.getSuccessAmount().add(item.getPayAmount())); - } + DateTime endOfDay = DateUtil.endOfDay(dateTime); + List shopIdList = dataSummaryService.getShopIdList(); + if (CollUtil.isEmpty(shopIdList)) { + return; + } + List> split = CollUtil.split(shopIdList, 5); + for (List splitIdList : split) { + splitIdList.parallelStream().forEach(shopId -> { + TableSummaryParam param = new TableSummaryParam(); + param.setShopId(shopId); + param.setBeginDate(startOfDay.toStringDefaultTimeZone()); + param.setEndDate(endOfDay.toStringDefaultTimeZone()); + // 删除之前统计数据 + getMapper().deleteByQuery(QueryWrapper.create().eq(ShopTableOrderStatistic::getShopId, shopId).eq(ShopTableOrderStatistic::getCreateDay, dateTime.toDateStr())); + // 重新统计数据 + List list = shopTableOrderStatisticMapper.findSummaryList2(param); + for (TableSummaryInfoVo dto : list) { + ShopTableOrderStatistic entity = new ShopTableOrderStatistic(); + entity.setTableId(dto.getTableId()); + entity.setTableCode(dto.getTableCode()); + entity.setTableName(dto.getTableName()); + entity.setAreaName(dto.getAreaName()); + entity.setOrderCount(dto.getOrderCount()); + entity.setOrderAmount(dto.getOrderAmount()); + entity.setRefundCount(dto.getRefundCount()); + entity.setRefundAmount(dto.getRefundAmount()); + entity.setShopId(shopId); + entity.setCreateDay(dateTime.toJdkDate()); + if (entity.getOrderCount() == 0L && entity.getRefundCount() == 0L) { + log.info("店铺:{},{},没有要存档的台桌统计数据", shopId, dateTime.toDateStr()); + } else { + save(entity); + } + } + }); } - - countInfo.forEach((shopId, statisticTask) -> { - ShopTableOrderStatistic statistic = getOne(new QueryWrapper().eq(ShopTableOrderStatistic::getShopId, shopId).eq(ShopTableOrderStatistic::getCreateDay, yesterday.toSqlDate())); - if (statistic == null) { - statistic = new ShopTableOrderStatistic(); - statistic.setShopId(shopId); - statistic.setTableId(0L); - statistic.setCreateDay(yesterday.toSqlDate()); - } - statistic.setOrderCount(statisticTask.getSuccessCount()); - statistic.setOrderAmount(statisticTask.getSuccessAmount()); - statistic.setRefundCount(statisticTask.getRefundCount()); - statistic.setRefundAmount(statisticTask.getRefundAmount()); - saveOrUpdate(statistic); - }); - } } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/TableSummaryServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/TableSummaryServiceImpl.java index 9d0ed8551..cf43704b3 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/TableSummaryServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/TableSummaryServiceImpl.java @@ -30,7 +30,7 @@ public class TableSummaryServiceImpl implements TableSummaryService { @Override public List summaryList(TableSummaryParam param) { - return shopTableOrderStatisticMapper.findSummaryList2(param); + return shopTableOrderStatisticMapper.findSummaryList(param); } @Override diff --git a/cash-service/order-service/src/main/resources/mapper/ShopProdStatisticMapper.xml b/cash-service/order-service/src/main/resources/mapper/ShopProdStatisticMapper.xml index d8bd485e2..d4ebdb653 100644 --- a/cash-service/order-service/src/main/resources/mapper/ShopProdStatisticMapper.xml +++ b/cash-service/order-service/src/main/resources/mapper/ShopProdStatisticMapper.xml @@ -17,7 +17,8 @@ #{day} - group by t1.prod_id + group by t1.prod_id,t2.name + order by sum(t1.sale_count) desc