|
|
@@ -0,0 +1,277 @@
|
|
|
+package com.ruoyi.businessDayBill.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.alipay.api.domain.MaterialUnit;
|
|
|
+import com.ruoyi.business.domain.Business;
|
|
|
+import com.ruoyi.business.domain.OnLineOrderProperties;
|
|
|
+import com.ruoyi.business.service.IBusinessService;
|
|
|
+import com.ruoyi.businessDayBill.domain.bo.BusinessDayBillChangeBo;
|
|
|
+import com.ruoyi.common.exception.ServiceException;
|
|
|
+import com.ruoyi.common.utils.BeanCopyUtils;
|
|
|
+import com.ruoyi.common.utils.MathUtils;
|
|
|
+import com.ruoyi.common.utils.StringUtils;
|
|
|
+import com.ruoyi.common.core.page.TableDataInfo;
|
|
|
+import com.ruoyi.common.core.domain.PageQuery;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import com.ruoyi.businessDayBill.domain.bo.BusinessDayBillBo;
|
|
|
+import com.ruoyi.businessDayBill.domain.vo.BusinessDayBillVo;
|
|
|
+import com.ruoyi.businessDayBill.domain.BusinessDayBill;
|
|
|
+import com.ruoyi.businessDayBill.mapper.BusinessDayBillMapper;
|
|
|
+import com.ruoyi.businessDayBill.service.IBusinessDayBillService;
|
|
|
+import com.ruoyi.businessDayBill.exception.BusinessDayBillExceptionEnum;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Collection;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 商家日账单Service业务层处理
|
|
|
+ *
|
|
|
+ * @author lubo
|
|
|
+ * @date 2025-11-28
|
|
|
+ */
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class BusinessDayBillServiceImpl implements IBusinessDayBillService {
|
|
|
+
|
|
|
+ private final BusinessDayBillMapper baseMapper;
|
|
|
+ private final IBusinessService businessService;
|
|
|
+ private final OnLineOrderProperties onLineOrderProperties;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询商家日账单分页
|
|
|
+ *
|
|
|
+ * @param bo 商家日账单
|
|
|
+ * @return 商家日账单
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<BusinessDayBillVo> queryPageList(BusinessDayBillBo bo, PageQuery pageQuery) {
|
|
|
+ LambdaQueryWrapper<BusinessDayBill> lqw = buildQueryWrapper(bo);
|
|
|
+ Page<BusinessDayBillVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询商家日账单列表
|
|
|
+ *
|
|
|
+ * @param bo 商家日账单
|
|
|
+ * @return 商家日账单
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<BusinessDayBillVo> queryList(BusinessDayBillBo bo) {
|
|
|
+ LambdaQueryWrapper<BusinessDayBill> lqw = buildQueryWrapper(bo);
|
|
|
+ return baseMapper.selectVoList(lqw);
|
|
|
+ }
|
|
|
+
|
|
|
+ private LambdaQueryWrapper<BusinessDayBill> buildQueryWrapper(BusinessDayBillBo bo) {
|
|
|
+ LambdaQueryWrapper<BusinessDayBill> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getDayValue()), BusinessDayBill::getDayValue, bo.getDayValue());
|
|
|
+ lqw.eq(bo.getBillDay() != null, BusinessDayBill::getBillDay, bo.getBillDay());
|
|
|
+ lqw.eq(bo.getBusinessId() != null, BusinessDayBill::getBusinessId, bo.getBusinessId());
|
|
|
+ lqw.like(StringUtils.isNotBlank(bo.getBusinessName()), BusinessDayBill::getBusinessName, bo.getBusinessName());
|
|
|
+ lqw.eq(bo.getActualReceivePayment() != null, BusinessDayBill::getActualReceivePayment, bo.getActualReceivePayment());
|
|
|
+ lqw.eq(bo.getActualCredited() != null, BusinessDayBill::getActualCredited, bo.getActualCredited());
|
|
|
+ lqw.eq(bo.getUserUsePoint() != null, BusinessDayBill::getUserUsePoint, bo.getUserUsePoint());
|
|
|
+ lqw.eq(bo.getBusinessGivePoint() != null, BusinessDayBill::getBusinessGivePoint, bo.getBusinessGivePoint());
|
|
|
+ lqw.eq(bo.getTodaySettlement() != null, BusinessDayBill::getTodaySettlement, bo.getTodaySettlement());
|
|
|
+ lqw.eq(bo.getTodaySettlementTime() != null, BusinessDayBill::getTodaySettlementTime, bo.getTodaySettlementTime());
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询商家日账单
|
|
|
+ *
|
|
|
+ * @param dayBillId 商家日账单主键
|
|
|
+ * @return 商家日账单
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public BusinessDayBillVo queryById(Long dayBillId){
|
|
|
+ return baseMapper.selectVoById(dayBillId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 详情商家日账单
|
|
|
+ *
|
|
|
+ * @param dayBillId 商家日账单主键
|
|
|
+ * @return 商家日账单
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public BusinessDayBill loadById(Long dayBillId, Boolean tw){
|
|
|
+ BusinessDayBill info = this.baseMapper.selectById(dayBillId);
|
|
|
+ if(ObjectUtil.isEmpty(info) && tw){
|
|
|
+ throw new ServiceException(BusinessDayBillExceptionEnum.BusinessDayBill_IS_NOT_EXISTS);
|
|
|
+ }
|
|
|
+ return info;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增商家日账单
|
|
|
+ *
|
|
|
+ * @param bo 商家日账单
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean insertByBo(BusinessDayBillBo bo) {
|
|
|
+ BusinessDayBill add = BeanUtil.toBean(bo, BusinessDayBill.class);
|
|
|
+ validEntityBeforeSave(add);
|
|
|
+ boolean flag = baseMapper.insert(add) > 0;
|
|
|
+ if (flag) {
|
|
|
+ bo.setDayBillId(add.getDayBillId());
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改商家日账单
|
|
|
+ *
|
|
|
+ * @param bo 商家日账单
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean updateByBo(BusinessDayBillBo bo) {
|
|
|
+ BusinessDayBill businessDayBill = baseMapper.selectById(bo.getDayBillId());
|
|
|
+ BusinessDayBill update = BeanCopyUtils.copy(bo, businessDayBill);
|
|
|
+ validEntityBeforeSave(update);
|
|
|
+ return baseMapper.updateById(update) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存前的数据校验
|
|
|
+ *
|
|
|
+ * @param entity 实体类数据
|
|
|
+ */
|
|
|
+ private void validEntityBeforeSave(BusinessDayBill entity){
|
|
|
+ //TODO 做一些数据校验,如唯一约束
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量删除商家日账单
|
|
|
+ *
|
|
|
+ * @param ids 需要删除的商家日账单主键
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
+ if(isValid){
|
|
|
+ //TODO 做一些业务上的校验,判断是否需要校验
|
|
|
+ }
|
|
|
+ return baseMapper.deleteBatchIds(ids) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public BusinessDayBill loadById(Long businessId, Date billDate) {
|
|
|
+ String format = DateUtil.format(billDate, "yyyy-MM-dd");
|
|
|
+ return this.baseMapper.selectOne(new LambdaQueryWrapper<BusinessDayBill>()
|
|
|
+ .eq(BusinessDayBill::getBusinessId, businessId)
|
|
|
+ .eq(BusinessDayBill::getDayValue, format)
|
|
|
+ .last("limit 1")
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public BusinessDayBill loadLockById(Long businessId, Date billDate) {
|
|
|
+ String format = DateUtil.format(billDate, "yyyy-MM-dd");
|
|
|
+ return this.baseMapper.selectOne(new LambdaQueryWrapper<BusinessDayBill>()
|
|
|
+ .eq(BusinessDayBill::getBusinessId, businessId)
|
|
|
+ .eq(BusinessDayBill::getDayValue, format)
|
|
|
+ .last("limit 1 for update")
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初始化商家日账单
|
|
|
+ *
|
|
|
+ * @param businessId 商家ID
|
|
|
+ * @param billDate 账单日期
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public BusinessDayBill initBusinessDayBill(Long businessId, Date billDate) {
|
|
|
+ String format = DateUtil.format(billDate, "yyyy-MM-dd");
|
|
|
+ Business business = businessService.loadById(businessId, true);
|
|
|
+ BusinessDayBill businessDayBill = this.loadById(businessId, billDate);
|
|
|
+ if(businessDayBill == null)
|
|
|
+ {
|
|
|
+ businessDayBill = new BusinessDayBill();
|
|
|
+ businessDayBill.setBusinessId(businessId);
|
|
|
+ businessDayBill.setBusinessName(business.getBusinessName());
|
|
|
+ businessDayBill.setDayValue(format);
|
|
|
+ businessDayBill.setBillDay(DateUtil.parse( format, "yyyy-MM-dd"));
|
|
|
+ businessDayBill.setTodaySettlement(BigDecimal.ZERO);
|
|
|
+ businessDayBill.setActualReceivePayment(BigDecimal.ZERO);
|
|
|
+ businessDayBill.setActualCredited(BigDecimal.ZERO);
|
|
|
+ businessDayBill.setUserUsePoint(BigDecimal.ZERO);
|
|
|
+ businessDayBill.setBusinessGivePoint(BigDecimal.ZERO);
|
|
|
+ businessDayBill.setTodaySettlementTime(new Date());
|
|
|
+ this.baseMapper.insert(businessDayBill);
|
|
|
+ }
|
|
|
+ return businessDayBill;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初始化所有商家日账单
|
|
|
+ * @param billDate 账单日期
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void initAllBusinessDayBill(Date billDate) {
|
|
|
+ List<Long > businessIds = businessService.loadNoCloseBusinessIds();
|
|
|
+ businessIds.forEach(businessId -> {
|
|
|
+ this.initBusinessDayBill(businessId, billDate);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void changeBusinessDayBill(BusinessDayBillChangeBo bo) {
|
|
|
+ this.initBusinessDayBill(bo.getBusinessId(), bo.getChangeTime());
|
|
|
+ BusinessDayBill businessDayBill = this.loadLockById(bo.getBusinessId(), bo.getChangeTime());
|
|
|
+ switch (bo.getChangeType())
|
|
|
+ {
|
|
|
+ case USER_ORDER:
|
|
|
+ businessDayBill.setActualReceivePayment( businessDayBill.getActualReceivePayment().add(bo.getChangeAmount()));
|
|
|
+ break;
|
|
|
+ case USER_CREDITED:
|
|
|
+ businessDayBill.setActualCredited( businessDayBill.getActualCredited().add(bo.getChangeAmount()));
|
|
|
+ break;
|
|
|
+ case USER_USE_POINT:
|
|
|
+ businessDayBill.setUserUsePoint( businessDayBill.getUserUsePoint().add(bo.getChangeAmount()));
|
|
|
+ break;
|
|
|
+ case BUSINESS_GIVE_POINT:
|
|
|
+ businessDayBill.setBusinessGivePoint( businessDayBill.getBusinessGivePoint().add(bo.getChangeAmount()));
|
|
|
+ break;
|
|
|
+ case USER_REFUND:
|
|
|
+ businessDayBill.setActualReceivePayment( businessDayBill.getActualCredited().subtract(bo.getChangeAmount()));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ this.baseMapper.updateById(businessDayBill);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void settlementDayBill(Date date) {
|
|
|
+ String format = DateUtil.format(date, "yyyy-MM-dd");
|
|
|
+ List<BusinessDayBill> businessDayBills = this.baseMapper.selectList(new LambdaQueryWrapper<BusinessDayBill>()
|
|
|
+ .eq(BusinessDayBill::getDayValue, format)
|
|
|
+ .orderByAsc(BusinessDayBill::getBusinessId)
|
|
|
+ );
|
|
|
+
|
|
|
+ for(BusinessDayBill businessDayBill : businessDayBills)
|
|
|
+ {
|
|
|
+ businessDayBill.setTodaySettlement(MathUtils.multiply(businessDayBill.getActualCredited(), onLineOrderProperties.getSettlementExpenseRatio(),3));
|
|
|
+ businessDayBill.setTodaySettlementTime(date);
|
|
|
+ this.baseMapper.updateById(businessDayBill);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|