Yangzw пре 9 месеци
родитељ
комит
e46f0a965d
17 измењених фајлова са 797 додато и 3 уклоњено
  1. 2 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java
  2. 101 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/DailyBillController.java
  3. 59 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillPageReqVO.java
  4. 72 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillRespVO.java
  5. 59 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillSaveReqVO.java
  6. 76 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/dailybill/DailyBillDO.java
  7. 41 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/dailybill/DailyBillMapper.java
  8. 69 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/DailyBillService.java
  9. 147 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/DailyBillServiceImpl.java
  10. 21 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/MerchantDTO.java
  11. 63 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderDTO.java
  12. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderItemDTO.java
  13. 36 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/dailybill/DailyBillMapper.xml
  14. 8 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderPageReqVO.java
  15. 5 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/order/TradeOrderMapper.java
  16. 31 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/aftersale/AfterSaleServiceImpl.java
  17. 3 2
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

+ 2 - 0
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java

@@ -24,5 +24,7 @@ public interface ErrorCodeConstants {
     // ========== 分享链接信息 1-003-030-000 ==========
     ErrorCode SHARE_LINK_NOT_EXISTS = new ErrorCode(1_003_031_001, "分享链接不存在");
     ErrorCode SHARE_LINK_REGISTER_NOT_EXISTS = new ErrorCode(1_003_031_002, "通过分享链接,新注册用户不存在");
+    ErrorCode DAILY_BILL_NOT_EXISTS = new ErrorCode(1_003_031_003, "每日账单详细不存在");
+
 
 }

+ 101 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/DailyBillController.java

@@ -0,0 +1,101 @@
+package cn.newfeifan.mall.module.distri.controller.admin.dailybill;
+
+import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
+import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
+import cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo.DailyBillPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo.DailyBillRespVO;
+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.service.dailybill.DailyBillService;
+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.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
+import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
+
+@Tag(name = "管理后台 - 每日账单")
+@RestController
+@RequestMapping("/distri/daily-bill")
+@Validated
+public class DailyBillController {
+
+    @Resource
+    private DailyBillService dailyBillService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建每日账单")
+    @PreAuthorize("@ss.hasPermission('distri:daily-bill:create')")
+    public CommonResult<Long> createDailyBill(@Valid @RequestBody DailyBillSaveReqVO createReqVO) {
+        return success(dailyBillService.createDailyBill(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新每日账单")
+    @PreAuthorize("@ss.hasPermission('distri:daily-bill:update')")
+    public CommonResult<Boolean> updateDailyBill(@Valid @RequestBody DailyBillSaveReqVO updateReqVO) {
+        dailyBillService.updateDailyBill(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除每日账单")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('distri:daily-bill:delete')")
+    public CommonResult<Boolean> deleteDailyBill(@RequestParam("id") Long id) {
+        dailyBillService.deleteDailyBill(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得每日账单")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('distri:daily-bill:query')")
+    public CommonResult<DailyBillRespVO> getDailyBill(@RequestParam("id") Long id) {
+        DailyBillDO dailyBill = dailyBillService.getDailyBill(id);
+        return success(BeanUtils.toBean(dailyBill, DailyBillRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得每日账单分页")
+//    @PreAuthorize("@ss.hasPermission('distri:daily-bill:query')")
+    public CommonResult<PageResult<DailyBillRespVO>> getDailyBillPage(@Valid DailyBillPageReqVO pageReqVO) {
+        PageResult<DailyBillDO> pageResult = dailyBillService.getDailyBillPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, DailyBillRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出每日账单 Excel")
+    @PreAuthorize("@ss.hasPermission('distri:daily-bill:export')")
+    @OperateLog(type = EXPORT)
+    public void exportDailyBillExcel(@Valid DailyBillPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<DailyBillDO> list = dailyBillService.getDailyBillPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "每日账单.xls", "数据", DailyBillRespVO.class,
+                        BeanUtils.toBean(list, DailyBillRespVO.class));
+    }
+
+    @GetMapping("/getMerchant")
+    @Operation(summary = "获取商户每日账单")
+    @PreAuthorize("@ss.hasPermission('distri:daily-bill:delete')")
+    public CommonResult<String> getMerchantDailyBill() {
+        dailyBillService.caleDailyBill();
+        return success("success");
+    }
+
+}

+ 59 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillPageReqVO.java

@@ -0,0 +1,59 @@
+package cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo;
+
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 每日账单分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class DailyBillPageReqVO extends PageParam {
+
+    @Schema(description = "金额,单位:分", example = "30486")
+    private Long price;
+
+    @Schema(description = "确收金额,单位:分", example = "29815")
+    private Long receivedPrice;
+
+    @Schema(description = "订单数,默认为0", example = "27164")
+    private Long orderCount;
+
+    @Schema(description = "店铺ID", example = "11867")
+    private Long shopId;
+
+    @Schema(description = "商户ID", example = "22961")
+    private Long merchantId;
+
+    @Schema(description = "订单ID列表,文本类型")
+    private String orderIds;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "退款金额, 单位: 分", example = "11962")
+    private Long refundPrice;
+
+    @Schema(description = "积分")
+    private Long integral;
+
+    @Schema(description = "确收积分")
+    private Long receivedIntegral;
+
+    @Schema(description = "退款积分")
+    private Long refundIntegral;
+
+    @Schema(description = "订单所属日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] orderCalcTime;
+
+}

+ 72 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillRespVO.java

@@ -0,0 +1,72 @@
+package cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 每日账单 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class DailyBillRespVO {
+
+    @Schema(description = "账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27497")
+    @ExcelProperty("账单编号")
+    private Long id;
+
+    @Schema(description = "金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "30486")
+    @ExcelProperty("金额,单位:分")
+    private Long price;
+
+    @Schema(description = "确收金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "29815")
+    @ExcelProperty("确收金额,单位:分")
+    private Long receivedPrice;
+
+    @Schema(description = "订单数,默认为0", requiredMode = Schema.RequiredMode.REQUIRED, example = "27164")
+    @ExcelProperty("订单数,默认为0")
+    private Long orderCount;
+
+    @Schema(description = "店铺ID", example = "11867")
+    @ExcelProperty("店铺ID")
+    private Long shopId;
+
+    @Schema(description = "商户ID", example = "22961")
+    @ExcelProperty("商户ID")
+    private Long merchantId;
+
+    @Schema(description = "订单ID列表,文本类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("订单ID列表,文本类型")
+    private String orderIds;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "退款金额, 单位: 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "11962")
+    @ExcelProperty("退款金额, 单位: 分")
+    private Long refundPrice;
+
+    @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("积分")
+    private Long integral;
+
+    @Schema(description = "确收积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("确收积分")
+    private Long receivedIntegral;
+
+    @Schema(description = "退款积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("退款积分")
+    private Long refundIntegral;
+
+    @Schema(description = "订单所属日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("订单所属日期")
+    private LocalDate orderCalcTime;
+
+    public String getOrderCalcTime() {
+        return orderCalcTime.toString();
+    }
+
+}

+ 59 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillSaveReqVO.java

@@ -0,0 +1,59 @@
+package cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+
+@Schema(description = "管理后台 - 每日账单新增/修改 Request VO")
+@Data
+public class DailyBillSaveReqVO {
+
+    @Schema(description = "账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27497")
+    private Long id;
+
+    @Schema(description = "金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "30486")
+    @NotNull(message = "金额,单位:分不能为空")
+    private Long price;
+
+    @Schema(description = "确收金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "29815")
+    @NotNull(message = "确收金额,单位:分不能为空")
+    private Long receivedPrice;
+
+    @Schema(description = "订单数,默认为0", requiredMode = Schema.RequiredMode.REQUIRED, example = "27164")
+    @NotNull(message = "订单数,默认为0不能为空")
+    private Long orderCount;
+
+    @Schema(description = "店铺ID", example = "11867")
+    private Long shopId;
+
+    @Schema(description = "商户ID", example = "22961")
+    private Long merchantId;
+
+    @Schema(description = "订单ID列表,文本类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "订单ID列表,文本类型不能为空")
+    private String orderIds;
+
+    @Schema(description = "退款金额, 单位: 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "11962")
+    @NotNull(message = "退款金额, 单位: 分不能为空")
+    private Long refundPrice;
+
+    @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "积分不能为空")
+    private Long integral;
+
+    @Schema(description = "确收积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "确收积分不能为空")
+    private Long receivedIntegral;
+
+    @Schema(description = "退款积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "退款积分不能为空")
+    private Long refundIntegral;
+
+    @Schema(description = "订单所属日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "订单所属日期不能为空")
+    private LocalDate orderCalcTime;
+
+}

+ 76 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/dailybill/DailyBillDO.java

@@ -0,0 +1,76 @@
+package cn.newfeifan.mall.module.distri.dal.dataobject.dailybill;
+
+import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDate;
+
+/**
+ * 每日账单 DO
+ *
+ * @author 非繁人
+ */
+@TableName("distri_daily_bill")
+@KeySequence("distri_daily_bill_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class DailyBillDO extends BaseDO {
+
+    /**
+     * 账单编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 金额,单位:分
+     */
+    private Long price;
+    /**
+     * 确收金额,单位:分
+     */
+    private Long receivedPrice;
+    /**
+     * 订单数,默认为0
+     */
+    private Long orderCount;
+    /**
+     * 店铺ID
+     */
+    private Long shopId;
+    /**
+     * 商户ID
+     */
+    private Long merchantId;
+    /**
+     * 订单ID列表,文本类型
+     */
+    private String orderIds;
+    /**
+     * 退款金额, 单位: 分
+     */
+    private Long refundPrice;
+    /**
+     * 积分
+     */
+    private Long integral;
+    /**
+     * 确收积分
+     */
+    private Long receivedIntegral;
+    /**
+     * 退款积分
+     */
+    private Long refundIntegral;
+    /**
+     * 订单所属日期
+     */
+    private LocalDate orderCalcTime;
+
+}

+ 41 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/dailybill/DailyBillMapper.java

@@ -0,0 +1,41 @@
+package cn.newfeifan.mall.module.distri.dal.mysql.dailybill;
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo.DailyBillPageReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.dailybill.DailyBillDO;
+import cn.newfeifan.mall.module.distri.service.dailybill.dto.MerchantDTO;
+import cn.newfeifan.mall.module.distri.service.dailybill.dto.OrderDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 每日账单 Mapper
+ *
+ * @author 非繁人
+ */
+@Mapper
+public interface DailyBillMapper extends BaseMapperX<DailyBillDO> {
+
+    default PageResult<DailyBillDO> selectPage(DailyBillPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<DailyBillDO>()
+                .eqIfPresent(DailyBillDO::getPrice, reqVO.getPrice())
+                .eqIfPresent(DailyBillDO::getReceivedPrice, reqVO.getReceivedPrice())
+                .eqIfPresent(DailyBillDO::getOrderCount, reqVO.getOrderCount())
+                .eqIfPresent(DailyBillDO::getShopId, reqVO.getShopId())
+                .eqIfPresent(DailyBillDO::getMerchantId, reqVO.getMerchantId())
+                .eqIfPresent(DailyBillDO::getOrderIds, reqVO.getOrderIds())
+                .betweenIfPresent(DailyBillDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(DailyBillDO::getId));
+    }
+
+    List<MerchantDTO> getMerchantDTO();
+
+    List<OrderDTO> getOrderDetailsByMerchantIdWithsShopId(@Param("merchantId") Long merchantId, @Param("shopId") Long shopId);
+
+    void updateOrderItemByOrderId(List<Long> orderIds);
+
+}

+ 69 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/DailyBillService.java

@@ -0,0 +1,69 @@
+package cn.newfeifan.mall.module.distri.service.dailybill;
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+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 javax.validation.Valid;
+import java.time.LocalDate;
+
+/**
+ * 每日账单 Service 接口
+ *
+ * @author 非繁人
+ */
+public interface DailyBillService {
+
+    /**
+     * 创建每日账单
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createDailyBill(@Valid DailyBillSaveReqVO createReqVO);
+
+    /**
+     * 更新每日账单
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateDailyBill(@Valid DailyBillSaveReqVO updateReqVO);
+
+    /**
+     * 删除每日账单
+     *
+     * @param id 编号
+     */
+    void deleteDailyBill(Long id);
+
+    /**
+     * 获得每日账单
+     *
+     * @param id 编号
+     * @return 每日账单
+     */
+    DailyBillDO getDailyBill(Long id);
+
+    /**
+     * 获得每日账单分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 每日账单分页
+     */
+    PageResult<DailyBillDO> getDailyBillPage(DailyBillPageReqVO pageReqVO);
+
+    /**
+     * 计算每家店铺每日的订单
+     */
+    void caleDailyBill();
+
+    /**
+     * 获取每日账单
+     * @param merchantId 商户ID
+     * @param shopId 店铺ID
+     * @param localDate 日期
+     * @return 每日账单
+     */
+    DailyBillDO getDailyBill(Long merchantId, Long shopId, LocalDate localDate);
+}

+ 147 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/DailyBillServiceImpl.java

@@ -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);
+    }
+
+}

+ 21 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/MerchantDTO.java

@@ -0,0 +1,21 @@
+package cn.newfeifan.mall.module.distri.service.dailybill.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 商户信息
+ */
+@Data
+public class MerchantDTO {
+    /**
+     * 商户id
+     */
+    private Long merchantId;
+
+    /**
+     * 商户下面的店铺id
+     */
+    private List<Long> shopIds;
+}

+ 63 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderDTO.java

@@ -0,0 +1,63 @@
+package cn.newfeifan.mall.module.distri.service.dailybill.dto;
+
+import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OrderDTO extends BaseDO {
+    /**
+     * 订单编号,主键自增
+     */
+    private Long id;
+    /**
+     * 订单流水号
+     * <p>
+     * 例如说,1146347329394184195
+     */
+    private String no;
+    /**
+     * 购买的商品数量
+     */
+    private Integer productCount;
+    /**
+     * 商品原价,单位:分
+     * <p>
+     * <p>
+     * 对应 taobao 的 trade.total_fee 字段
+     */
+    private Integer totalPrice;
+    /**
+     * 运费金额,单位:分
+     */
+    private Integer deliveryPrice;
+
+    /**
+     * 应付金额(总),单位:分
+     */
+    private Integer payPrice;
+    // ========== 售后基本信息 ==========
+    /**
+     * 售后状态
+     */
+    private Integer refundStatus;
+    /**
+     * 退款金额,单位:分
+     */
+    private Integer refundPrice;
+    /**
+     * 支付积分
+     */
+    private Long payIntegral;
+    /**
+     * 退还的使用的积分
+     */
+    private Long refundIntegral;
+    /**
+     * 实付人民币,单位:分
+     */
+    private Integer payRmb;
+
+    private List<OrderItemDTO> items;
+}

+ 4 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderItemDTO.java

@@ -0,0 +1,4 @@
+package cn.newfeifan.mall.module.distri.service.dailybill.dto;
+
+public class OrderItemDTO {
+}

+ 36 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/dailybill/DailyBillMapper.xml

@@ -0,0 +1,36 @@
+<?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="cn.newfeifan.mall.module.distri.dal.mysql.dailybill.DailyBillMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
+     -->
+    <resultMap id="MerchantDTOResultMap" type="cn.newfeifan.mall.module.distri.service.dailybill.dto.MerchantDTO">
+        <id property="merchantId" column="merchantId" />
+        <collection property="shopIds" ofType="long" column="merchantId" select="selectShopIdsByMerchantId" />
+    </resultMap>
+    <update id="updateOrderItemByOrderId">
+        update trade_order_item set computation_bill = 1 where order_id in
+        <foreach collection="list" item="orderId" open="(" close=")" separator=",">
+            #{orderId}
+        </foreach>
+    </update>
+
+    <select id="getMerchantDTO" resultMap="MerchantDTOResultMap">
+        SELECT id AS merchantId FROM sale_merchant
+    </select>
+
+    <select id="selectShopIdsByMerchantId" resultType="long">
+        SELECT id FROM sale_shop WHERE merchant_id = #{merchantId}
+    </select>
+    <select id="getOrderDetailsByMerchantIdWithsShopId"
+            resultType="cn.newfeifan.mall.module.distri.service.dailybill.dto.OrderDTO">
+        select o.id,o.no,o.product_count,o.delivery_price,o.pay_price,o.refund_status,o.refund_price,o.pay_integral,o.refund_integral,
+               o.pay_rmb,o.create_time from trade_order o
+               join trade_order_item item on item.order_id = o.id
+        where shop_id = #{shopId} and merchant_id = #{merchantId} and pay_status = 1 and date(o.create_time) &lt; date(now()) and item.computation_bill = 0
+    </select>
+</mapper>

+ 8 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderPageReqVO.java

@@ -9,9 +9,11 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
 
+import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
 import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
 @Schema(description = "管理后台 - 交易订单的分页 Request VO")
@@ -95,4 +97,10 @@ public class TradeOrderPageReqVO extends PageParam {
     @Schema(description = "发货信息附件")
     private String attachment;
 
+    @Schema(description = "订单账单日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate orderCalcTime;
+
+    @Schema(description = "支付状态")
+    private Integer payStatus;
 }

+ 5 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/order/TradeOrderMapper.java

@@ -46,7 +46,7 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
                 .eqIfPresent(TradeOrderDO::getLogisticsId, reqVO.getLogisticsId())
                 .eqIfPresent(TradeOrderDO::getMerchantId, reqVO.getMerchantId())
                 .eqIfPresent(TradeOrderDO::getShopId, reqVO.getShopId())
-
+                .eqIfPresent(TradeOrderDO::getPayStatus, reqVO.getPayStatus())
                 .inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds())
                 .likeIfPresent(TradeOrderDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode())
                 .betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())
@@ -57,6 +57,10 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
             queryWrapper.eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus());
             queryWrapper.ne(TradeOrderDO::getRefundStatus, TradeOrderRefundStatusEnum.ALL.getStatus());
         }
+
+        if(reqVO.getOrderCalcTime() != null){
+            queryWrapper.apply("date(create_time) = {0}", reqVO.getOrderCalcTime());
+        }
         return selectPage(reqVO, queryWrapper);
     }
 

+ 31 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/aftersale/AfterSaleServiceImpl.java

@@ -5,9 +5,13 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.newfeifan.mall.framework.common.pojo.PageParam;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 import cn.newfeifan.mall.framework.common.util.object.ObjectUtils;
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+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.enums.CaclEnum;
+import cn.newfeifan.mall.module.distri.service.dailybill.DailyBillService;
 import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
 import cn.newfeifan.mall.module.pay.api.refund.PayRefundApi;
 import cn.newfeifan.mall.module.pay.api.refund.dto.PayRefundCreateReqDTO;
@@ -103,6 +107,9 @@ public class AfterSaleServiceImpl implements AfterSaleService {
     @Resource
     private WcChatMessageUtils wcChatMessageUtils;
 
+    @Resource
+    private DailyBillService dailyBillService;
+
 
     @Override
     public PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO) {
@@ -402,14 +409,38 @@ public class AfterSaleServiceImpl implements AfterSaleService {
         TradeOrderItemDO tradeOrderItemDO = tradeOrderItemMapper.selectById(orderItemId);
         Long payIntegral = tradeOrderItemDO.getPayIntegral();//支付积分
 
+        //查询该订单是否有对应的日结单
+        DailyBillDO dailyBill = dailyBillService.getDailyBill(afterSale.getMerchantId(), afterSale.getShopId(), tradeOrderDO.getCreateTime().toLocalDate());
+
         //记录退还积分
         if(payIntegral>0) {
             TradeOrderItemDO toid = new TradeOrderItemDO();
             toid.setId(tradeOrderItemDO.getId());
             toid.setRefundIntegral(payIntegral);
             tradeOrderItemMapper.updateById(toid);
+
+            if(tradeOrderDO.getRefundPrice() != null){
+                tradeOrderDO.setRefundIntegral(tradeOrderDO.getRefundIntegral()+payIntegral);
+            }else{
+                tradeOrderDO.setRefundIntegral(payIntegral);
+            }
+            tradeOrderMapper.updateById(tradeOrderDO);
+
             //退回退款订单项,购物者支付的积分
             integralService.updateUserIntegral(orderUserId,orderUserId, CaclEnum.ORDER_REFUND_INTEGRAL, payIntegral, 0L, tradeOrderId, tradeOrderNum);
+
+            if(dailyBill != null){
+                //有就追加退回积分
+                dailyBill.setRefundIntegral(dailyBill.getRefundIntegral()+payIntegral);
+                dailyBill.setReceivedIntegral(dailyBill.getReceivedIntegral()-payIntegral);
+            }
+        }
+
+        if(dailyBill != null){
+            //有就追加退款金额
+            dailyBill.setRefundPrice(dailyBill.getRefundPrice()+afterSale.getRefundPrice());
+            dailyBill.setReceivedPrice(dailyBill.getReceivedPrice()-afterSale.getRefundPrice());
+            dailyBillService.updateDailyBill(BeanUtils.toBean(dailyBill,DailyBillSaveReqVO.class));
         }
 
         //2. 减少退货物品对应的冻结积分

+ 3 - 2
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -362,8 +362,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         TradeOrderDO order = validateOrderDeliverable(deliveryReqVO.getId());
         order.setLogisticsId(deliveryReqVO.getLogisticsId());
         order.setLogisticsNo(deliveryReqVO.getLogisticsNo());
-        order.setAttachment(deliveryReqVO.getAttachment());
-        order.setDeliveryRemark(deliveryReqVO.getDeliveryRemark());
         // 1.2 校验 deliveryType 是否为快递,是快递才可以发货
         if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getType()) && ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.VIRTUAL_PRODUCT.getType())) {
             throw exception(ORDER_DELIVERY_FAIL_DELIVERY_TYPE_NOT_EXPRESS);
@@ -392,6 +390,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
         // 执行更新
         if (deliveryReqVO.getAttachment() != null) {
+            updateOrderObj.setAttachment(deliveryReqVO.getAttachment());
+            updateOrderObj.setDeliveryRemark(deliveryReqVO.getDeliveryRemark());
+
             //如果是虚拟商品直接完成发货和签收
             updateOrderObj.setStatus(TradeOrderStatusEnum.COMPLETED.getStatus()).setDeliveryTime(LocalDateTime.now()).setReceivingTime(LocalDateTime.now());
             TradeOrderItemDO tradeOrderItemDO = tradeOrderItemMapper.selectOne(new LambdaQueryWrapperX<TradeOrderItemDO>()