打印数据
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
package com.czg.controller.admin;
|
package com.czg.controller.admin;
|
||||||
|
|
||||||
import com.czg.excel.ExcelExportUtil;
|
import com.czg.excel.ExcelExportUtil;
|
||||||
import com.czg.log.annotation.OperationLog;
|
|
||||||
import com.czg.order.entity.ShopProdStatistic;
|
import com.czg.order.entity.ShopProdStatistic;
|
||||||
import com.czg.order.param.SaleSummaryCountParam;
|
import com.czg.order.param.SaleSummaryCountParam;
|
||||||
import com.czg.order.service.ShopProdStatisticService;
|
import com.czg.order.service.ShopProdStatisticService;
|
||||||
@@ -36,7 +35,6 @@ public class SaleSummaryController {
|
|||||||
* 统计
|
* 统计
|
||||||
*/
|
*/
|
||||||
@GetMapping("count")
|
@GetMapping("count")
|
||||||
@OperationLog("统计")
|
|
||||||
//@SaAdminCheckPermission("saleSummary:count")
|
//@SaAdminCheckPermission("saleSummary:count")
|
||||||
public CzgResult<SaleSummaryCountVo> summaryCount(SaleSummaryCountParam param) {
|
public CzgResult<SaleSummaryCountVo> summaryCount(SaleSummaryCountParam param) {
|
||||||
if (param.getShopId() == null) {
|
if (param.getShopId() == null) {
|
||||||
@@ -50,7 +48,6 @@ public class SaleSummaryController {
|
|||||||
* 分页
|
* 分页
|
||||||
*/
|
*/
|
||||||
@GetMapping("page")
|
@GetMapping("page")
|
||||||
@OperationLog("分页")
|
|
||||||
//@SaAdminCheckPermission("saleSummary:page")
|
//@SaAdminCheckPermission("saleSummary:page")
|
||||||
public CzgResult<List<ShopProdStatistic>> summaryPage(SaleSummaryCountParam param) {
|
public CzgResult<List<ShopProdStatistic>> summaryPage(SaleSummaryCountParam param) {
|
||||||
if (param.getShopId() == null) {
|
if (param.getShopId() == null) {
|
||||||
@@ -60,6 +57,9 @@ public class SaleSummaryController {
|
|||||||
return CzgResult.success(list);
|
return CzgResult.success(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品报表导出
|
||||||
|
*/
|
||||||
@GetMapping("/export")
|
@GetMapping("/export")
|
||||||
public void summaryExport(SaleSummaryCountParam param, HttpServletResponse response) {
|
public void summaryExport(SaleSummaryCountParam param, HttpServletResponse response) {
|
||||||
if (param.getShopId() == null) {
|
if (param.getShopId() == null) {
|
||||||
@@ -68,4 +68,15 @@ public class SaleSummaryController {
|
|||||||
ExcelExportUtil.exportToResponse(prodStatisticService.getArchiveTradeData(param), ShopProdStatistic.class, "销售统计明细", response);
|
ExcelExportUtil.exportToResponse(prodStatisticService.getArchiveTradeData(param), ShopProdStatistic.class, "销售统计明细", response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品报表打印
|
||||||
|
*/
|
||||||
|
@GetMapping("/print")
|
||||||
|
public void summaryPrint(SaleSummaryCountParam param) {
|
||||||
|
if (param.getShopId() == null) {
|
||||||
|
param.setShopId(StpKit.USER.getShopId());
|
||||||
|
}
|
||||||
|
prodStatisticService.summaryPrint(param);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package com.czg.controller.admin;
|
||||||
|
|
||||||
|
|
||||||
|
import com.czg.order.entity.SysPrintData;
|
||||||
|
import com.czg.order.service.SysPrintDataService;
|
||||||
|
import com.czg.resp.CzgResult;
|
||||||
|
import com.mybatisflex.core.query.QueryWrapper;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打印数据
|
||||||
|
*
|
||||||
|
* @author ww
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/admin/printData")
|
||||||
|
public class SysPrintDataController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SysPrintDataService sysPrintDataService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取打印数据
|
||||||
|
*/
|
||||||
|
@GetMapping
|
||||||
|
public CzgResult<SysPrintData> getWareCount(@RequestParam Long shopId, @RequestParam Long dataId, @RequestParam String type) {
|
||||||
|
return CzgResult.success(sysPrintDataService.getOne(new QueryWrapper()
|
||||||
|
.eq(SysPrintData::getType, type)
|
||||||
|
.eq(SysPrintData::getShopId, shopId)
|
||||||
|
.eq(SysPrintData::getId, dataId)));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,9 +3,12 @@ package com.czg.mq;
|
|||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.czg.config.RabbitConstants;
|
import com.czg.config.RabbitConstants;
|
||||||
|
import com.czg.config.RabbitPublisher;
|
||||||
import com.czg.config.RedisCst;
|
import com.czg.config.RedisCst;
|
||||||
import com.czg.order.entity.MqLog;
|
import com.czg.order.entity.MqLog;
|
||||||
|
import com.czg.order.entity.SysPrintData;
|
||||||
import com.czg.order.service.MqLogService;
|
import com.czg.order.service.MqLogService;
|
||||||
|
import com.czg.order.service.SysPrintDataService;
|
||||||
import com.czg.service.RedisService;
|
import com.czg.service.RedisService;
|
||||||
import com.czg.service.order.print.PrintConfig;
|
import com.czg.service.order.print.PrintConfig;
|
||||||
import com.czg.service.order.print.PrinterHandler;
|
import com.czg.service.order.print.PrinterHandler;
|
||||||
@@ -30,6 +33,10 @@ public class PrintMqListener {
|
|||||||
private RedisService redisService;
|
private RedisService redisService;
|
||||||
@Resource
|
@Resource
|
||||||
private PrintConfig printConfig;
|
private PrintConfig printConfig;
|
||||||
|
@Resource
|
||||||
|
private RabbitPublisher rabbitPublisher;
|
||||||
|
@Resource
|
||||||
|
protected SysPrintDataService printDataService;
|
||||||
|
|
||||||
private <T> void invokeFun(String queue, String type, String plat, T data, Consumer<T> consumer) {
|
private <T> void invokeFun(String queue, String type, String plat, T data, Consumer<T> consumer) {
|
||||||
long startTime = DateUtil.date().getTime();
|
long startTime = DateUtil.date().getTime();
|
||||||
@@ -74,6 +81,11 @@ public class PrintMqListener {
|
|||||||
@RabbitListener(queues = {"${spring.profiles.active}-" + RabbitConstants.Queue.OTHER_PRINT_QUEUE})
|
@RabbitListener(queues = {"${spring.profiles.active}-" + RabbitConstants.Queue.OTHER_PRINT_QUEUE})
|
||||||
public void otherPrint(Long shopId, Object o, String printTypeEnum) {
|
public void otherPrint(Long shopId, Object o, String printTypeEnum) {
|
||||||
PrinterHandler.PrintTypeEnum typeEnum = PrinterHandler.PrintTypeEnum.valueOf(printTypeEnum);
|
PrinterHandler.PrintTypeEnum typeEnum = PrinterHandler.PrintTypeEnum.valueOf(printTypeEnum);
|
||||||
|
SysPrintData sysPrintData = new SysPrintData();
|
||||||
|
sysPrintData.setShopId(shopId);
|
||||||
|
sysPrintData.setData(JSONObject.toJSONString(o));
|
||||||
|
printDataService.save(sysPrintData);
|
||||||
|
rabbitPublisher.sendOtherPrintLocalMsg(shopId, printTypeEnum, sysPrintData.getId());
|
||||||
printConfig.otherHandler(shopId, o, typeEnum);
|
printConfig.otherHandler(shopId, o, typeEnum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,6 +82,16 @@ public class RabbitConfig {
|
|||||||
return BindingBuilder.bind(otherPrintQueue).to(exchange).with(activeProfile + "-" + RabbitConstants.Queue.OTHER_PRINT_QUEUE);
|
return BindingBuilder.bind(otherPrintQueue).to(exchange).with(activeProfile + "-" + RabbitConstants.Queue.OTHER_PRINT_QUEUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Queue otherPrintLocalQueue() {
|
||||||
|
return new Queue(activeProfile + "-" + RabbitConstants.Queue.OTHER_PRINT_LOCAL_QUEUE, true, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Binding bindingOtherPrintLocalExchange(Queue otherPrintLocalQueue, DirectExchange exchange) {
|
||||||
|
return BindingBuilder.bind(otherPrintLocalQueue).to(exchange).with(activeProfile + "-" + RabbitConstants.Queue.OTHER_PRINT_LOCAL_QUEUE);
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------订单取消
|
//------------------------------------------------------订单取消
|
||||||
@Bean
|
@Bean
|
||||||
public Queue orderCancelQueue() {
|
public Queue orderCancelQueue() {
|
||||||
@@ -115,6 +125,7 @@ public class RabbitConfig {
|
|||||||
public Binding bindingProductInfoChange(Queue productInfoChangeQueue, DirectExchange exchange) {
|
public Binding bindingProductInfoChange(Queue productInfoChangeQueue, DirectExchange exchange) {
|
||||||
return BindingBuilder.bind(productInfoChangeQueue).to(exchange).with(activeProfile + "-" + RabbitConstants.Queue.PRODUCT_INFO_CHANGE_QUEUE);
|
return BindingBuilder.bind(productInfoChangeQueue).to(exchange).with(activeProfile + "-" + RabbitConstants.Queue.PRODUCT_INFO_CHANGE_QUEUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------ 耗材信息更新
|
//------------------------------------------------------ 耗材信息更新
|
||||||
@Bean
|
@Bean
|
||||||
public Queue consInfoChangeQueue() {
|
public Queue consInfoChangeQueue() {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ public interface RabbitConstants {
|
|||||||
public static final String ORDER_MACHINE_PRINT_QUEUE = "order.machine.print.queue";
|
public static final String ORDER_MACHINE_PRINT_QUEUE = "order.machine.print.queue";
|
||||||
|
|
||||||
public static final String OTHER_PRINT_QUEUE = "other.print.queue";
|
public static final String OTHER_PRINT_QUEUE = "other.print.queue";
|
||||||
|
public static final String OTHER_PRINT_LOCAL_QUEUE = "other.print.local.queue";
|
||||||
public static final String PRODUCT_INFO_CHANGE_QUEUE = "product.info.change.queue";
|
public static final String PRODUCT_INFO_CHANGE_QUEUE = "product.info.change.queue";
|
||||||
public static final String CONS_INFO_CHANGE_QUEUE = "cons.info.change.queue";
|
public static final String CONS_INFO_CHANGE_QUEUE = "cons.info.change.queue";
|
||||||
|
|
||||||
|
|||||||
@@ -155,6 +155,7 @@ public class RabbitPublisher {
|
|||||||
* STOCK_CHECK 库存盘点
|
* STOCK_CHECK 库存盘点
|
||||||
* HANDOVER 交班单
|
* HANDOVER 交班单
|
||||||
* CALL 排队取号
|
* CALL 排队取号
|
||||||
|
*
|
||||||
* @param printType {@link com.czg.service.order.print.PrinterHandler.PrintTypeEnum}
|
* @param printType {@link com.czg.service.order.print.PrinterHandler.PrintTypeEnum}
|
||||||
*/
|
*/
|
||||||
public void sendOtherPrintMsg(Long shopId, Object data, String printType) {
|
public void sendOtherPrintMsg(Long shopId, Object data, String printType) {
|
||||||
@@ -167,4 +168,14 @@ public class RabbitPublisher {
|
|||||||
rabbitTemplate.convertAndSend(exchange, queueName, msg);
|
rabbitTemplate.convertAndSend(exchange, queueName, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendOtherPrintLocalMsg(Long shopId, String printType, Long dataId) {
|
||||||
|
String exchange = activeProfile + "-" + RabbitConstants.Exchange.CASH_EXCHANGE;
|
||||||
|
String queueName = activeProfile + "-" + RabbitConstants.Queue.OTHER_PRINT_LOCAL_QUEUE;
|
||||||
|
Map<String, Object> msg = new HashMap<>();
|
||||||
|
msg.put("shopId", shopId);
|
||||||
|
msg.put("dataId", dataId);
|
||||||
|
msg.put("printType", printType);
|
||||||
|
rabbitTemplate.convertAndSend(exchange, queueName, msg);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import jakarta.validation.constraints.DecimalMin;
|
|||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -32,11 +33,12 @@ public interface MkShopRechargeService extends IService<MkShopRecharge> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 充值
|
* 充值
|
||||||
|
*
|
||||||
* @param isNoJoin 是否没有执行 加入会员的方法
|
* @param isNoJoin 是否没有执行 加入会员的方法
|
||||||
* 会员如果是条件开通 则 需要统计
|
* 会员如果是条件开通 则 需要统计
|
||||||
*/
|
*/
|
||||||
void recharge(Long shopId, Long shopUserId, Long rechargeDetailId, BigDecimal amount, Long paymentId,
|
void recharge(Long shopId, Long shopUserId, Long rechargeDetailId, BigDecimal amount, Long paymentId,
|
||||||
String payType, ShopUserFlowBizEnum bizEnum, boolean isNoJoin);
|
String payType, LocalDateTime payTime, ShopUserFlowBizEnum bizEnum, boolean isNoJoin, String operator);
|
||||||
|
|
||||||
List<RechargeListVO> getList(long loginIdAsLong);
|
List<RechargeListVO> getList(long loginIdAsLong);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
package com.czg.order.dto;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
import java.io.Serial;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据打印表 实体类。
|
||||||
|
*
|
||||||
|
* @author ww
|
||||||
|
* @since 2026-04-16
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class SysPrintDataDTO implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private Long shopId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打印数据 Json格式
|
||||||
|
*/
|
||||||
|
private String data;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
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.io.Serial;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据打印表 实体类。
|
||||||
|
*
|
||||||
|
* @author ww
|
||||||
|
* @since 2026-04-16
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Table("sys_print_data")
|
||||||
|
public class SysPrintData implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Id(keyType = KeyType.Auto)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private Long shopId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打印类型
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
/**
|
||||||
|
* 打印数据 Json格式
|
||||||
|
*/
|
||||||
|
private String data;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -56,4 +56,9 @@ public class SaleSummaryCountParam implements Serializable {
|
|||||||
* 店铺id
|
* 店铺id
|
||||||
*/
|
*/
|
||||||
private Long shopId;
|
private Long shopId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作人
|
||||||
|
*/
|
||||||
|
private String operator;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,22 +23,30 @@ public interface ShopProdStatisticService extends IService<ShopProdStatistic> {
|
|||||||
*/
|
*/
|
||||||
SaleSummaryCountVo summaryCount(SaleSummaryCountParam param);
|
SaleSummaryCountVo summaryCount(SaleSummaryCountParam param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打印 商品交易数据
|
||||||
|
*/
|
||||||
|
void summaryPrint(SaleSummaryCountParam param);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取某一段时间的商品交易数据
|
* 获取某一段时间的商品交易数据
|
||||||
* shopId 店铺id
|
* shopId 店铺id
|
||||||
* rangeType 时间范围类型
|
* rangeType 时间范围类型
|
||||||
* TODAY, // 今天
|
* TODAY, // 今天
|
||||||
* YESTERDAY, // 昨天
|
* YESTERDAY, // 昨天
|
||||||
* LAST_7_DAYS, // 最近7天
|
* LAST_7_DAYS, // 最近7天
|
||||||
* LAST_30_DAYS,// 最近30天
|
* LAST_30_DAYS,// 最近30天
|
||||||
* THIS_WEEK, // 本周
|
* THIS_WEEK, // 本周
|
||||||
* THIS_MONTH // 本月
|
* THIS_MONTH // 本月
|
||||||
* CUSTOM // 自定义时间范围
|
* CUSTOM // 自定义时间范围
|
||||||
* start 开始时间 格式yyyy-MM-dd 今天/昨天不用传
|
* start 开始时间 格式yyyy-MM-dd 今天/昨天不用传
|
||||||
* end 结束时间 格式yyyy-MM-dd 今天/昨天不用传
|
* end 结束时间 格式yyyy-MM-dd 今天/昨天不用传
|
||||||
|
*
|
||||||
* @return 商品数据
|
* @return 商品数据
|
||||||
*/
|
*/
|
||||||
List<ShopProdStatistic> getArchiveTradeData(SaleSummaryCountParam param);
|
List<ShopProdStatistic> getArchiveTradeData(SaleSummaryCountParam param);
|
||||||
|
|
||||||
List<ShopProdStatistic> getArchiveTradeDataBy10(Long shopId, Integer day);
|
List<ShopProdStatistic> getArchiveTradeDataBy10(Long shopId, Integer day);
|
||||||
|
|
||||||
//------------------------------------------------------------下列为 后台使用------------------------------------------------------------
|
//------------------------------------------------------------下列为 后台使用------------------------------------------------------------
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package com.czg.order.service;
|
||||||
|
|
||||||
|
import com.mybatisflex.core.service.IService;
|
||||||
|
import com.czg.order.entity.SysPrintData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据打印表 服务层。
|
||||||
|
*
|
||||||
|
* @author ww
|
||||||
|
* @since 2026-04-16
|
||||||
|
*/
|
||||||
|
public interface SysPrintDataService extends IService<SysPrintData> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -5,7 +5,6 @@ import lombok.experimental.Accessors;
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品报表打印实体
|
* 商品报表打印实体
|
||||||
@@ -50,9 +49,39 @@ public class ProductReportPrintDTO {
|
|||||||
* 商品明细列表
|
* 商品明细列表
|
||||||
* 分类名称,商品集合
|
* 分类名称,商品集合
|
||||||
*/
|
*/
|
||||||
private Map<String, List<ProductItem>> items;
|
private List<CategoryItem> items;
|
||||||
|
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public static class CategoryItem {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品名称(第二列商品名称)
|
||||||
|
*/
|
||||||
|
private String categoryName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数量(第三列数量)
|
||||||
|
*/
|
||||||
|
private BigDecimal number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实收(第四列)
|
||||||
|
*/
|
||||||
|
private BigDecimal actualAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 销售额(第五列)
|
||||||
|
*/
|
||||||
|
private BigDecimal salesAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品明细列表
|
||||||
|
*/
|
||||||
|
private List<ProductItem> productItems;
|
||||||
|
}
|
||||||
|
|
||||||
public ProductItem createProductItem(String productName, BigDecimal number, BigDecimal actualAmount, BigDecimal salesAmount) {
|
public ProductItem createProductItem(String productName, BigDecimal number, BigDecimal actualAmount, BigDecimal salesAmount) {
|
||||||
ProductItem item = new ProductItem();
|
ProductItem item = new ProductItem();
|
||||||
item.setProductName(productName);
|
item.setProductName(productName);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import java.time.LocalDateTime;
|
|||||||
public class RechargePrintDTO {
|
public class RechargePrintDTO {
|
||||||
//店铺名称
|
//店铺名称
|
||||||
private String shopName;
|
private String shopName;
|
||||||
private String userId;
|
private Long userId;
|
||||||
private String userName;
|
private String userName;
|
||||||
private String userPhone;
|
private String userPhone;
|
||||||
//支付时间
|
//支付时间
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.mybatisflex.core.service.IService;
|
|||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 店铺商品分类
|
* 店铺商品分类
|
||||||
@@ -26,15 +27,22 @@ public interface ShopProdCategoryService extends IService<ShopProdCategory> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取店铺商品分类列表
|
* 获取店铺商品分类列表
|
||||||
|
*
|
||||||
* @param param 查询参数
|
* @param param 查询参数
|
||||||
* @return 店铺商品分类列表
|
* @return 店铺商品分类列表
|
||||||
*/
|
*/
|
||||||
List<ShopProdCategoryDTO> getShopProdCategoryList(ShopProdCategoryDTO param);
|
List<ShopProdCategoryDTO> getShopProdCategoryList(ShopProdCategoryDTO param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据店铺id获取分类id和名称的映射
|
||||||
|
*/
|
||||||
|
Map<Long, String> getCategoryIdNameMap(Long shopId);
|
||||||
|
|
||||||
void exportShopProdCategory(ShopProdCategoryDTO param, HttpServletResponse response);
|
void exportShopProdCategory(ShopProdCategoryDTO param, HttpServletResponse response);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取店铺商品分类详情
|
* 获取店铺商品分类详情
|
||||||
|
*
|
||||||
* @param id id
|
* @param id id
|
||||||
* @return 店铺商品分类详情
|
* @return 店铺商品分类详情
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import com.czg.account.entity.ShopUser;
|
|||||||
import com.czg.account.service.ShopConfigService;
|
import com.czg.account.service.ShopConfigService;
|
||||||
import com.czg.account.service.ShopInfoService;
|
import com.czg.account.service.ShopInfoService;
|
||||||
import com.czg.account.service.ShopUserService;
|
import com.czg.account.service.ShopUserService;
|
||||||
|
import com.czg.config.RabbitPublisher;
|
||||||
import com.czg.constant.TableValueConstant;
|
import com.czg.constant.TableValueConstant;
|
||||||
import com.czg.enums.ShopUserFlowBizEnum;
|
import com.czg.enums.ShopUserFlowBizEnum;
|
||||||
import com.czg.exception.CzgException;
|
import com.czg.exception.CzgException;
|
||||||
@@ -20,6 +21,7 @@ import com.czg.market.entity.ShopCoupon;
|
|||||||
import com.czg.market.enums.PointsConstant;
|
import com.czg.market.enums.PointsConstant;
|
||||||
import com.czg.market.service.*;
|
import com.czg.market.service.*;
|
||||||
import com.czg.market.vo.*;
|
import com.czg.market.vo.*;
|
||||||
|
import com.czg.print.RechargePrintDTO;
|
||||||
import com.czg.utils.AssertUtil;
|
import com.czg.utils.AssertUtil;
|
||||||
import com.czg.utils.FunUtils;
|
import com.czg.utils.FunUtils;
|
||||||
import com.mybatisflex.core.query.QueryWrapper;
|
import com.mybatisflex.core.query.QueryWrapper;
|
||||||
@@ -32,6 +34,7 @@ import org.apache.dubbo.config.annotation.DubboReference;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -60,6 +63,8 @@ public class MkShopRechargeServiceImpl extends ServiceImpl<MkShopRechargeMapper,
|
|||||||
private ShopInfoService shopInfoService;
|
private ShopInfoService shopInfoService;
|
||||||
@DubboReference
|
@DubboReference
|
||||||
private ShopConfigService shopConfigService;
|
private ShopConfigService shopConfigService;
|
||||||
|
@Resource
|
||||||
|
private RabbitPublisher rabbitPublisher;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MkShopRechargeVO detailApp(Long shopId) {
|
public MkShopRechargeVO detailApp(Long shopId) {
|
||||||
@@ -72,7 +77,7 @@ public class MkShopRechargeServiceImpl extends ServiceImpl<MkShopRechargeMapper,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MkShopRechargeVO detail(Long shopId) throws CzgException{
|
public MkShopRechargeVO detail(Long shopId) throws CzgException {
|
||||||
shopId = shopInfoService.getMainIdByShopId(shopId);
|
shopId = shopInfoService.getMainIdByShopId(shopId);
|
||||||
ShopInfo shopInfo = shopInfoService.getById(shopId);
|
ShopInfo shopInfo = shopInfoService.getById(shopId);
|
||||||
if (shopInfo.getMainId() != null) {
|
if (shopInfo.getMainId() != null) {
|
||||||
@@ -164,7 +169,7 @@ public class MkShopRechargeServiceImpl extends ServiceImpl<MkShopRechargeMapper,
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void recharge(Long shopId, Long shopUserId, Long rechargeDetailId, BigDecimal amount, Long paymentId,
|
public void recharge(Long shopId, Long shopUserId, Long rechargeDetailId, BigDecimal amount, Long paymentId,
|
||||||
String payType, ShopUserFlowBizEnum bizEnum, boolean isNoJoin) {
|
String payType, LocalDateTime payTime, ShopUserFlowBizEnum bizEnum, boolean isNoJoin, String operator) {
|
||||||
log.info("充值回调, 用户id: {}, 金额: {}, rechargeDetailId: {}", shopUserId, amount, rechargeDetailId);
|
log.info("充值回调, 用户id: {}, 金额: {}, rechargeDetailId: {}", shopUserId, amount, rechargeDetailId);
|
||||||
ShopUser shopUser = shopUserService.getById(shopUserId);
|
ShopUser shopUser = shopUserService.getById(shopUserId);
|
||||||
ShopUserMoneyEditDTO shopUserMoneyEditDTO = new ShopUserMoneyEditDTO()
|
ShopUserMoneyEditDTO shopUserMoneyEditDTO = new ShopUserMoneyEditDTO()
|
||||||
@@ -172,12 +177,17 @@ public class MkShopRechargeServiceImpl extends ServiceImpl<MkShopRechargeMapper,
|
|||||||
.setType(1)
|
.setType(1)
|
||||||
.setBizEnum(bizEnum)
|
.setBizEnum(bizEnum)
|
||||||
.setRelationId(paymentId);
|
.setRelationId(paymentId);
|
||||||
|
BigDecimal rechargeAmount = BigDecimal.ZERO;
|
||||||
|
BigDecimal giftAmount = BigDecimal.ZERO;
|
||||||
|
BigDecimal giftPoints = BigDecimal.ZERO;
|
||||||
|
Integer giftCoupon = 0;
|
||||||
|
|
||||||
// 标准充值
|
// 标准充值
|
||||||
if (rechargeDetailId != null) {
|
if (rechargeDetailId != null) {
|
||||||
MkShopRechargeDetail rechargeDetail = shopRechargeDetailService.getById(rechargeDetailId);
|
MkShopRechargeDetail rechargeDetail = shopRechargeDetailService.getById(rechargeDetailId);
|
||||||
shopUserMoneyEditDTO.setMoney(rechargeDetail.getAmount());
|
shopUserMoneyEditDTO.setMoney(rechargeDetail.getAmount());
|
||||||
FunUtils.asyncSafeRunVoid(() -> {
|
rechargeAmount = rechargeDetail.getAmount();
|
||||||
|
try {
|
||||||
// 赠送金额
|
// 赠送金额
|
||||||
ShopUserMoneyEditDTO shopUserMoneyEditRewardDTO = new ShopUserMoneyEditDTO()
|
ShopUserMoneyEditDTO shopUserMoneyEditRewardDTO = new ShopUserMoneyEditDTO()
|
||||||
.setId(shopUserId)
|
.setId(shopUserId)
|
||||||
@@ -186,28 +196,56 @@ public class MkShopRechargeServiceImpl extends ServiceImpl<MkShopRechargeMapper,
|
|||||||
.setRelationId(paymentId);
|
.setRelationId(paymentId);
|
||||||
shopUserMoneyEditRewardDTO.setMoney(rechargeDetail.getRewardAmount());
|
shopUserMoneyEditRewardDTO.setMoney(rechargeDetail.getRewardAmount());
|
||||||
Long editId = shopUserService.updateMoney(shopUserMoneyEditRewardDTO);
|
Long editId = shopUserService.updateMoney(shopUserMoneyEditRewardDTO);
|
||||||
|
giftAmount = rechargeDetail.getRewardAmount();
|
||||||
// 发放积分
|
// 发放积分
|
||||||
if (rechargeDetail.getRewardPoints() != null) {
|
if (rechargeDetail.getRewardPoints() != null) {
|
||||||
|
giftPoints = BigDecimal.valueOf(rechargeDetail.getRewardPoints());
|
||||||
pointsUserService.alterPoints(null, shopUserId, shopUser.getMainShopId(), PointsConstant.ADD, rechargeDetail.getRewardPoints(), editId, "充值赠送");
|
pointsUserService.alterPoints(null, shopUserId, shopUser.getMainShopId(), PointsConstant.ADD, rechargeDetail.getRewardPoints(), editId, "充值赠送");
|
||||||
}
|
}
|
||||||
// 发放优惠券
|
// 发放优惠券
|
||||||
if (StrUtil.isNotBlank(rechargeDetail.getCouponInfoList())) {
|
if (StrUtil.isNotBlank(rechargeDetail.getCouponInfoList())) {
|
||||||
JSONArray.parseArray(rechargeDetail.getCouponInfoList()).toJavaList(CouponInfoDTO.class).forEach(item -> {
|
List<CouponInfoDTO> list = JSONArray.parseArray(rechargeDetail.getCouponInfoList()).toJavaList(CouponInfoDTO.class);
|
||||||
|
for (CouponInfoDTO item : list) {
|
||||||
if (item.getId() == null) {
|
if (item.getId() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
giftCoupon = giftCoupon + item.getNum();
|
||||||
shopCouponRecordService.grant(shopId, new MkRewardCouponDTO().setCouponId(item.getId())
|
shopCouponRecordService.grant(shopId, new MkRewardCouponDTO().setCouponId(item.getId())
|
||||||
.setNum(item.getNum())
|
.setNum(item.getNum())
|
||||||
.setUserId(shopUser.getUserId())
|
.setUserId(shopUser.getUserId())
|
||||||
.setShopId(shopId), "充值赠券");
|
.setShopId(shopId), "充值赠券");
|
||||||
});
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
} catch (Exception e) {
|
||||||
|
log.error("recharge充值有问题", e);
|
||||||
|
}
|
||||||
// 自定义金额
|
// 自定义金额
|
||||||
} else {
|
} else {
|
||||||
shopUserMoneyEditDTO.setMoney(amount);
|
shopUserMoneyEditDTO.setMoney(amount);
|
||||||
|
rechargeAmount = amount;
|
||||||
}
|
}
|
||||||
shopUserService.updateMoney(shopUserMoneyEditDTO);
|
Long flowId = shopUserService.updateMoney(shopUserMoneyEditDTO);
|
||||||
|
BigDecimal finalRechargeAmount = rechargeAmount;
|
||||||
|
BigDecimal finalGiftAmount = giftAmount;
|
||||||
|
BigDecimal finalGiftPoints = giftPoints;
|
||||||
|
Integer finalGiftCoupon = giftCoupon;
|
||||||
|
FunUtils.asyncSafeRunVoid(() -> {
|
||||||
|
RechargePrintDTO rechargePrintDTO = new RechargePrintDTO();
|
||||||
|
rechargePrintDTO.setUserId(shopUserId);
|
||||||
|
rechargePrintDTO.setUserName(shopUser.getNickName());
|
||||||
|
rechargePrintDTO.setUserPhone(shopUser.getPhone());
|
||||||
|
rechargePrintDTO.setPayTime(payTime);
|
||||||
|
rechargePrintDTO.setRechargeAmount(finalRechargeAmount);
|
||||||
|
rechargePrintDTO.setGiftAmount(finalGiftAmount);
|
||||||
|
rechargePrintDTO.setGiftPoints(finalGiftPoints);
|
||||||
|
rechargePrintDTO.setGiftCoupon(finalGiftCoupon);
|
||||||
|
rechargePrintDTO.setPayType(bizEnum.getMsg());
|
||||||
|
rechargePrintDTO.setBalance(shopUser.getAmount().add(finalRechargeAmount).add(finalGiftAmount));
|
||||||
|
rechargePrintDTO.setRechargeId(flowId.toString());
|
||||||
|
rechargePrintDTO.setOperator(operator);
|
||||||
|
rabbitPublisher.sendOtherPrintMsg(shopId, rechargePrintDTO, "RECHARGE");
|
||||||
|
});
|
||||||
FunUtils.asyncSafeRunVoid(() -> {
|
FunUtils.asyncSafeRunVoid(() -> {
|
||||||
memberConfigService.deliver(shopUser, TableValueConstant.MemberExpFlow.Type.RECHARGE, amount, null, rechargeDetailId);
|
memberConfigService.deliver(shopUser, TableValueConstant.MemberExpFlow.Type.RECHARGE, amount, null, rechargeDetailId);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ public class VipPayParamDTO {
|
|||||||
private BigDecimal amount;
|
private BigDecimal amount;
|
||||||
|
|
||||||
private String buyerRemark;
|
private String buyerRemark;
|
||||||
|
private String operator;
|
||||||
/**
|
/**
|
||||||
* 跳转地址
|
* 跳转地址
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package com.czg.service.order.mapper;
|
||||||
|
|
||||||
|
import com.mybatisflex.core.BaseMapper;
|
||||||
|
import com.czg.order.entity.SysPrintData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据打印表 映射层。
|
||||||
|
*
|
||||||
|
* @author ww
|
||||||
|
* @since 2026-04-16
|
||||||
|
*/
|
||||||
|
public interface SysPrintDataMapper extends BaseMapper<SysPrintData> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -62,26 +62,8 @@ public class PrintConfig implements ApplicationRunner {
|
|||||||
|
|
||||||
public static final Map<String, PrinterHandler> PRINTER_MAP = new ConcurrentHashMap<>();
|
public static final Map<String, PrinterHandler> PRINTER_MAP = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
// @PostConstruct
|
|
||||||
// 直接使用实例变量,不需要静态
|
|
||||||
// private Map<String, PrinterHandler> printerMap;
|
|
||||||
// public void init() {
|
|
||||||
// Map<String, PrinterHandler> printers = applicationContext.getBeansOfType(PrinterHandler.class);
|
|
||||||
// printerMap = new ConcurrentHashMap<>();
|
|
||||||
//
|
|
||||||
// printers.forEach((beanName, printer) -> {
|
|
||||||
// String brand = printer.printerBrand;
|
|
||||||
// if (brand != null && !brand.trim().isEmpty()) {
|
|
||||||
// printerMap.put(brand, printer);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// log.info("已注册打印机: {}", printerMap.keySet());
|
|
||||||
// }
|
|
||||||
@Override
|
@Override
|
||||||
public void run(ApplicationArguments args) throws Exception {
|
public void run(ApplicationArguments args) throws Exception {
|
||||||
// 🔥 这里是 Spring 容器完全启动成功后才执行!
|
|
||||||
// 🔥 所有 feiPrinter、yxyPrinter 都已经加载好了!
|
|
||||||
|
|
||||||
Map<String, PrinterHandler> beans = applicationContext.getBeansOfType(PrinterHandler.class);
|
Map<String, PrinterHandler> beans = applicationContext.getBeansOfType(PrinterHandler.class);
|
||||||
|
|
||||||
|
|||||||
@@ -364,7 +364,7 @@ public abstract class PrinterHandler {
|
|||||||
String codeUrl, LocalDateTime takeTime, String shopNote);
|
String codeUrl, LocalDateTime takeTime, String shopNote);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 出入库打印单
|
* 出入库打印单 √
|
||||||
*/
|
*/
|
||||||
protected abstract void stockPrint(PrintMachine machine, String shopName, StockPrintDTO record);
|
protected abstract void stockPrint(PrintMachine machine, String shopName, StockPrintDTO record);
|
||||||
|
|
||||||
@@ -379,12 +379,12 @@ public abstract class PrinterHandler {
|
|||||||
protected abstract void productReportPrint(PrintMachine machine, String shopName, ProductReportPrintDTO record);
|
protected abstract void productReportPrint(PrintMachine machine, String shopName, ProductReportPrintDTO record);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 储值单打印
|
* 储值单打印 √
|
||||||
*/
|
*/
|
||||||
protected abstract void rechargePrint(PrintMachine machine, String shopName, RechargePrintDTO record);
|
protected abstract void rechargePrint(PrintMachine machine, String shopName, RechargePrintDTO record);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 库存盘点打印
|
* 库存盘点打印 √
|
||||||
*/
|
*/
|
||||||
protected abstract void stockCheckPrint(PrintMachine machine, String shopName, StockCheckPrintDTO record);
|
protected abstract void stockCheckPrint(PrintMachine machine, String shopName, StockCheckPrintDTO record);
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import lombok.experimental.Accessors;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -668,37 +667,25 @@ public interface PrinterImpl {
|
|||||||
builder.append(getFormatLabel(header, signLabelInfo.s)).append(signLabelInfo.br);
|
builder.append(getFormatLabel(header, signLabelInfo.s)).append(signLabelInfo.br);
|
||||||
|
|
||||||
// 遍历分类+商品明细
|
// 遍历分类+商品明细
|
||||||
Map<String, List<ProductReportPrintDTO.ProductItem>> itemsMap = record.getItems();
|
List<ProductReportPrintDTO.CategoryItem> items = record.getItems();
|
||||||
if (CollUtil.isNotEmpty(itemsMap)) {
|
if (CollUtil.isNotEmpty(items)) {
|
||||||
for (Map.Entry<String, List<ProductReportPrintDTO.ProductItem>> entry : itemsMap.entrySet()) {
|
for (ProductReportPrintDTO.CategoryItem item : items) {
|
||||||
String categoryName = entry.getKey();
|
List<ProductReportPrintDTO.ProductItem> productList = item.getProductItems();
|
||||||
List<ProductReportPrintDTO.ProductItem> productList = entry.getValue();
|
|
||||||
|
|
||||||
// 先打印分类名称行(分类名称+该分类汇总数量/实收/销售额,和示例图一致)
|
|
||||||
// 分类汇总:遍历该分类下所有商品,求和
|
|
||||||
BigDecimal categoryTotalNum = BigDecimal.ZERO;
|
|
||||||
BigDecimal categoryTotalActual = BigDecimal.ZERO;
|
|
||||||
BigDecimal categoryTotalSales = BigDecimal.ZERO;
|
|
||||||
for (ProductReportPrintDTO.ProductItem item : productList) {
|
|
||||||
categoryTotalNum = categoryTotalNum.add(item.getNumber());
|
|
||||||
categoryTotalActual = categoryTotalActual.add(item.getActualAmount());
|
|
||||||
categoryTotalSales = categoryTotalSales.add(item.getSalesAmount());
|
|
||||||
}
|
|
||||||
// 打印分类行(缩进0,和表头对齐)
|
// 打印分类行(缩进0,和表头对齐)
|
||||||
String categoryLine = key4(categoryName,
|
String categoryLine = key4(item.getCategoryName(),
|
||||||
categoryTotalNum.stripTrailingZeros().toPlainString(),
|
item.getNumber().stripTrailingZeros().toPlainString(),
|
||||||
categoryTotalActual.stripTrailingZeros().toPlainString(),
|
item.getActualAmount().stripTrailingZeros().toPlainString(),
|
||||||
categoryTotalSales.stripTrailingZeros().toPlainString(),
|
item.getSalesAmount().stripTrailingZeros().toPlainString(),
|
||||||
12, 8, 8);
|
12, 8, 8);
|
||||||
builder.append(getFormatLabel(categoryLine, signLabelInfo.s)).append(signLabelInfo.br);
|
builder.append(getFormatLabel(categoryLine, signLabelInfo.s)).append(signLabelInfo.br);
|
||||||
|
|
||||||
// 再打印该分类下的商品明细(缩进2个空格,和示例图一致)
|
// 再打印该分类下的商品明细(缩进2个空格,和示例图一致)
|
||||||
for (ProductReportPrintDTO.ProductItem item : productList) {
|
for (ProductReportPrintDTO.ProductItem pro : productList) {
|
||||||
String numStr = item.getNumber().stripTrailingZeros().toPlainString();
|
String numStr = pro.getNumber().stripTrailingZeros().toPlainString();
|
||||||
String actualStr = item.getActualAmount().stripTrailingZeros().toPlainString();
|
String actualStr = pro.getActualAmount().stripTrailingZeros().toPlainString();
|
||||||
String salesStr = item.getSalesAmount().stripTrailingZeros().toPlainString();
|
String salesStr = pro.getSalesAmount().stripTrailingZeros().toPlainString();
|
||||||
// 商品名称前加2个空格,实现缩进效果
|
// 商品名称前加2个空格,实现缩进效果
|
||||||
String productLine = key4(" " + item.getProductName(), numStr, actualStr, salesStr, 12, 8, 8);
|
String productLine = key4(" " + pro.getProductName(), numStr, actualStr, salesStr, 12, 8, 8);
|
||||||
builder.append(getFormatLabel(productLine, signLabelInfo.s)).append(signLabelInfo.br);
|
builder.append(getFormatLabel(productLine, signLabelInfo.s)).append(signLabelInfo.br);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -726,9 +713,15 @@ public interface PrinterImpl {
|
|||||||
// 充值明细
|
// 充值明细
|
||||||
builder.append(getFormatLabel("----------------------------------------")).append(signLabelInfo.br);
|
builder.append(getFormatLabel("----------------------------------------")).append(signLabelInfo.br);
|
||||||
builder.append(getFormatLabel(leftRightAlign(" 充值金额:", record.getRechargeAmount().stripTrailingZeros().toPlainString(), 32), signLabelInfo.s)).append(signLabelInfo.br);
|
builder.append(getFormatLabel(leftRightAlign(" 充值金额:", record.getRechargeAmount().stripTrailingZeros().toPlainString(), 32), signLabelInfo.s)).append(signLabelInfo.br);
|
||||||
builder.append(getFormatLabel(leftRightAlign(" 赠送金额:", record.getGiftAmount().stripTrailingZeros().toPlainString(), 32), signLabelInfo.s)).append(signLabelInfo.br);
|
if (record.getGiftAmount() != null && record.getGiftAmount().compareTo(BigDecimal.ZERO) > 0) {
|
||||||
builder.append(getFormatLabel(leftRightAlign(" 赠送积分:", record.getGiftPoints().stripTrailingZeros().toPlainString(), 32), signLabelInfo.s)).append(signLabelInfo.br);
|
builder.append(getFormatLabel(leftRightAlign(" 赠送金额:", record.getGiftAmount().stripTrailingZeros().toPlainString(), 32), signLabelInfo.s)).append(signLabelInfo.br);
|
||||||
builder.append(getFormatLabel(leftRightAlign(" 赠送优惠券:", record.getGiftCoupon() + "", 32), signLabelInfo.s)).append(signLabelInfo.br);
|
}
|
||||||
|
if (record.getGiftPoints() != null && record.getGiftPoints().compareTo(BigDecimal.ZERO) > 0) {
|
||||||
|
builder.append(getFormatLabel(leftRightAlign(" 赠送积分:", record.getGiftPoints().stripTrailingZeros().toPlainString(), 32), signLabelInfo.s)).append(signLabelInfo.br);
|
||||||
|
}
|
||||||
|
if (record.getGiftCoupon() != null && record.getGiftCoupon() > 0) {
|
||||||
|
builder.append(getFormatLabel(leftRightAlign(" 赠送优惠券:", record.getGiftCoupon() + "", 32), signLabelInfo.s)).append(signLabelInfo.br);
|
||||||
|
}
|
||||||
builder.append(getFormatLabel(leftRightAlign(" 充值后余额:", record.getBalance().stripTrailingZeros().toPlainString(), 32), signLabelInfo.s)).append(signLabelInfo.br);
|
builder.append(getFormatLabel(leftRightAlign(" 充值后余额:", record.getBalance().stripTrailingZeros().toPlainString(), 32), signLabelInfo.s)).append(signLabelInfo.br);
|
||||||
builder.append(getFormatLabel("----------------------------------------")).append(signLabelInfo.br);
|
builder.append(getFormatLabel("----------------------------------------")).append(signLabelInfo.br);
|
||||||
// 支付信息
|
// 支付信息
|
||||||
|
|||||||
@@ -1180,7 +1180,7 @@ public class OrderInfoCustomServiceImpl implements OrderInfoCustomService {
|
|||||||
}
|
}
|
||||||
shopRechargeService.recharge(payment.getShopId(), payment.getSourceId(), payment.getRelatedId(),
|
shopRechargeService.recharge(payment.getShopId(), payment.getSourceId(), payment.getRelatedId(),
|
||||||
BigDecimal.valueOf(notifyRespDTO.getAmount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN),
|
BigDecimal.valueOf(notifyRespDTO.getAmount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN),
|
||||||
payment.getId(), payment.getSourceType(), bizEnum, orderInfo == null);
|
payment.getId(), payment.getSourceType(), payment.getPayTime(), bizEnum, orderInfo == null, null);
|
||||||
}
|
}
|
||||||
} else if (PayTypeConstants.SourceType.MEMBER_PAY.equals(payment.getSourceType())) {
|
} else if (PayTypeConstants.SourceType.MEMBER_PAY.equals(payment.getSourceType())) {
|
||||||
//购买会员
|
//购买会员
|
||||||
|
|||||||
@@ -1,15 +1,21 @@
|
|||||||
package com.czg.service.order.service.impl;
|
package com.czg.service.order.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.date.LocalDateTimeUtil;
|
||||||
|
import com.czg.config.RabbitPublisher;
|
||||||
import com.czg.exception.CzgException;
|
import com.czg.exception.CzgException;
|
||||||
import com.czg.order.entity.ShopProdStatistic;
|
import com.czg.order.entity.ShopProdStatistic;
|
||||||
import com.czg.order.param.SaleSummaryCountParam;
|
import com.czg.order.param.SaleSummaryCountParam;
|
||||||
import com.czg.order.service.ShopProdStatisticService;
|
import com.czg.order.service.ShopProdStatisticService;
|
||||||
import com.czg.order.vo.SaleSummaryCountVo;
|
import com.czg.order.vo.SaleSummaryCountVo;
|
||||||
|
import com.czg.print.ProductReportPrintDTO;
|
||||||
|
import com.czg.product.service.ShopProdCategoryService;
|
||||||
import com.czg.service.order.mapper.ShopProdStatisticMapper;
|
import com.czg.service.order.mapper.ShopProdStatisticMapper;
|
||||||
import com.czg.utils.CzgStrUtils;
|
import com.czg.utils.CzgStrUtils;
|
||||||
import com.mybatisflex.core.query.QueryWrapper;
|
import com.mybatisflex.core.query.QueryWrapper;
|
||||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.apache.dubbo.config.annotation.DubboReference;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
@@ -28,6 +34,11 @@ import java.util.stream.Stream;
|
|||||||
@Service
|
@Service
|
||||||
public class ShopProdStatisticServiceImpl extends ServiceImpl<ShopProdStatisticMapper, ShopProdStatistic> implements ShopProdStatisticService {
|
public class ShopProdStatisticServiceImpl extends ServiceImpl<ShopProdStatisticMapper, ShopProdStatistic> implements ShopProdStatisticService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RabbitPublisher rabbitPublisher;
|
||||||
|
@DubboReference
|
||||||
|
private ShopProdCategoryService shopProdCategoryService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ShopProdStatistic> getArchiveTradeDataBy10(Long shopId, Integer day) {
|
public List<ShopProdStatistic> getArchiveTradeDataBy10(Long shopId, Integer day) {
|
||||||
LocalDate currentDate = LocalDate.now();
|
LocalDate currentDate = LocalDate.now();
|
||||||
@@ -73,6 +84,86 @@ public class ShopProdStatisticServiceImpl extends ServiceImpl<ShopProdStatisticM
|
|||||||
return mergeSummaryCountVo(todaySummary, dateRangeSummary);
|
return mergeSummaryCountVo(todaySummary, dateRangeSummary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void summaryPrint(SaleSummaryCountParam param) {
|
||||||
|
// 1. 获取统计数据
|
||||||
|
SaleSummaryCountVo saleSummaryCountVo = summaryCount(param);
|
||||||
|
List<ShopProdStatistic> prodStatisticList = getArchiveTradeData(param);
|
||||||
|
LocalDate currentDate = LocalDate.now();
|
||||||
|
Map<Long, String> categoryMap = shopProdCategoryService.getCategoryIdNameMap(param.getShopId());
|
||||||
|
|
||||||
|
ProductReportPrintDTO printDTO = new ProductReportPrintDTO();
|
||||||
|
String statisticsTime = "";
|
||||||
|
if ("today".equals(param.getRangeType())) {
|
||||||
|
statisticsTime = LocalDateTimeUtil.format(currentDate, "yyyy/MM/dd");
|
||||||
|
}
|
||||||
|
if ("yesterday".equals(param.getRangeType())) {
|
||||||
|
statisticsTime = LocalDateTimeUtil.format(currentDate.minusDays(1), "yyyy/MM/dd");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param.getBeginDate().isAfter(currentDate)) {
|
||||||
|
throw new CzgException("开始时间不能晚于当前时间");
|
||||||
|
}
|
||||||
|
if (param.getBeginDate().equals(param.getEndDate())) {
|
||||||
|
statisticsTime = LocalDateTimeUtil.format(param.getBeginDate(), "yyyy/MM/dd");
|
||||||
|
}
|
||||||
|
if (param.getEndDate().isBefore(currentDate)) {
|
||||||
|
statisticsTime = LocalDateTimeUtil.format(param.getBeginDate(), "yyyy/MM/dd") + " ~ " + LocalDateTimeUtil.format(param.getEndDate(), "yyyy/MM/dd");
|
||||||
|
}
|
||||||
|
printDTO.setStatisticsTime(statisticsTime);
|
||||||
|
printDTO.setOperator(param.getOperator());
|
||||||
|
printDTO.setTotalProductCount(saleSummaryCountVo.getSaleCount());
|
||||||
|
printDTO.setTotalActualAmount(saleSummaryCountVo.getTotalAmount());
|
||||||
|
|
||||||
|
// 4. 先按分类ID分组商品
|
||||||
|
Map<Long, List<ShopProdStatistic>> groupByCategory = prodStatisticList.stream()
|
||||||
|
.collect(Collectors.groupingBy(ShopProdStatistic::getCategoryId));
|
||||||
|
|
||||||
|
// 5. 组装成新结构 List<CategoryItem>
|
||||||
|
List<ProductReportPrintDTO.CategoryItem> categoryItems = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Map.Entry<Long, List<ShopProdStatistic>> entry : groupByCategory.entrySet()) {
|
||||||
|
Long categoryId = entry.getKey();
|
||||||
|
List<ShopProdStatistic> productList = entry.getValue();
|
||||||
|
|
||||||
|
// 分类名称
|
||||||
|
String categoryName = categoryMap.getOrDefault(categoryId, "未分类");
|
||||||
|
|
||||||
|
// 商品列表
|
||||||
|
List<ProductReportPrintDTO.ProductItem> productItems = new ArrayList<>();
|
||||||
|
BigDecimal categoryTotalNumber = BigDecimal.ZERO;
|
||||||
|
BigDecimal categoryTotalActual = BigDecimal.ZERO;
|
||||||
|
BigDecimal categoryTotalSales = BigDecimal.ZERO;
|
||||||
|
|
||||||
|
for (ShopProdStatistic s : productList) {
|
||||||
|
ProductReportPrintDTO.ProductItem item = new ProductReportPrintDTO.ProductItem();
|
||||||
|
item.setProductName(s.getProductName());
|
||||||
|
item.setNumber(s.getValidSaleCount());
|
||||||
|
item.setActualAmount(s.getValidSaleAmount());
|
||||||
|
item.setSalesAmount(s.getSaleAmount());
|
||||||
|
productItems.add(item);
|
||||||
|
|
||||||
|
// 分类汇总累加
|
||||||
|
categoryTotalNumber = categoryTotalNumber.add(s.getValidSaleCount());
|
||||||
|
categoryTotalActual = categoryTotalActual.add(s.getValidSaleAmount());
|
||||||
|
categoryTotalSales = categoryTotalSales.add(s.getSaleAmount());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构建分类项
|
||||||
|
ProductReportPrintDTO.CategoryItem categoryItem = new ProductReportPrintDTO.CategoryItem();
|
||||||
|
categoryItem.setCategoryName(categoryName);
|
||||||
|
categoryItem.setNumber(categoryTotalNumber); // 分类总数量
|
||||||
|
categoryItem.setActualAmount(categoryTotalActual); // 分类总实收
|
||||||
|
categoryItem.setSalesAmount(categoryTotalSales); // 分类总销售额
|
||||||
|
categoryItem.setProductItems(productItems); // 分类下商品
|
||||||
|
|
||||||
|
categoryItems.add(categoryItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
printDTO.setItems(categoryItems);
|
||||||
|
rabbitPublisher.sendOtherPrintMsg(param.getShopId(), printDTO, "PRODUCT_REPORT");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ShopProdStatistic> getArchiveTradeData(SaleSummaryCountParam param) {
|
public List<ShopProdStatistic> getArchiveTradeData(SaleSummaryCountParam param) {
|
||||||
LocalDate currentDate = LocalDate.now();
|
LocalDate currentDate = LocalDate.now();
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -110,16 +111,9 @@ public class ShopUserServiceImpl implements ShopUserPayService {
|
|||||||
return CzgResult.failure("支付密码错误");
|
return CzgResult.failure("支付密码错误");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if (shopUser.getIsVip().equals(0)) {
|
|
||||||
// //更新会员
|
|
||||||
// ShopUser updateInfo = new ShopUser();
|
|
||||||
// updateInfo.setIsVip(1);
|
|
||||||
// updateInfo.setJoinTime(LocalDateTime.now());
|
|
||||||
// updateInfo.setId(payParam.getShopUserId());
|
|
||||||
// shopUserService.updateById(updateInfo);
|
|
||||||
// }
|
|
||||||
shopRechargeService.recharge(shopUser.getMainShopId(), shopUser.getId(), payParam.getRechargeDetailId(),
|
shopRechargeService.recharge(shopUser.getMainShopId(), shopUser.getId(), payParam.getRechargeDetailId(),
|
||||||
payParam.getAmount(), null, "cash", ShopUserFlowBizEnum.CASH_IN, true);
|
payParam.getAmount(), null, "cash", LocalDateTime.now(),
|
||||||
|
ShopUserFlowBizEnum.CASH_IN, true, payParam.getOperator());
|
||||||
return CzgResult.success();
|
return CzgResult.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.czg.service.order.service.impl;
|
||||||
|
|
||||||
|
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||||
|
import com.czg.order.entity.SysPrintData;
|
||||||
|
import com.czg.order.service.SysPrintDataService;
|
||||||
|
import com.czg.service.order.mapper.SysPrintDataMapper;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据打印表 服务层实现。
|
||||||
|
*
|
||||||
|
* @author ww
|
||||||
|
* @since 2026-04-16
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class SysPrintDataServiceImpl extends ServiceImpl<SysPrintDataMapper, SysPrintData> implements SysPrintDataService{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper
|
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.czg.service.order.mapper.SysPrintDataMapper">
|
||||||
|
|
||||||
|
</mapper>
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.czg.service.product.service.impl;
|
package com.czg.service.product.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.czg.constants.SystemConstants;
|
import com.czg.constants.SystemConstants;
|
||||||
import com.czg.excel.ExcelExportUtil;
|
import com.czg.excel.ExcelExportUtil;
|
||||||
@@ -22,6 +23,8 @@ import org.apache.dubbo.config.annotation.DubboService;
|
|||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 店铺商品分类
|
* 店铺商品分类
|
||||||
@@ -64,6 +67,17 @@ public class ShopProdCategoryServiceImpl extends ServiceImpl<ShopProdCategoryMap
|
|||||||
return super.listAs(queryWrapper, ShopProdCategoryDTO.class);
|
return super.listAs(queryWrapper, ShopProdCategoryDTO.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Long, String> getCategoryIdNameMap(Long shopId) {
|
||||||
|
QueryWrapper queryWrapper = query().select(ShopProdCategory::getId, ShopProdCategory::getName)
|
||||||
|
.eq(ShopProdCategory::getShopId, shopId).eq(ShopProdCategory::getStatus, SystemConstants.OneZero.ONE);
|
||||||
|
List<ShopProdCategory> list = list(queryWrapper);
|
||||||
|
if (CollUtil.isEmpty(list)) {
|
||||||
|
return Map.of();
|
||||||
|
}
|
||||||
|
return list.stream().collect(Collectors.toMap(ShopProdCategory::getId, ShopProdCategory::getName));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exportShopProdCategory(ShopProdCategoryDTO param, HttpServletResponse response) {
|
public void exportShopProdCategory(ShopProdCategoryDTO param, HttpServletResponse response) {
|
||||||
QueryWrapper queryWrapper = buildQueryWrapper(param);
|
QueryWrapper queryWrapper = buildQueryWrapper(param);
|
||||||
|
|||||||
Reference in New Issue
Block a user