|  | @@ -0,0 +1,147 @@
 | 
	
		
			
				|  |  | +package cn.newfeifan.mall.module.distri.service.dailybill;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.framework.common.pojo.PageResult;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo.DailyBillPageReqVO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo.DailyBillSaveReqVO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.distri.dal.dataobject.dailybill.DailyBillDO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.distri.dal.mysql.dailybill.DailyBillMapper;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.distri.service.dailybill.dto.MerchantDTO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.distri.service.dailybill.dto.OrderDTO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.system.controller.admin.user.vo.user.UserShopDetailsVO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.system.service.user.AdminUserService;
 | 
	
		
			
				|  |  | +import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | +import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  | +import org.springframework.validation.annotation.Validated;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import javax.annotation.Resource;
 | 
	
		
			
				|  |  | +import java.time.LocalDate;
 | 
	
		
			
				|  |  | +import java.util.LinkedHashMap;
 | 
	
		
			
				|  |  | +import java.util.List;
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.stream.Collectors;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
	
		
			
				|  |  | +import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.DAILY_BILL_NOT_EXISTS;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * 每日账单 Service 实现类
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @author 非繁人
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +@Service
 | 
	
		
			
				|  |  | +@Validated
 | 
	
		
			
				|  |  | +public class DailyBillServiceImpl implements DailyBillService {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Resource
 | 
	
		
			
				|  |  | +    private DailyBillMapper dailyBillMapper;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Resource
 | 
	
		
			
				|  |  | +    private AdminUserService userService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public Long createDailyBill(DailyBillSaveReqVO createReqVO) {
 | 
	
		
			
				|  |  | +        // 插入
 | 
	
		
			
				|  |  | +        DailyBillDO dailyBill = BeanUtils.toBean(createReqVO, DailyBillDO.class);
 | 
	
		
			
				|  |  | +        dailyBillMapper.insert(dailyBill);
 | 
	
		
			
				|  |  | +        // 返回
 | 
	
		
			
				|  |  | +        return dailyBill.getId();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void updateDailyBill(DailyBillSaveReqVO updateReqVO) {
 | 
	
		
			
				|  |  | +        // 校验存在
 | 
	
		
			
				|  |  | +        validateDailyBillExists(updateReqVO.getId());
 | 
	
		
			
				|  |  | +        // 更新
 | 
	
		
			
				|  |  | +        DailyBillDO updateObj = BeanUtils.toBean(updateReqVO, DailyBillDO.class);
 | 
	
		
			
				|  |  | +        dailyBillMapper.updateById(updateObj);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void deleteDailyBill(Long id) {
 | 
	
		
			
				|  |  | +        // 校验存在
 | 
	
		
			
				|  |  | +        validateDailyBillExists(id);
 | 
	
		
			
				|  |  | +        // 删除
 | 
	
		
			
				|  |  | +        dailyBillMapper.deleteById(id);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void validateDailyBillExists(Long id) {
 | 
	
		
			
				|  |  | +        if (dailyBillMapper.selectById(id) == null) {
 | 
	
		
			
				|  |  | +            throw exception(DAILY_BILL_NOT_EXISTS);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public DailyBillDO getDailyBill(Long id) {
 | 
	
		
			
				|  |  | +        return dailyBillMapper.selectById(id);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public PageResult<DailyBillDO> getDailyBillPage(DailyBillPageReqVO pageReqVO) {
 | 
	
		
			
				|  |  | +        UserShopDetailsVO userShopDetails = userService.getUserShopDetails();
 | 
	
		
			
				|  |  | +        pageReqVO.setMerchantId(userShopDetails.getMerId());
 | 
	
		
			
				|  |  | +        pageReqVO.setShopId(userShopDetails.getShopId());
 | 
	
		
			
				|  |  | +        return dailyBillMapper.selectPage(pageReqVO);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void caleDailyBill() {
 | 
	
		
			
				|  |  | +        // 获取所有商户及旗下的店铺
 | 
	
		
			
				|  |  | +        List<MerchantDTO> merchantDTOS = dailyBillMapper.getMerchantDTO();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        merchantDTOS.forEach(merchantDTO -> {
 | 
	
		
			
				|  |  | +            merchantDTO.getShopIds().forEach(shopId -> {
 | 
	
		
			
				|  |  | +                // 获取每个店铺的订单列表
 | 
	
		
			
				|  |  | +                List<OrderDTO> orderDetails = dailyBillMapper.getOrderDetailsByMerchantIdWithsShopId(merchantDTO.getMerchantId(), shopId);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // 使用Stream API和Collectors.groupingBy按照日期分组,并按时间倒序排序每个日期的Order列表
 | 
	
		
			
				|  |  | +                Map<LocalDate, List<OrderDTO>> ordersByDate = orderDetails.stream()
 | 
	
		
			
				|  |  | +                        .collect(Collectors.groupingBy(order -> order.getCreateTime().toLocalDate(),
 | 
	
		
			
				|  |  | +                                LinkedHashMap::new, // 保持插入顺序
 | 
	
		
			
				|  |  | +                                Collectors.toList()));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // 计算分组结果,并按订单创建时间倒序输出每个日期的订单
 | 
	
		
			
				|  |  | +                ordersByDate.forEach((date, orderList) -> {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    Long price = orderList.stream()
 | 
	
		
			
				|  |  | +                            .mapToLong(OrderDTO::getPayPrice)
 | 
	
		
			
				|  |  | +                            .sum();
 | 
	
		
			
				|  |  | +                    Long refundPrice = orderList.stream()
 | 
	
		
			
				|  |  | +                            .mapToLong(OrderDTO::getRefundPrice)
 | 
	
		
			
				|  |  | +                            .sum();
 | 
	
		
			
				|  |  | +                    Long integral = orderList.stream()
 | 
	
		
			
				|  |  | +                            .mapToLong(OrderDTO::getPayIntegral)
 | 
	
		
			
				|  |  | +                            .sum();
 | 
	
		
			
				|  |  | +                    Long refundIntegral = orderList.stream()
 | 
	
		
			
				|  |  | +                            .filter(order -> order.getRefundIntegral() != null)  // 过滤掉 getRefundIntegral 为空的订单
 | 
	
		
			
				|  |  | +                            .mapToLong(OrderDTO::getRefundIntegral)
 | 
	
		
			
				|  |  | +                            .sum();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    DailyBillDO dailyBillDO = DailyBillDO.builder()
 | 
	
		
			
				|  |  | +                            .price(price)
 | 
	
		
			
				|  |  | +                            .refundPrice(refundPrice)
 | 
	
		
			
				|  |  | +                            .receivedIntegral(price - refundPrice)
 | 
	
		
			
				|  |  | +                            .integral(integral)
 | 
	
		
			
				|  |  | +                            .refundIntegral(refundIntegral)
 | 
	
		
			
				|  |  | +                            .receivedIntegral(integral - refundIntegral)
 | 
	
		
			
				|  |  | +                            .orderCount((long) orderList.size())
 | 
	
		
			
				|  |  | +                            .shopId(shopId)
 | 
	
		
			
				|  |  | +                            .merchantId(merchantDTO.getMerchantId())
 | 
	
		
			
				|  |  | +                            .orderIds(orderList.stream().map(OrderDTO::getId).collect(Collectors.toList()).toString())
 | 
	
		
			
				|  |  | +                            .orderCalcTime(date)
 | 
	
		
			
				|  |  | +                            .build();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    dailyBillMapper.insert(dailyBillDO);
 | 
	
		
			
				|  |  | +                    dailyBillMapper.updateOrderItemByOrderId(orderList.stream().map(OrderDTO::getId).collect(Collectors.toList()));
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public DailyBillDO getDailyBill(Long merchantId, Long shopId, LocalDate localDate) {
 | 
	
		
			
				|  |  | +        return dailyBillMapper.selectOne(DailyBillDO::getMerchantId, merchantId, DailyBillDO::getShopId, shopId, DailyBillDO::getOrderCalcTime, localDate);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 |