From 836f7d41ec8adb0859999b4347b71080460306b1 Mon Sep 17 00:00:00 2001 From: qjq <1766193529@qq.com> Date: Mon, 18 Nov 2024 16:06:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E7=A5=A8=E5=8A=9F=E8=83=BD=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/enums/ErrorCodeConstants.java | 1 + .../admin/billing/vo/BillingPageReqVO.java | 2 +- .../admin/billing/vo/BillingRespVO.java | 2 +- .../admin/billing/vo/BillingSaveReqVO.java | 2 +- .../app/billing/AppBillingController.java | 2 +- .../dal/dataobject/billing/BillingDO.java | 2 +- .../member/dal/dataobject/card/CardDO.java | 9 +- .../member/dal/mysql/card/CardMapper.java | 29 +++++ .../module/member/enums/CostTypeEnum.java | 2 +- .../service/billing/BillingService.java | 7 ++ .../service/billing/BillingServiceImpl.java | 102 +++++++++++------- 11 files changed, 114 insertions(+), 46 deletions(-) diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java index c2f544b3..769ed16e 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java @@ -152,5 +152,6 @@ public interface ErrorCodeConstants { ErrorCode BILLING_NOT_EXISTS = new ErrorCode(1_004_023_00, "开票记录不存在"); ErrorCode BILLING_NOT_ORDER_EXISTS= new ErrorCode(1_004_023_00, "该时间段没有订单可开票"); ErrorCode BILLING_NOT_ORDER_REFUSE= new ErrorCode(1_004_024_00, "拒绝理由不能为空"); + ErrorCode BILLING_NOT_ORDER_SECURITY= new ErrorCode(1_004_023_41, "没有权限给单位统一开票"); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingPageReqVO.java index fe6d3e80..57c2afb6 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingPageReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingPageReqVO.java @@ -62,6 +62,6 @@ public class BillingPageReqVO extends PageParam { private LocalDateTime[] createTime; @Schema(description = "发票商品名称") private String billingName; - @Schema(description = "订单ids") + @Schema(description = "单位所有开票的userid") private String orderId; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingRespVO.java index 5724c0f1..b66009f1 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingRespVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingRespVO.java @@ -79,6 +79,6 @@ public class BillingRespVO { @Schema(description = "发票商品名称") @ExcelProperty("发票商品名称") private String billingName; - @Schema(description = "订单ids") + @Schema(description = "单位所有开票的userid") private String orderId; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingSaveReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingSaveReqVO.java index cf494e46..7887855d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingSaveReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingSaveReqVO.java @@ -70,6 +70,6 @@ public class BillingSaveReqVO { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date endTime; - @Schema(description = "订单id") + @Schema(description = "单位所有开票的userid") private Set orderId; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/billing/AppBillingController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/billing/AppBillingController.java index 2f9e101a..dc05dba2 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/billing/AppBillingController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/billing/AppBillingController.java @@ -31,7 +31,7 @@ public class AppBillingController { @PostMapping("/create") @Operation(summary = "创建开票记录") public CommonResult createBilling(@Valid @RequestBody BillingSaveReqVO createReqVO) { - return success(billingService.createBilling(createReqVO)); + return success(billingService.createBillingUnit(createReqVO)); } @PutMapping("/update") diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/billing/BillingDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/billing/BillingDO.java index 255ead56..4b420385 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/billing/BillingDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/billing/BillingDO.java @@ -87,7 +87,7 @@ public class BillingDO extends BaseDO { */ private String billingName; /** - * 订单id 用json + * userid 用json */ private String orderId; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/card/CardDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/card/CardDO.java index 8da7c222..e966f92d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/card/CardDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/card/CardDO.java @@ -72,5 +72,12 @@ public class CardDO extends BaseDO { * 微信充值金额 */ private BigDecimal wxAmount; - + /** + * 是否开票 + */ + private Integer billingExist; + /** + * 开票编号 + */ + private String billingNum; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/card/CardMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/card/CardMapper.java index 1093b758..2561873f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/card/CardMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/card/CardMapper.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.member.dal.mysql.card; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; @@ -7,16 +8,24 @@ import cn.iocoder.yudao.module.member.controller.admin.card.vo.CardPageReqVO; import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardMonthVO; import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardPageReqVO; import cn.iocoder.yudao.module.member.controller.app.card.vo.FaceVo; +import cn.iocoder.yudao.module.member.dal.dataobject.billing.BillingDO; import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO; +import cn.iocoder.yudao.module.member.enums.BillingStatusEnum; import cn.iocoder.yudao.module.member.util.MemberConstants; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.Collection; import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; /** * 余额变动明细 Mapper @@ -66,5 +75,25 @@ public interface CardMapper extends BaseMapperX { } return lastCardDO.getMoney(); } + default List getMoneyByUserIds(Collection userIds , String flag, String type,Integer var){ + return selectList(new LambdaQueryWrapperX() + .eq(CardDO::getFlag, flag) + .eq(CardDO::getType, type) + .eq(CardDO::getBillingExist,var) + .in(CardDO::getUserId, userIds)); + + } + default BigDecimal getTotalMoneyByuserIds(Collection userIds, String flag, String type) { + List cardDOS = selectList(new LambdaQueryWrapper() + .eq(CardDO::getFlag, flag) + .eq(CardDO::getType, type) + .ne(CardDO::getBillingExist, BillingStatusEnum.BILLING_INVOICING_IS_COMPLETE.getCode()) + .in(CardDO::getUserId, userIds)); + return cardDOS.stream() + .map(CardDO::getChangeMoney) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/CostTypeEnum.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/CostTypeEnum.java index 5dbad857..bebd0314 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/CostTypeEnum.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/CostTypeEnum.java @@ -16,7 +16,7 @@ public enum CostTypeEnum { MORNING("2", "早餐"), NOON("3", "午餐"), NIGHT("4", "晚餐"), - ADMIN_PAY("5","管理后台充值"), + ADMIN_PAY("5","现金充值"), REFUND("6","退款"), WITHDRAW("7","微信提现"), CASH_WITHDRAW("8","现金提现"), diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingService.java index f67b27a7..25ce01fe 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingService.java @@ -22,6 +22,13 @@ public interface BillingService { */ String createBilling(@Valid BillingSaveReqVO createReqVO); + /** + * 单位统一开票 + * @param createReqVO + * @return + */ + String createBillingUnit(@Valid BillingSaveReqVO createReqVO); + /** * 更新开票记录 * diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingServiceImpl.java index bd0b7e18..8ffcf477 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingServiceImpl.java @@ -12,24 +12,28 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.member.api.card.CardApi; import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingPageReqVO; import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingRespMoneyVO; import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingSaveReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.billing.BillingDO; +import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO; +import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO; import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO; import cn.iocoder.yudao.module.member.dal.dataobject.orderspacecapsule.OrderSpaceCapsuleDO; import cn.iocoder.yudao.module.member.dal.dataobject.storeorder.StoreOrderDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.billing.BillingMapper; +import cn.iocoder.yudao.module.member.dal.mysql.card.CardMapper; +import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper; import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper; import cn.iocoder.yudao.module.member.dal.mysql.orderspacecapsule.OrderSpaceCapsuleMapper; import cn.iocoder.yudao.module.member.dal.mysql.storeorder.StoreOrderMapper; -import cn.iocoder.yudao.module.member.enums.BillingEnum; -import cn.iocoder.yudao.module.member.enums.BillingStatusEnum; -import cn.iocoder.yudao.module.member.enums.SpaceCapsuleOrderEnum; -import cn.iocoder.yudao.module.member.enums.StoreOrderStatusEnum; +import cn.iocoder.yudao.module.member.enums.*; import cn.iocoder.yudao.module.member.service.user.MemberUserService; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; +import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -72,6 +76,11 @@ public class BillingServiceImpl implements BillingService { private DishOrderMapper dishOrderMapper; @Resource private StoreOrderMapper storeOrderMapper; + @Resource + private MemberGroupMapper memberGroupMapper; + @Resource + private CardMapper cardMapper; + /** * 食堂 @@ -169,6 +178,42 @@ public class BillingServiceImpl implements BillingService { // 返回主键 ID return billing.getId(); } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createBillingUnit(BillingSaveReqVO createReqVO) { + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); + //校验是否为管理员 + MemberGroupDO memberGroupDO = memberGroupMapper.selectOne(new LambdaQueryWrapperX() + .eq(MemberGroupDO::getUserId, loginUserId) + .last(" limit 1") + ); + if(ObjUtil.isEmpty(memberGroupDO)) throw exception(BILLING_NOT_ORDER_SECURITY); + // 插入 BillingDO 对象并生成唯一主键 + BillingDO billing = BeanUtils.toBean(createReqVO, BillingDO.class); + billing.setId(IdUtil.getSnowflakeNextId() + ""); + billing.setUserName(memberGroupDO.getName()); + billing.setUserPhone(String.valueOf(memberGroupDO.getId())); + billing.setUserId(loginUserId); + //查询单位充值的金额 + List moneyByUserIds = cardMapper.getMoneyByUserIds(createReqVO.getOrderId(), CardDO.ADD, CostTypeEnum.ADMIN_PAY.getCode(),BillingStatusEnum.BILLING_INVOICING_REJECTION.getCode()); + if(CollUtil.isEmpty(moneyByUserIds))throw exception(BILLING_NOT_ORDER_EXISTS); + BigDecimal totalMoney = moneyByUserIds.stream() + .map(CardDO::getChangeMoney) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + moneyByUserIds.forEach(f-> f.setBillingExist(BillingStatusEnum.BILLING_INVOICING.getCode())); + cardMapper.updateBatch(moneyByUserIds); + billing.setBillingMoney(totalMoney); + billing.setOrderId(JSONUtil.toJsonStr(createReqVO.getOrderId())); + billing.setBillingName(memberGroupDO.getName()+" 消费 "+totalMoney+" 元"); + billing.setRequestBillingTime(LocalDateTime.now()); + billing.setStatus(BillingStatusEnum.BILLING_INVOICING.getCode()); + // 插入 BillingDO 对象到数据库 + billingMapper.insert(billing); + // 返回主键 ID + return billing.getId(); + } // 计算订单的总金额,处理 Double 到 BigDecimal 的转换 private BigDecimal calculateTotalMoney1(List orders, Function moneyMapper) { return orders.stream() @@ -231,20 +276,10 @@ public class BillingServiceImpl implements BillingService { Set orderIds = jsonArray.stream() .map(object -> Long.parseLong(object.toString())) // 将每个元素转换为 Long .collect(Collectors.toSet()); - //拒绝就把锁住的订单释放掉 - switch (BillingEnum.fromCode(updateObj.getBillingType())){ - case BILLING_CANTEEN: - dishOrderMapper.updateByIdBillingExist(orderIds,Boolean.FALSE); - break; - case BILLING_SUPERMARKET: - storeOrderMapper.updateByIdBillingExist(orderIds,Boolean.FALSE); - break; - case BILLING_SPACE_CAPSULE: - orderSpaceCapsuleMapper.updateByIdBillingExist(orderIds,Boolean.FALSE); - break; - default: - throw new IllegalArgumentException("Unsupported billing type"); - } + LambdaUpdateChainWrapper wrapper = new LambdaUpdateChainWrapper<>(cardMapper); + wrapper.in(CardDO::getId,orderIds); + wrapper.set(CardDO::getBillingExist,BillingStatusEnum.BILLING_INVOICING_REJECTION.getCode()); + cardMapper.update(wrapper); } billingMapper.updateById(updateObj); } @@ -276,33 +311,22 @@ public class BillingServiceImpl implements BillingService { public BillingRespMoneyVO getHaveWithoutMoney(Long userId) { BillingRespMoneyVO b=new BillingRespMoneyVO(); //查询开票的订单 + MemberGroupDO memberGroupDO = memberGroupMapper.selectOne(new LambdaQueryWrapperX() + .eq(MemberGroupDO::getUserId, userId) + .last(" limit 1") + ); BigDecimal reduce = billingMapper.selectList(new LambdaQueryWrapperX() .eq(BillingDO::getStatus, BillingStatusEnum.BILLING_INVOICING_IS_COMPLETE.getCode()) - .eq(BillingDO::getUserId,userId) + .eq(BillingDO::getUserId,memberGroupDO.getId()) ).stream() .map(BillingDO::getBillingMoney) .reduce(BigDecimal.ZERO, BigDecimal::add);// 求和 + //获取当前单位下的所有人 + List memberList = memberGroupMapper.getMemberList(memberGroupDO.getId()); + //获取所有未开票的 + BigDecimal moneyByUserIds = cardMapper.getTotalMoneyByuserIds(memberList, CardDO.ADD, CostTypeEnum.ADMIN_PAY.getCode()); + b.setWithoutMoney(moneyByUserIds); b.setHaveMoney(reduce); - BigDecimal reduce1 = orderSpaceCapsuleMapper.selectList(new LambdaQueryWrapperX() - .eq(OrderSpaceCapsuleDO::getStatus, SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode()) - .eq(OrderSpaceCapsuleDO::getBillingExist, Boolean.FALSE) - .eq(OrderSpaceCapsuleDO::getUserId,userId) - ) - .stream().map(OrderSpaceCapsuleDO::getMoney) - .reduce(BigDecimal.ZERO, BigDecimal::add);// 求和 - BigDecimal reduce2 = dishOrderMapper.selectList(new LambdaQueryWrapperX() - .eq(DishOrderDO::getOrderStatus, DishOrderDO.COMPLETE) - .eq(DishOrderDO::getBillingExist, Boolean.FALSE).eq(DishOrderDO::getUserId,userId)) - .stream().map(DishOrderDO::getTotalMoney) - .reduce(BigDecimal.ZERO, BigDecimal::add);// 求和 - BigDecimal reduce3 = storeOrderMapper.selectList(new LambdaQueryWrapperX() - .eq(StoreOrderDO::getStatus, StoreOrderStatusEnum.COMPLETE.getCode()) - .eq(StoreOrderDO::getBillingExist, Boolean.FALSE).eq(StoreOrderDO::getUserId,userId)) - .stream().map(f-> BigDecimal.valueOf(f.getTotalPrice())) - .reduce(BigDecimal.ZERO, BigDecimal::add);// 求和 - BigDecimal add = reduce1.add(reduce2).add(reduce3); - b.setWithoutMoney(add); return b; } - } \ No newline at end of file