From baa515dd73053847b6052b10fe6391d53879964f Mon Sep 17 00:00:00 2001 From: qjq <1766193529@qq.com> Date: Tue, 19 Nov 2024 17:29:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BC=80=E7=A5=A8=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/billing/vo/BillingPageReqVO.java | 3 +- .../admin/billing/vo/BillingRespVO.java | 3 +- .../admin/billing/vo/BillingSaveReqVO.java | 3 +- .../app/billing/AppBillingController.java | 39 ++- .../dal/dataobject/billing/BillingDO.java | 4 + .../dal/mysql/order/DishOrderMapper.java | 1 + .../OrderSpaceCapsuleMapper.java | 1 + .../mysql/storeorder/StoreOrderMapper.java | 1 + .../service/billing/BillingService.java | 23 +- .../service/billing/BillingServiceImpl.java | 326 ++++++++++++++---- .../mapper/order/DishOrderMapper.xml | 7 + .../OrderSpaceCapsuleMapper.xml | 8 + .../mapper/storeorder/StoreOrderMapper.xml | 8 + 13 files changed, 344 insertions(+), 83 deletions(-) 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 57c2afb6..43a8c5c6 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 @@ -49,7 +49,8 @@ public class BillingPageReqVO extends PageParam { @Schema(description = "备注", example = "随便") private String remark; - + @Schema(description = "门店id") + private Long carteenId; @Schema(description = "拒绝时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] refuseTime; 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 b66009f1..14f1aa09 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 @@ -69,7 +69,8 @@ public class BillingRespVO { @Schema(description = "pdf地址", example = "https://www.iocoder.cn") @ExcelProperty("pdf地址") private String pdfUrl; - + @Schema(description = "门店id") + private Long carteenId; @Schema(description = "创建时间") @ExcelProperty("创建时间") private LocalDateTime createTime; 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 7887855d..77a0f997 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 @@ -48,7 +48,8 @@ public class BillingSaveReqVO { @Schema(description = "0食堂发票,1超市发票,2太空舱发票", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") @NotNull(message = "0食堂发票,1超市发票,2太空舱发票不能为空") private Integer billingType; - + @Schema(description = "门店id") + private Long carteenId; @Schema(description = "拒绝理由") private String refuseDetails; 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 dc05dba2..9d712f16 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 @@ -12,11 +12,17 @@ import cn.iocoder.yudao.module.member.service.billing.BillingService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @Tag(name = "小程序 - 开票记录") @@ -31,7 +37,7 @@ public class AppBillingController { @PostMapping("/create") @Operation(summary = "创建开票记录") public CommonResult createBilling(@Valid @RequestBody BillingSaveReqVO createReqVO) { - return success(billingService.createBillingUnit(createReqVO)); + return success(billingService.createBilling(createReqVO)); } @PutMapping("/update") @@ -58,13 +64,40 @@ public class AppBillingController { } @GetMapping("/moeny") @Operation(summary = "获得开票金额与未开票金额") - public CommonResult getBillingPage(@RequestParam("userId")Long userId) { - return success(billingService.getHaveWithoutMoney(userId)); + public CommonResult getBillingPage(@RequestParam("userId")Long userId,@RequestParam("carteenId") Long carteenId) { + return success(billingService.getHaveWithoutMoney(userId,carteenId)); } @GetMapping("/page") @Operation(summary = "获得开票记录分页") public CommonResult> getBillingPage(@Valid BillingPageReqVO pageReqVO) { + Long userId = pageReqVO.getUserId(); + pageReqVO.setUserPhone(billingService.getMemberId(userId)); + pageReqVO.setUserId(null); PageResult pageResult = billingService.getBillingPage(pageReqVO); return success(BeanUtils.toBean(pageResult, BillingRespVO.class)); } + @GetMapping("/totalMoney") + @Operation(summary = "获取月时间段的金额") + public CommonResult getBillingPage(@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @RequestParam("time") Date time, + @RequestParam("billingType") Integer billingType, + @RequestParam("carteenId") Long carteenId, + @RequestParam("userId")Long userId) { + BigDecimal totalMoney = billingService.getTotalMoney(time, billingType, carteenId,userId); + return success(totalMoney); + } + @GetMapping("/data") + @Operation(summary = "获取月时间段的订单详情") + public CommonResult getData(@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @RequestParam("time") Date time, + @RequestParam("billingType") Integer billingType, + @RequestParam("carteenId") Long carteenId, + @RequestParam("userId")Long userId) { + Object data = billingService.getData(time, billingType, carteenId,userId); + return success(data); + } + @GetMapping("/data") + @Operation(summary = "获取月时间段的订单详情") + public CommonResult> getBillingTypeTotal(@RequestParam("carteenId") Long carteenId,@RequestParam("userId") Long userId) { + Map billingTypeTotal = billingService.getBillingTypeTotal(carteenId, userId); + return success(billingTypeTotal); + } } \ 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/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 4b420385..4760e522 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 @@ -86,6 +86,10 @@ public class BillingDO extends BaseDO { * 发票商品名称 */ private String billingName; + /** + * 门店id + */ + private Long carteenId; /** * userid 用json */ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/order/DishOrderMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/order/DishOrderMapper.java index 3496175f..ea5f6df0 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/order/DishOrderMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/order/DishOrderMapper.java @@ -50,4 +50,5 @@ public interface DishOrderMapper extends BaseMapperX { BigDecimal getSaleMoney(@Param("storeId")Long storeId, @Param("time")String time); Integer updateByIdBillingExist(@Param("ids")Set ids,@Param("exist")Boolean exist); + Integer updateByIdBillingNum(@Param("ids")Set ids,@Param("num")String num); } \ 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/orderspacecapsule/OrderSpaceCapsuleMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/orderspacecapsule/OrderSpaceCapsuleMapper.java index 60e8f1f9..0e1b1ee1 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/orderspacecapsule/OrderSpaceCapsuleMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/orderspacecapsule/OrderSpaceCapsuleMapper.java @@ -50,4 +50,5 @@ public interface OrderSpaceCapsuleMapper extends BaseMapperX ids, @Param("exist")Boolean exist); + Integer updateByIdBillingNum (@Param("ids") Set ids, @Param("num")String num); } \ 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/storeorder/StoreOrderMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storeorder/StoreOrderMapper.java index 1ded6f8e..a7d3c086 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storeorder/StoreOrderMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storeorder/StoreOrderMapper.java @@ -41,4 +41,5 @@ public interface StoreOrderMapper extends BaseMapperX { List getStoreOrderPageNewList(@Param("vo") StoreOrderPageVO vo); Integer updateByIdBillingExist (@Param("ids") Set ids, @Param("exist")Boolean exist); + Integer updateByIdBillingNum (@Param("ids") Set ids, @Param("num")String num); } \ No newline at end of file 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 25ce01fe..2f7ae144 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 @@ -6,6 +6,9 @@ import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingRespMon import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingSaveReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.billing.BillingDO; import javax.validation.*; +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; /** * 开票记录 Service 接口 @@ -58,6 +61,24 @@ public interface BillingService { * @return 开票记录分页 */ PageResult getBillingPage(BillingPageReqVO pageReqVO); - BillingRespMoneyVO getHaveWithoutMoney(Long userId); + BillingRespMoneyVO getHaveWithoutMoney(Long userId,Long carteenId); + /** + * 获取指定时间段的所有金额 + * @param time + * @param billingType + * @param carteenId + * @return + */ + BigDecimal getTotalMoney(Date time,Integer billingType,Long carteenId,Long userId); + Object getData(Date time,Integer billingType,Long carteenId,Long userId); + String getMemberId(Long userId); + + /** + * 开票完成数量,开票中数量,开票回拒数量 + * @param carteenId + * @param userId + * @return + */ + MapgetBillingTypeTotal(Long carteenId, Long userId); } \ No newline at end of file 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 ec9c5065..e9f5f71d 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 @@ -1,9 +1,10 @@ package cn.iocoder.yudao.module.member.service.billing; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONUtil; @@ -12,7 +13,6 @@ 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; @@ -22,7 +22,6 @@ 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; @@ -30,30 +29,17 @@ 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.*; -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; - import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; import org.springframework.validation.annotation.Validated; - import cn.iocoder.yudao.framework.common.util.object.BeanUtils; - - import java.lang.reflect.Method; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.Date; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; - import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*; @@ -69,8 +55,6 @@ public class BillingServiceImpl implements BillingService { @Resource private BillingMapper billingMapper; @Resource - private MemberUserService userService; - @Resource private OrderSpaceCapsuleMapper orderSpaceCapsuleMapper; @Resource private DishOrderMapper dishOrderMapper; @@ -80,20 +64,19 @@ public class BillingServiceImpl implements BillingService { private MemberGroupMapper memberGroupMapper; @Resource private CardMapper cardMapper; - - /** * 食堂 * @param startTime * @param endTime * @return */ - public List getDishOrderDO(Date startTime, Date endTime, Set ids){ + public List getDishOrderDO(Date startTime, Date endTime, List ids,Long carteenId){ return dishOrderMapper.selectList(new LambdaQueryWrapperX() .betweenIfPresent(DishOrderDO::getCreateTime,startTime,endTime) .eq(DishOrderDO::getOrderStatus,DishOrderDO.COMPLETE) - .ne(DishOrderDO::getBillingExist,Boolean.TRUE) - .in(ObjUtil.isNotEmpty(ids), DishOrderDO::getId,ids) + .ne(DishOrderDO::getBillingExist,Boolean.FALSE) + .eq(DishOrderDO::getStoreId,carteenId) + .in(DishOrderDO::getUserId,ids) ); } /** @@ -102,12 +85,13 @@ public class BillingServiceImpl implements BillingService { * @param endTime * @return */ - public List getStoreOrderDO(Date startTime, Date endTime, Set ids){ + public List getStoreOrderDO(Date startTime, Date endTime, List ids,Long carteenId){ return storeOrderMapper.selectList(new LambdaQueryWrapperX() .betweenIfPresent(StoreOrderDO::getCreateTime,startTime,endTime) .eq(StoreOrderDO::getStatus, StoreOrderStatusEnum.COMPLETE.getCode()) - .ne(StoreOrderDO::getBillingExist,Boolean.TRUE) - .in(ObjUtil.isNotEmpty(ids), StoreOrderDO::getOrderId,ids) + .ne(StoreOrderDO::getBillingExist,Boolean.FALSE) + .eq(StoreOrderDO::getCarteenId,carteenId) + .in(StoreOrderDO::getUserId,ids) ); } /** @@ -116,12 +100,13 @@ public class BillingServiceImpl implements BillingService { * @param endTime * @return */ - public List getOrderSpaceCapsuleDO(Date startTime, Date endTime, Set ids){ + public List getOrderSpaceCapsuleDO(Date startTime, Date endTime, List ids,Long carteenId){ return orderSpaceCapsuleMapper.selectList(new LambdaQueryWrapperX() .betweenIfPresent(OrderSpaceCapsuleDO::getCreateTime,startTime,endTime) .eq(OrderSpaceCapsuleDO::getStatus, SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode()) - .ne(OrderSpaceCapsuleDO::getBillingExist,Boolean.TRUE) - .in(ObjUtil.isNotEmpty(ids), OrderSpaceCapsuleDO::getId,ids) + .ne(OrderSpaceCapsuleDO::getBillingExist,Boolean.FALSE) + .eq(OrderSpaceCapsuleDO::getCarteenId,carteenId) + .in(OrderSpaceCapsuleDO::getUserId,ids) ); } @Override @@ -129,40 +114,47 @@ public class BillingServiceImpl implements BillingService { public String createBilling(BillingSaveReqVO createReqVO) { // 插入 BillingDO 对象并生成唯一主键 BillingDO billing = BeanUtils.toBean(createReqVO, BillingDO.class); + MemberGroupDO memberGroupDO = memberGroupDO(billing.getUserId()); billing.setId(IdUtil.getSnowflakeNextId() + ""); - // 获取用户信息 - MemberUserDO user = userService.getUser(createReqVO.getUserId()); - billing.setUserName(user.getNickname()); - billing.setUserPhone(user.getMobile()); + billing.setUserName(memberGroupDO.getName()); + billing.setUserPhone(String.valueOf(memberGroupDO.getId())); // 根据不同的 billingType 获取订单、金额和订单 ID 列表,并设置开票信息 List orderIds; BigDecimal totalMoney; String billingName; + //处理时间段 + Date startTime = createReqVO.getStartTime(); + DateTime start = DateUtil.beginOfMonth(startTime); + DateTime end = DateUtil.endOfMonth(startTime); + createReqVO.setStartTime(start); + createReqVO.setEndTime(end); + //获取当前单位下的所有人 + List memberList = memberGroupMapper.getMemberList(memberGroupDO.getId()); switch (BillingEnum.fromCode(billing.getBillingType())) { case BILLING_CANTEEN: - List dishOrders = getDishOrderDO(createReqVO.getStartTime(), createReqVO.getEndTime(), createReqVO.getOrderId()); + List dishOrders = getDishOrderDO(createReqVO.getStartTime(), createReqVO.getEndTime(), memberList,billing.getCarteenId()); if (CollUtil.isEmpty(dishOrders)) throw exception(BILLING_NOT_ORDER_EXISTS); totalMoney = calculateTotalMoney(dishOrders, DishOrderDO::getTotalMoney); orderIds = getOrderIds(dishOrders, DishOrderDO::getId); billingName = "食堂餐饮费"; - updateBillingExist(dishOrders, dishOrderMapper); + updateBillingExist(dishOrders, dishOrderMapper,billing.getId()); break; case BILLING_SUPERMARKET: - List storeOrders = getStoreOrderDO(createReqVO.getStartTime(), createReqVO.getEndTime(), createReqVO.getOrderId()); + List storeOrders = getStoreOrderDO(createReqVO.getStartTime(), createReqVO.getEndTime(), memberList,billing.getCarteenId()); if (CollUtil.isEmpty(storeOrders)) throw exception(BILLING_NOT_ORDER_EXISTS); totalMoney = calculateTotalMoney1(storeOrders, StoreOrderDO::getTotalPrice); List orderIds1 = getOrderIds(storeOrders, StoreOrderDO::getOrderId); orderIds = orderIds1.stream().map(Integer::longValue).collect(Collectors.toList()); billingName = "超市物品费"; - updateBillingExist(storeOrders, storeOrderMapper); + updateBillingExist(storeOrders, storeOrderMapper,billing.getId()); break; case BILLING_SPACE_CAPSULE: - List capsuleOrders = getOrderSpaceCapsuleDO(createReqVO.getStartTime(), createReqVO.getEndTime(), createReqVO.getOrderId()); + List capsuleOrders = getOrderSpaceCapsuleDO(createReqVO.getStartTime(), createReqVO.getEndTime(),memberList,billing.getCarteenId()); if (CollUtil.isEmpty(capsuleOrders)) throw exception(BILLING_NOT_ORDER_EXISTS); totalMoney = calculateTotalMoney(capsuleOrders, OrderSpaceCapsuleDO::getMoney); orderIds = getOrderIds(capsuleOrders, OrderSpaceCapsuleDO::getId); billingName = "太空舱费用"; - updateBillingExist(capsuleOrders, orderSpaceCapsuleMapper); + updateBillingExist(capsuleOrders, orderSpaceCapsuleMapper,billing.getId()); break; default: throw new IllegalArgumentException("Unsupported billing type"); @@ -183,14 +175,9 @@ public class BillingServiceImpl implements BillingService { @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); + MemberGroupDO memberGroupDO = memberGroupDO(billing.getUserId()); billing.setId(IdUtil.getSnowflakeNextId() + ""); billing.setUserName(memberGroupDO.getName()); billing.setUserPhone(String.valueOf(memberGroupDO.getId())); @@ -238,7 +225,7 @@ public class BillingServiceImpl implements BillingService { .collect(Collectors.toList()); } // 更新订单为开票状态 - private void updateBillingExist(List orders, BaseMapperX mapper) { + private void updateBillingExist(List orders, BaseMapperX mapper,String billingId) { orders.forEach(order -> { // Assuming that the order has a `setBillingExist` method try { @@ -260,12 +247,32 @@ public class BillingServiceImpl implements BillingService { // 更新 BillingDO updateObj = BeanUtils.toBean(updateReqVO, BillingDO.class); updateObj.setOrderId(billingDO.getOrderId()); + String orderId = updateObj.getOrderId(); + JSONArray jsonArray = JSONUtil.parseArray(orderId); + // 转换为 Set + Set orderIds = jsonArray.stream() + .map(object -> Long.parseLong(object.toString())) // 将每个元素转换为 Long + .collect(Collectors.toSet()); //开票成功是根据pdf上传成功没 if(StrUtil.isNotBlank(updateObj.getPdfUrl())){ //上传成功 修改状态 updateObj.setStatus(BillingStatusEnum.BILLING_INVOICING_IS_COMPLETE.getCode()); //设置同意人 updateObj.setSystemId(SecurityFrameworkUtils.getLoginUserId()); + //同意就把订单编号付上去 + switch (BillingEnum.fromCode(updateObj.getBillingType())){ + case BILLING_CANTEEN: + dishOrderMapper.updateByIdBillingNum(orderIds,updateObj.getId()); + break; + case BILLING_SUPERMARKET: + storeOrderMapper.updateByIdBillingNum(orderIds,updateObj.getId()); + break; + case BILLING_SPACE_CAPSULE: + orderSpaceCapsuleMapper.updateByIdBillingNum(orderIds,updateObj.getId()); + break; + default: + throw new IllegalArgumentException("Unsupported billing type"); + } }else{ //开票回拒 if(StrUtil.isBlank(updateObj.getRefuseDetails())){ @@ -273,16 +280,20 @@ public class BillingServiceImpl implements BillingService { } updateObj.setStatus(BillingStatusEnum.BILLING_INVOICING_REJECTION.getCode()); updateObj.setRefuseTime(LocalDateTime.now()); - String orderId = updateObj.getOrderId(); - JSONArray jsonArray = JSONUtil.parseArray(orderId); - // 转换为 Set - Set orderIds = jsonArray.stream() - .map(object -> Long.parseLong(object.toString())) // 将每个元素转换为 Long - .collect(Collectors.toSet()); - LambdaUpdateChainWrapper wrapper = new LambdaUpdateChainWrapper<>(cardMapper); - wrapper.in(CardDO::getId,orderIds); - wrapper.set(CardDO::getBillingExist,BillingStatusEnum.BILLING_INVOICING_REJECTION.getCode()); - cardMapper.update(wrapper); + //拒绝就把锁住的订单释放掉 + 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"); + } } billingMapper.updateById(updateObj); } @@ -311,25 +322,188 @@ public class BillingServiceImpl implements BillingService { } @Override - public BillingRespMoneyVO getHaveWithoutMoney(Long userId) { - BillingRespMoneyVO b=new BillingRespMoneyVO(); - //查询开票的订单 + public BillingRespMoneyVO getHaveWithoutMoney(Long userId,Long carteenId) { + List memberList = getMemberListByUserId(userId); + // 创建 BillingRespMoneyVO 对象 + BillingRespMoneyVO response = new BillingRespMoneyVO(); + // 查询已开票的金额 + BigDecimal haveMoney = getTotalMoneyForBilling(userId, BillingStatusEnum.BILLING_INVOICING_IS_COMPLETE.getCode()); + response.setHaveMoney(haveMoney); + // 查询未开票的金额 + BigDecimal withoutMoney = getTotalMoneyForOrders(memberList, carteenId); + response.setWithoutMoney(withoutMoney); + return response; + } + + /** + * 查询已开票的金额 + * @param userId 用户 ID + * @param billingStatus 账单状态 + * @return 已开票金额 + */ + private BigDecimal getTotalMoneyForBilling(Long userId, Integer billingStatus) { + return billingMapper.selectList(new LambdaQueryWrapperX() + .eq(BillingDO::getStatus, billingStatus) + .eq(BillingDO::getUserId, userId)) + .stream() + .map(BillingDO::getBillingMoney) + .reduce(BigDecimal.ZERO, BigDecimal::add); // 求和 + } + + /** + * 查询未开票的金额(食堂、超市、太空舱) + * @param memberList 成员 ID 列表 + * @return 未开票金额 + */ + private BigDecimal getTotalMoneyForOrders(List memberList,Long carteenId) { + // 合并所有订单金额查询 + BigDecimal totalSpaceCapsuleMoney = getTotalMoneyForOrderSpaceCapsules(memberList,carteenId); + BigDecimal totalDishOrderMoney = getTotalMoneyForDishOrders(memberList,carteenId); + BigDecimal totalStoreOrderMoney = getTotalMoneyForStoreOrders(memberList,carteenId); + + return totalSpaceCapsuleMoney.add(totalDishOrderMoney).add(totalStoreOrderMoney); + } + + /** + * 查询未开票的太空舱订单金额 + * @param memberList 成员 ID 列表 + * @return 太空舱订单金额 + */ + private BigDecimal getTotalMoneyForOrderSpaceCapsules(List memberList,Long carteenId) { + return orderSpaceCapsuleMapper.selectList(new LambdaQueryWrapperX() + .eq(OrderSpaceCapsuleDO::getStatus, SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode()) + .isNull(OrderSpaceCapsuleDO::getBillingNum) + .eq(OrderSpaceCapsuleDO::getCarteenId,carteenId) + .in(OrderSpaceCapsuleDO::getUserId, memberList)) + .stream() + .map(OrderSpaceCapsuleDO::getMoney) + .reduce(BigDecimal.ZERO, BigDecimal::add); // 求和 + } + + /** + * 查询未开票的食堂订单金额 + * @param memberList 成员 ID 列表 + * @return 食堂订单金额 + */ + private BigDecimal getTotalMoneyForDishOrders(List memberList,Long carteenId) { + return dishOrderMapper.selectList(new LambdaQueryWrapperX() + .eq(DishOrderDO::getOrderStatus, DishOrderDO.COMPLETE) + .isNull(DishOrderDO::getBillingNum) + .eq(DishOrderDO::getStoreId,carteenId) + .in(DishOrderDO::getUserId, memberList)) + .stream() + .map(DishOrderDO::getTotalMoney) + .reduce(BigDecimal.ZERO, BigDecimal::add); // 求和 + } + + /** + * 查询未开票的超市订单金额 + * @param memberList 成员 ID 列表 + * @return 超市订单金额 + */ + private BigDecimal getTotalMoneyForStoreOrders(List memberList,Long carteenId) { + return storeOrderMapper.selectList(new LambdaQueryWrapperX() + .eq(StoreOrderDO::getStatus, StoreOrderStatusEnum.COMPLETE.getCode()) + .eq(StoreOrderDO::getBillingExist, Boolean.FALSE) + .isNull(StoreOrderDO::getBillingNum) + .eq(StoreOrderDO::getCarteenId,carteenId) + .in(StoreOrderDO::getUserId, memberList)) + .stream() + .map(f -> BigDecimal.valueOf(f.getTotalPrice())) + .reduce(BigDecimal.ZERO, BigDecimal::add); // 求和 + } + + @Override + public BigDecimal getTotalMoney(Date time, Integer billingType, Long carteenId, Long userId) { + List data =(List) getData(time, billingType, carteenId, userId); + // 根据账单类型计算总金额 + return calculateTotalMoneyByBillingType(billingType, data); + } + + @Override + public Object getData(Date time, Integer billingType, Long carteenId, Long userId) { + // 获取当前单位下的所有成员 + List memberList = getMemberListByUserId(userId); + // 获取订单并返回 + List orders = getOrders(time, billingType, memberList,carteenId); + if (CollUtil.isEmpty(orders)) { + throw exception(BILLING_NOT_ORDER_EXISTS); + } + return orders; + } + + @Override + public String getMemberId(Long userId) { + //校验是否为管理员 + return memberGroupDO(userId).getId()+""; + } + + @Override + public Map getBillingTypeTotal(Long carteenId, Long userId) { + Map map= MapUtil.newHashMap(); + MemberGroupDO memberGroupDO = memberGroupDO(userId); + Long id = memberGroupDO.getId(); + List billingDOS = billingMapper.selectList(new LambdaQueryWrapperX() + .eq(BillingDO::getUserPhone, id) + .eqIfPresent(BillingDO::getCarteenId,carteenId) + ); + Map> collect = billingDOS.stream().collect(Collectors.groupingBy(BillingDO::getStatus)); + for (Map.Entry> entry : collect.entrySet()) { + map.put(entry.getKey(),entry.getValue().size()); + } + return map; + } + + /** + * 获取当前用户所属单位的所有成员列表 + * @param userId 当前用户 ID + * @return 当前单位的所有成员 ID 列表 + */ + private List getMemberListByUserId(Long userId) { + // 获取当前单位下的所有成员 + return memberGroupMapper.getMemberList(memberGroupDO(userId).getId()); + } + private MemberGroupDO memberGroupDO(Long userId){ + // 校验是否为管理员 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,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); - return b; + .last(" limit 1")); + if (memberGroupDO == null) { + throw exception(GROUP_NOT_EXISTS); + } + return memberGroupDO; + } + /** + * 根据账单类型计算订单的总金额 + * @param billingType 账单类型 + * @param orders 订单列表 + * @return 计算后的总金额 + */ + private BigDecimal calculateTotalMoneyByBillingType(Integer billingType, List orders) { + switch (BillingEnum.fromCode(billingType)) { + case BILLING_CANTEEN: + return calculateTotalMoney((List) orders, DishOrderDO::getTotalMoney); + case BILLING_SUPERMARKET: + return calculateTotalMoney1((List) orders, StoreOrderDO::getTotalPrice); + case BILLING_SPACE_CAPSULE: + return calculateTotalMoney((List) orders, OrderSpaceCapsuleDO::getMoney); + default: + throw new IllegalArgumentException("Unsupported billing type: " + billingType); + } + } + private List getOrders(Date time, Integer billingType,List ids,Long carteenId) { + // 获取时间内的订单 + DateTime start = DateUtil.beginOfMonth(time); + DateTime end = DateUtil.endOfMonth(time); + switch (BillingEnum.fromCode(billingType)) { + case BILLING_CANTEEN: + return getDishOrderDO(start, end, ids,carteenId); + case BILLING_SUPERMARKET: + return getStoreOrderDO(start, end, ids,carteenId); + case BILLING_SPACE_CAPSULE: + return getOrderSpaceCapsuleDO(start, end, ids,carteenId); + default: + throw new IllegalArgumentException("Unsupported billing type"); + } } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/order/DishOrderMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/order/DishOrderMapper.xml index 82b79fb6..bdcfd388 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/order/DishOrderMapper.xml +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/order/DishOrderMapper.xml @@ -40,4 +40,11 @@ #{id} + + update member_dish_order SET billing_num = #{num} + WHERE id IN + + #{id} + + \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/orderspacecapsule/OrderSpaceCapsuleMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/orderspacecapsule/OrderSpaceCapsuleMapper.xml index 524e0f52..cf157c61 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/orderspacecapsule/OrderSpaceCapsuleMapper.xml +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/orderspacecapsule/OrderSpaceCapsuleMapper.xml @@ -72,4 +72,12 @@ #{id} + + + update t_order_space_capsule SET billing_num = #{num} + WHERE id IN + + #{id} + + \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml index 5cb7b775..cd454e64 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml @@ -71,4 +71,12 @@ #{id} + + + update member_store_order SET billing_num = #{num} + WHERE order_id IN + + #{id} + + \ No newline at end of file