浏览代码

收益概览相关接口

tanbin 1 年之前
父节点
当前提交
97949737f7

+ 19 - 0
device-api-cloud/src/main/java/com/xy/feign/MercFeeStatisticFeign.java

@@ -0,0 +1,19 @@
+package com.xy.feign;
+
+import com.xy.service.MercFeeStatisticService;
+import com.xy.FeignInterceptor;
+import com.xy.consts.ServiceConsts;
+import org.springframework.cloud.openfeign.FeignClient;
+
+/**
+ * <p>
+ * 商户佣金费用统计 feign
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-04-24
+ */
+@FeignClient(value = ServiceConsts.SERVICE_NAME, configuration = FeignInterceptor.class)
+public interface MercFeeStatisticFeign extends MercFeeStatisticService {
+
+}

+ 77 - 0
device-api-service-merc-mini/src/main/java/com/xy/controller/MercFeeCountController.java

@@ -1,13 +1,90 @@
 package com.xy.controller;
 
+import cn.hutool.core.util.BooleanUtil;
 import com.xy.annotate.RestMappingController;
+import com.xy.dto.MercFeeCountMonthDto;
+import com.xy.dto.MercFeeSettleDto;
+import com.xy.dto.MercFeeStatisticDto;
+import com.xy.entity.MercFeeStatistic;
+import com.xy.error.CommRuntimeException;
+import com.xy.service.MercFeeCountMonthServiceImpl;
+import com.xy.service.MercFeeSettleServiceImpl;
+import com.xy.service.MercFeeStatisticServiceImpl;
+import com.xy.utils.MercAuthUtils;
+import com.xy.utils.PageBean;
+import com.xy.utils.R;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 @AllArgsConstructor
 @Api(tags = "商户-收益概览")
 @RestMappingController("merc-api/fee")
 public class MercFeeCountController {
 
+    private MercFeeCountMonthServiceImpl mercFeeCountMonthService;
+    private MercFeeStatisticServiceImpl mercFeeStatisticService;
+    private MercFeeSettleServiceImpl mercFeeSettleService;
+
+
+    @PostMapping("page")
+    @ApiOperation("收益概览-分页查询")
+    public R<PageBean<MercFeeCountMonthDto.Vo>> page(@RequestBody MercFeeCountMonthDto.Page page) {
+        page.setParentMercId(MercAuthUtils.getMercId());
+        return mercFeeCountMonthService.page(page);
+    }
+
+    @PostMapping("confirm")
+    @ApiOperation("确认佣金")
+    public R confirm(@RequestBody @Validated MercFeeCountMonthDto.ConfirmDTO dto) {
+        dto.setParentMercId(MercAuthUtils.getMercId());
+        return mercFeeCountMonthService.confirm(dto);
+    }
+
+    @PostMapping("info")
+    @ApiOperation("总览")
+    public R<MercFeeStatisticDto.InFoVO> info() {
+        return mercFeeStatisticService.info(MercAuthUtils.getMercId());
+    }
+
+
+    @PostMapping("applySettle")
+    @ApiOperation("结算申请")
+    @Transactional(rollbackFor = Exception.class)
+    public R applySettle(@RequestBody @Validated MercFeeSettleDto.ApplyDTO dto) {
+        Long mercId = MercAuthUtils.getMercId();
+        dto.setMercId(mercId);
+        //验证结算金额是否在可结算金额范围内
+        Integer settleMoney = dto.getSettleMoney();
+        //可结算金额查看
+        MercFeeStatisticDto.InFoVO inFoVO = R.feignCheckData(mercFeeStatisticService.info(mercId));
+        Integer unSettleMoney = inFoVO.getUnSettleMoney();
+        if (settleMoney > unSettleMoney) {
+            throw new CommRuntimeException("申请结算金额填写有误,不可大于可结算金额:" + unSettleMoney);
+        }
+
+        Boolean b = R.feignCheckData(mercFeeSettleService.applySettle(dto));
+        if (BooleanUtil.isTrue(b)) {
+            //成功申请,统计表中的可结算佣金扣除申请结算金额
+            unSettleMoney = unSettleMoney - settleMoney;
+            MercFeeStatistic mercFeeStatistic = new MercFeeStatistic();
+            mercFeeStatistic.setMercId(mercId);
+            mercFeeStatistic.setUnSettleMoney(unSettleMoney);
+            mercFeeStatisticService.updateById(mercFeeStatistic);
+        }
+        return R.ok();
+    }
+
+    @PostMapping("settlePage")
+    @ApiOperation("收益概览-结算记录")
+    public R<PageBean<MercFeeSettleDto.Vo>> settlePage(@RequestBody MercFeeSettleDto.Page page) {
+        page.setMercId(MercAuthUtils.getMercId());
+        return mercFeeSettleService.page(page);
+    }
+
 
 }

+ 3 - 1
device-api-service/src/main/java/com/xy/entity/MercFeeCountMonth.java

@@ -32,10 +32,12 @@ public class MercFeeCountMonth implements Serializable {
     @ApiModelProperty(value = "id")
     @TableId(value = "id", type = IdType.ASSIGN_ID)
     private Long id;
-
     @ApiModelProperty(value = "商户ID")
     private Long mercId;
 
+    @ApiModelProperty(value = "父商户ID")
+    private Long parentMercId;
+
 
     @ApiModelProperty(value = "统计日期202206")
     private Integer dateValue;

+ 53 - 0
device-api-service/src/main/java/com/xy/entity/MercFeeStatistic.java

@@ -0,0 +1,53 @@
+package com.xy.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 商户佣金费用统计
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-04-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="MercFeeStatistic对象", description="商户佣金费用统计")
+public class MercFeeStatistic implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "商户ID")
+    @TableId(value = "merc_id", type = IdType.ASSIGN_ID)
+    private Long mercId;
+
+    @ApiModelProperty(value = "累计已结算佣金")
+    private Integer settleMoney;
+
+    @ApiModelProperty(value = "可结算佣金")
+    private Integer unSettleMoney;
+
+    @ApiModelProperty(value = "累计已确认佣金")
+    private Integer verifyMoney;
+
+    @ApiModelProperty(value = "申请时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime updateTime;
+
+
+}

+ 82 - 5
device-api-service/src/main/java/com/xy/job/MercFeeCountDayJob.java

@@ -18,6 +18,8 @@ import com.xy.error.CommRuntimeException;
 import com.xy.merc.EnumMercDeviceAlgorithmChargingPayType;
 import com.xy.service.*;
 import com.xy.service.be.MercFeignService;
+import com.xy.service.be.MercService;
+import com.xy.sys.EnumMercFeeType;
 import com.xy.utils.LambdaUtils;
 import com.xy.utils.PageBean;
 import com.xy.utils.R;
@@ -62,6 +64,8 @@ public class MercFeeCountDayJob {
 
     private final DeviceSimChargeServiceImpl deviceSimChargeService;
 
+    private final MercService mercService;
+
 
     @PostMapping("excuteJob")
     @ApiOperation("指定日期执行")
@@ -79,7 +83,7 @@ public class MercFeeCountDayJob {
     @XxlJob("mercFeeCountDayJob")
     public ReturnT<String> dayJob(String date) {
         log.info("-----------商户佣金费用收益每日统计 开始-----------");
-        long startTime = System.currentTimeMillis();
+//        long startTime = System.currentTimeMillis();
         DateTime yesterday = DateUtil.yesterday();
         String queryDay = DateUtil.format(yesterday, DatePattern.PURE_DATE_PATTERN);
         if (StrUtil.isNotEmpty(date)) {
@@ -110,6 +114,11 @@ public class MercFeeCountDayJob {
 
         for (MercDto.Vo merc : approvedMercList) {
             Long parentMercId = merc.getId();
+            List<Long> mercIds = R.feignCheckData(mercService.getChildMercIds(new MercDto.QuerySubDTO().setParentMercID(parentMercId)));
+            if (CollUtil.isEmpty(mercIds)) {
+                //子商户都没有,就不用查分佣收益了
+                continue;
+            }
             //~~~~~~~~~~~~~1设备管理费
             PageBean<DeviceChargingHistoryDto.PageVo> pageVoPageBean = getDeviceManagerFeeMerc(parentMercId, beginTime, endTime);
             List<DeviceChargingHistoryDto.PageVo> records = pageVoPageBean == null ? null : pageVoPageBean.getRecords();
@@ -128,7 +137,7 @@ public class MercFeeCountDayJob {
                     Integer payMoney = devicePayMoneyMap.get(mercId);
                     Integer brokerage = deviceAgentMoneyMap.get(mercId);
                     MercFeeCountDay deviceDayFee = new MercFeeCountDay();
-                    deviceDayFee.setFeeType(1);
+                    deviceDayFee.setFeeType(EnumMercFeeType.T1.getIntCode());
                     deviceDayFee.setParentMercId(parentMercId);
                     deviceDayFee.setDateValue(dateValue);
                     deviceDayFee.setPayMoney(payMoney);
@@ -139,6 +148,23 @@ public class MercFeeCountDayJob {
                     saveMercFeeCountList.add(deviceDayFee);
                 }
                 mercFeeCountDayService.saveBatch(saveMercFeeCountList);
+            } else {
+                //没有费用的也要记录,为了前端收益概览的展示
+                List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
+                for (Long mercId : mercIds) {
+
+                    MercFeeCountDay deviceDayFee = new MercFeeCountDay();
+                    deviceDayFee.setFeeType(EnumMercFeeType.T1.getIntCode());
+                    deviceDayFee.setParentMercId(parentMercId);
+                    deviceDayFee.setDateValue(dateValue);
+                    deviceDayFee.setPayMoney(0);
+                    deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
+                    deviceDayFee.setBrokerage(0);
+                    deviceDayFee.setMercId(mercId);
+                    deviceDayFee.setParentMercId(parentMercId);
+                    saveMercFeeCountList.add(deviceDayFee);
+                }
+                mercFeeCountDayService.saveBatch(saveMercFeeCountList);
             }
 
             //~~~~~~~~~~~~~1设备管理费
@@ -161,7 +187,7 @@ public class MercFeeCountDayJob {
                     Integer payMoney = devicePayMoneyMap.get(mercId);
                     Integer brokerage = deviceAgentMoneyMap.get(mercId);
                     MercFeeCountDay deviceDayFee = new MercFeeCountDay();
-                    deviceDayFee.setFeeType(2);
+                    deviceDayFee.setFeeType(EnumMercFeeType.T2.getIntCode());
                     deviceDayFee.setParentMercId(parentMercId);
                     deviceDayFee.setDateValue(dateValue);
                     deviceDayFee.setPayMoney(payMoney);
@@ -171,6 +197,23 @@ public class MercFeeCountDayJob {
                     saveMercFeeCountList.add(deviceDayFee);
                 }
                 mercFeeCountDayService.saveBatch(saveMercFeeCountList);
+            } else {
+                //没有费用的也要记录,为了前端收益概览的展示
+                List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
+                for (Long mercId : mercIds) {
+
+                    MercFeeCountDay deviceDayFee = new MercFeeCountDay();
+                    deviceDayFee.setFeeType(EnumMercFeeType.T2.getIntCode());
+                    deviceDayFee.setParentMercId(parentMercId);
+                    deviceDayFee.setDateValue(dateValue);
+                    deviceDayFee.setPayMoney(0);
+                    deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
+                    deviceDayFee.setBrokerage(0);
+                    deviceDayFee.setMercId(mercId);
+                    deviceDayFee.setParentMercId(parentMercId);
+                    saveMercFeeCountList.add(deviceDayFee);
+                }
+                mercFeeCountDayService.saveBatch(saveMercFeeCountList);
             }
 
             //~~~~~~~~~~~~~2设备激活费
@@ -193,7 +236,7 @@ public class MercFeeCountDayJob {
                     Integer payMoney = devicePayMoneyMap.get(mercId);
                     Integer brokerage = deviceAgentMoneyMap.get(mercId);
                     MercFeeCountDay deviceDayFee = new MercFeeCountDay();
-                    deviceDayFee.setFeeType(2);
+                    deviceDayFee.setFeeType(EnumMercFeeType.T3.getIntCode());
                     deviceDayFee.setParentMercId(parentMercId);
                     deviceDayFee.setDateValue(dateValue);
                     deviceDayFee.setPayMoney(payMoney);
@@ -203,6 +246,23 @@ public class MercFeeCountDayJob {
                     saveMercFeeCountList.add(deviceDayFee);
                 }
                 mercFeeCountDayService.saveBatch(saveMercFeeCountList);
+            } else {
+                //没有费用的也要记录,为了前端收益概览的展示
+                List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
+                for (Long mercId : mercIds) {
+
+                    MercFeeCountDay deviceDayFee = new MercFeeCountDay();
+                    deviceDayFee.setFeeType(EnumMercFeeType.T3.getIntCode());
+                    deviceDayFee.setParentMercId(parentMercId);
+                    deviceDayFee.setDateValue(dateValue);
+                    deviceDayFee.setPayMoney(0);
+                    deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
+                    deviceDayFee.setBrokerage(0);
+                    deviceDayFee.setMercId(mercId);
+                    deviceDayFee.setParentMercId(parentMercId);
+                    saveMercFeeCountList.add(deviceDayFee);
+                }
+                mercFeeCountDayService.saveBatch(saveMercFeeCountList);
             }
             //~~~~~~~~~~~~~3算法服务费
 
@@ -224,7 +284,7 @@ public class MercFeeCountDayJob {
                     Integer payMoney = devicePayMoneyMap.get(mercId);
                     Integer brokerage = deviceAgentMoneyMap.get(mercId);
                     MercFeeCountDay deviceDayFee = new MercFeeCountDay();
-                    deviceDayFee.setFeeType(2);
+                    deviceDayFee.setFeeType(EnumMercFeeType.T4.getIntCode());
                     deviceDayFee.setParentMercId(parentMercId);
                     deviceDayFee.setDateValue(dateValue);
                     deviceDayFee.setPayMoney(payMoney);
@@ -234,6 +294,23 @@ public class MercFeeCountDayJob {
                     saveMercFeeCountList.add(deviceDayFee);
                 }
                 mercFeeCountDayService.saveBatch(saveMercFeeCountList);
+            } else {
+                //没有费用的也要记录,为了前端收益概览的展示
+                List<MercFeeCountDay> saveMercFeeCountList = new ArrayList<>();
+                for (Long mercId : mercIds) {
+
+                    MercFeeCountDay deviceDayFee = new MercFeeCountDay();
+                    deviceDayFee.setFeeType(EnumMercFeeType.T4.getIntCode());
+                    deviceDayFee.setParentMercId(parentMercId);
+                    deviceDayFee.setDateValue(dateValue);
+                    deviceDayFee.setPayMoney(0);
+                    deviceDayFee.setMonthValue(Integer.valueOf(monthValue));
+                    deviceDayFee.setBrokerage(0);
+                    deviceDayFee.setMercId(mercId);
+                    deviceDayFee.setParentMercId(parentMercId);
+                    saveMercFeeCountList.add(deviceDayFee);
+                }
+                mercFeeCountDayService.saveBatch(saveMercFeeCountList);
             }
             //~~~~~~~~~~~~~4流量卡费
         }

+ 1 - 1
device-api-service/src/main/java/com/xy/job/MercFeeCountMonthJob.java

@@ -28,7 +28,7 @@ import java.util.List;
 
 
 /**
- * 商户佣金费用收益每月统计任务(不含本月)
+ * 商户佣金费用收益每月统计任务(不含本月) 每月1号凌晨2点执行
  */
 @Slf4j
 @Component

+ 16 - 0
device-api-service/src/main/java/com/xy/mapper/MercFeeStatisticMapper.java

@@ -0,0 +1,16 @@
+package com.xy.mapper;
+
+import com.xy.entity.MercFeeStatistic;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 商户佣金费用统计 Mapper 接口
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-04-24
+ */
+public interface MercFeeStatisticMapper extends BaseMapper<MercFeeStatistic> {
+
+}

+ 15 - 0
device-api-service/src/main/java/com/xy/mapper/mapper/MercFeeStatisticMapper.xml

@@ -0,0 +1,15 @@
+<?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="com.xy.mapper.MercFeeStatisticMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.xy.entity.MercFeeStatistic">
+        <id column="merc_id" property="mercId" />
+        <result column="settle_money" property="settleMoney" />
+        <result column="un_settle_money" property="unSettleMoney" />
+        <result column="verify_money" property="verifyMoney" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>

+ 94 - 27
device-api-service/src/main/java/com/xy/service/MercFeeCountMonthServiceImpl.java

@@ -1,25 +1,35 @@
 package com.xy.service;
 
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xy.dto.MercFeeCountMonthDto;
+import com.xy.dto.be.MercDto;
 import com.xy.entity.MercFeeCountMonth;
+import com.xy.entity.MercFeeStatistic;
 import com.xy.mapper.MercFeeCountMonthMapper;
-import com.xy.service.MercFeeCountMonthService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
+import com.xy.service.be.MercFeignService;
+import com.xy.utils.Emptys;
+import com.xy.utils.MybatisPlusQuery;
+import com.xy.utils.PageBean;
+import com.xy.utils.R;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
+import java.time.LocalDateTime;
 import java.util.List;
-import com.xy.utils.R;
-import com.xy.utils.PageBean;
-import com.xy.dto.MercFeeCountMonthDto;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.PostMapping;
-import io.swagger.annotations.ApiOperation;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.xy.utils.MybatisPlusQuery;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springframework.validation.annotation.Validated;
-import com.xy.utils.Emptys;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 import static com.xy.utils.Beans.copy;
 import static com.xy.utils.PlusBeans.toIPage;
@@ -27,24 +37,27 @@ import static com.xy.utils.PlusBeans.toPageBean;
 
 
 /**
-* <p>
-* 商户佣金费用收益每月统计(不含本月) 服务实现类
-* </p>
-*
-* @author 谭斌
-* @since 2024-04-23
-*/
+ * <p>
+ * 商户佣金费用收益每月统计(不含本月) 服务实现类
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-04-23
+ */
 @Service
 @AllArgsConstructor
 @Api(tags = "商户佣金费用收益每月统计(不含本月)")
 public class MercFeeCountMonthServiceImpl extends ServiceImpl<MercFeeCountMonthMapper, MercFeeCountMonth> implements MercFeeCountMonthService {
 
+    private MercFeignService mercFeignService;
+    private MercFeeStatisticServiceImpl mercFeeStatisticService;
+
     @PostMapping("obj")
     @ApiOperation("对象查询")
     public R<MercFeeCountMonthDto.Vo> obj(@RequestBody MercFeeCountMonthDto.Vo vo) {
         MercFeeCountMonthDto.SelectList selectList = copy(MercFeeCountMonthDto.SelectList.class, vo);
         List<MercFeeCountMonthDto.Vo> list = list(selectList).getData();
-        if(Emptys.check(list)) {
+        if (Emptys.check(list)) {
             return R.ok(list.get(0));
         }
         return R.ok();
@@ -58,13 +71,67 @@ public class MercFeeCountMonthServiceImpl extends ServiceImpl<MercFeeCountMonthM
         return R.ok(copy(MercFeeCountMonthDto.Vo.class, list));
     }
 
-    @PostMapping("page")
-    @ApiOperation("分页查询")
+    /**
+     * 收益概览-分页查询
+     *
+     * @param page
+     * @return
+     */
     public R<PageBean<MercFeeCountMonthDto.Vo>> page(@RequestBody MercFeeCountMonthDto.Page page) {
+
         PageBean pageBean = page.getPage();
-        LambdaQueryWrapper<MercFeeCountMonth> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, MercFeeCountMonth.class).build();
+        LocalDateTime beginTime = page.getBeginTime();
+        LocalDateTime endTime = page.getEndTime();
+        String start = LocalDateTimeUtil.format(beginTime, DatePattern.SIMPLE_MONTH_PATTERN);
+        String end = LocalDateTimeUtil.format(endTime, DatePattern.SIMPLE_MONTH_PATTERN);
+        LambdaQueryWrapper<MercFeeCountMonth> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, MercFeeCountMonth.class)
+                .build()
+                .between(StrUtil.isNotEmpty(start) && StrUtil.isNotEmpty(end), MercFeeCountMonth::getDateValue, Integer.valueOf(start), Integer.valueOf(end))
+                .orderByDesc(MercFeeCountMonth::getDateValue);
         IPage<MercFeeCountMonth> iPage = page(toIPage(pageBean), lambdaQueryWrapper);
-        return R.ok(toPageBean(MercFeeCountMonthDto.Vo.class, iPage));
+        PageBean<MercFeeCountMonthDto.Vo> pageData = toPageBean(MercFeeCountMonthDto.Vo.class, iPage);
+        List<MercFeeCountMonthDto.Vo> records = pageData.getRecords();
+        if (Emptys.check(records)) {
+            List<Long> mercIds = records.stream().map(MercFeeCountMonthDto.Vo::getMercId).distinct().collect(Collectors.toList());
+            List<MercDto.Vo> mercList = R.feignCheckData(mercFeignService.listMerc(new MercDto.ListDTO().setIds(mercIds)));
+            Map<Long, String> mercMap = mercList.stream().collect(Collectors.toMap(MercDto.Vo::getId, MercDto.Vo::getName));
+            for (MercFeeCountMonthDto.Vo record : records) {
+                Long mercId = record.getMercId();
+                //反显商户名称
+                String mercName = mercMap.get(mercId);
+                record.setMercName(mercName);
+            }
+            pageData.setRecords(records);
+        }
+        return R.ok(pageData);
+    }
+
+    /**
+     * 确认佣金
+     *
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public R confirm(MercFeeCountMonthDto.ConfirmDTO dto) {
+        Long id = dto.getId();
+        Long parentMercId = dto.getParentMercId();
+        MercFeeCountMonth countMonth = getOne(Wrappers.<MercFeeCountMonth>lambdaQuery()
+                .eq(MercFeeCountMonth::getParentMercId, parentMercId)
+                .eq(MercFeeCountMonth::getId, id)
+        );
+        if (countMonth != null) {
+            //确认
+            countMonth.setVerify(true);
+            countMonth.setVerifyTime(LocalDateTime.now());
+            updateById(countMonth);
+            //确认后,更新统计表
+            MercFeeStatistic mercFeeStatistic = mercFeeStatisticService.getByMercId(parentMercId);
+            //更新确认金额,可结算金额
+            mercFeeStatistic.setVerifyMoney(mercFeeStatistic.getVerifyMoney() + countMonth.getBrokerage());
+            mercFeeStatistic.setUnSettleMoney(mercFeeStatistic.getUnSettleMoney() + countMonth.getBrokerage());
+            mercFeeStatisticService.updateById(mercFeeStatistic);
+        }
+        return R.ok();
     }
 
     @PostMapping("save")
@@ -82,4 +149,4 @@ public class MercFeeCountMonthServiceImpl extends ServiceImpl<MercFeeCountMonthM
         updateById(updateInfo);
         return R.ok();
     }
-}
+}

+ 50 - 24
device-api-service/src/main/java/com/xy/service/MercFeeSettleServiceImpl.java

@@ -1,25 +1,26 @@
 package com.xy.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xy.dto.MercFeeSettleDto;
 import com.xy.entity.MercFeeSettle;
 import com.xy.mapper.MercFeeSettleMapper;
-import com.xy.service.MercFeeSettleService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
+import com.xy.utils.Emptys;
+import com.xy.utils.MybatisPlusQuery;
+import com.xy.utils.PageBean;
+import com.xy.utils.R;
+import com.xy.utils.enums.MercFeeSettleSate;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
+import java.time.LocalDateTime;
 import java.util.List;
-import com.xy.utils.R;
-import com.xy.utils.PageBean;
-import com.xy.dto.MercFeeSettleDto;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.PostMapping;
-import io.swagger.annotations.ApiOperation;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.xy.utils.MybatisPlusQuery;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springframework.validation.annotation.Validated;
-import com.xy.utils.Emptys;
 
 import static com.xy.utils.Beans.copy;
 import static com.xy.utils.PlusBeans.toIPage;
@@ -27,13 +28,13 @@ import static com.xy.utils.PlusBeans.toPageBean;
 
 
 /**
-* <p>
-* 商户佣金费用结算 服务实现类
-* </p>
-*
-* @author 谭斌
-* @since 2024-04-23
-*/
+ * <p>
+ * 商户佣金费用结算 服务实现类
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-04-23
+ */
 @Service
 @AllArgsConstructor
 @Api(tags = "商户佣金费用结算")
@@ -44,7 +45,7 @@ public class MercFeeSettleServiceImpl extends ServiceImpl<MercFeeSettleMapper, M
     public R<MercFeeSettleDto.Vo> obj(@RequestBody MercFeeSettleDto.Vo vo) {
         MercFeeSettleDto.SelectList selectList = copy(MercFeeSettleDto.SelectList.class, vo);
         List<MercFeeSettleDto.Vo> list = list(selectList).getData();
-        if(Emptys.check(list)) {
+        if (Emptys.check(list)) {
             return R.ok(list.get(0));
         }
         return R.ok();
@@ -59,7 +60,7 @@ public class MercFeeSettleServiceImpl extends ServiceImpl<MercFeeSettleMapper, M
     }
 
     @PostMapping("page")
-    @ApiOperation("分页查询")
+    @ApiOperation("平台运营-佣金结算记录")
     public R<PageBean<MercFeeSettleDto.Vo>> page(@RequestBody MercFeeSettleDto.Page page) {
         PageBean pageBean = page.getPage();
         LambdaQueryWrapper<MercFeeSettle> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, MercFeeSettle.class).build();
@@ -67,6 +68,7 @@ public class MercFeeSettleServiceImpl extends ServiceImpl<MercFeeSettleMapper, M
         return R.ok(toPageBean(MercFeeSettleDto.Vo.class, iPage));
     }
 
+
     @PostMapping("save")
     @ApiOperation("添加")
     public R save(@RequestBody @Validated MercFeeSettleDto.Save save) {
@@ -75,6 +77,30 @@ public class MercFeeSettleServiceImpl extends ServiceImpl<MercFeeSettleMapper, M
         return R.ok();
     }
 
+    @PostMapping("doSettle")
+    @ApiOperation("运营端结算完成操作")
+    public R doSettle(@RequestBody @Validated MercFeeSettleDto.DoSettle update) {
+        List<Long> ids = update.getIds();
+        List<MercFeeSettle> mercFeeSettles = this.listByIds(ids);
+        mercFeeSettles.forEach(mfs -> {
+            mfs.setSettleState(MercFeeSettleSate.S3.getCode());
+            mfs.setFinishSettleTime(LocalDateTime.now());
+        });
+        return R.ok(updateBatchById(mercFeeSettles));
+    }
+
+    /**
+     * 结算申请
+     *
+     * @param dto
+     * @return
+     */
+    public R<Boolean> applySettle(MercFeeSettleDto.ApplyDTO dto) {
+        MercFeeSettle saveInfo = copy(MercFeeSettle.class, dto);
+        saveInfo.setSettleState(MercFeeSettleSate.S2.getCode());
+        return R.ok(save(saveInfo));
+    }
+
     @PostMapping("update")
     @ApiOperation("修改")
     public R update(@RequestBody @Validated MercFeeSettleDto.Update update) {
@@ -82,4 +108,4 @@ public class MercFeeSettleServiceImpl extends ServiceImpl<MercFeeSettleMapper, M
         updateById(updateInfo);
         return R.ok();
     }
-}
+}

+ 133 - 0
device-api-service/src/main/java/com/xy/service/MercFeeStatisticServiceImpl.java

@@ -0,0 +1,133 @@
+package com.xy.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xy.dto.MercFeeSettleDto;
+import com.xy.dto.MercFeeStatisticDto;
+import com.xy.entity.MercFeeStatistic;
+import com.xy.mapper.MercFeeStatisticMapper;
+import com.xy.utils.Emptys;
+import com.xy.utils.MybatisPlusQuery;
+import com.xy.utils.PageBean;
+import com.xy.utils.R;
+import com.xy.utils.enums.MercFeeSettleSate;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+import static com.xy.utils.Beans.copy;
+import static com.xy.utils.PlusBeans.toIPage;
+import static com.xy.utils.PlusBeans.toPageBean;
+
+
+/**
+ * <p>
+ * 商户佣金费用统计 服务实现类
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-04-24
+ */
+@Service
+@AllArgsConstructor
+@Api(tags = "商户佣金费用统计")
+public class MercFeeStatisticServiceImpl extends ServiceImpl<MercFeeStatisticMapper, MercFeeStatistic> implements MercFeeStatisticService {
+
+    private MercFeeSettleServiceImpl mercFeeSettleService;
+
+    /**
+     * 收益总览
+     *
+     * @param mercId
+     * @return
+     */
+    public R<MercFeeStatisticDto.InFoVO> info(Long mercId) {
+        MercFeeStatistic mercFeeStatistic = getByMercId(mercId);
+        MercFeeStatisticDto.InFoVO inFoVO = BeanUtil.copyProperties(mercFeeStatistic, MercFeeStatisticDto.InFoVO.class);
+        //结算中金额
+        int settlingMoney = 0;
+        MercFeeSettleDto.SelectList selectList = new MercFeeSettleDto.SelectList();
+        selectList.setMercId(mercId);
+        selectList.setSettleState(MercFeeSettleSate.S2.getCode());
+        List<MercFeeSettleDto.Vo> list = R.feignCheckData(mercFeeSettleService.list(selectList));
+        if (CollUtil.isNotEmpty(list)) {
+            settlingMoney = list.stream().mapToInt(MercFeeSettleDto.Vo::getSettleMoney).sum();
+        }
+        inFoVO.setSettlingMoney(settlingMoney);
+        return R.ok(inFoVO);
+    }
+
+
+    @PostMapping("obj")
+    @ApiOperation("对象查询")
+    public R<MercFeeStatisticDto.Vo> obj(@RequestBody MercFeeStatisticDto.Vo vo) {
+        MercFeeStatisticDto.SelectList selectList = copy(MercFeeStatisticDto.SelectList.class, vo);
+        List<MercFeeStatisticDto.Vo> list = list(selectList).getData();
+        if (Emptys.check(list)) {
+            return R.ok(list.get(0));
+        }
+        return R.ok();
+    }
+
+    /**
+     * 获取商户统计数据,不存在则初始化新增
+     *
+     * @param mercId
+     * @return
+     */
+    public MercFeeStatistic getByMercId(Long mercId) {
+        MercFeeStatistic mercFeeStatistic = this.getById(mercId);
+        if (mercFeeStatistic == null) {
+            MercFeeStatistic newObj = new MercFeeStatistic()
+                    .setMercId(mercId)
+                    .setSettleMoney(0)
+                    .setUnSettleMoney(0)
+                    .setVerifyMoney(0);
+            save(newObj);
+            mercFeeStatistic = newObj;
+        }
+        return mercFeeStatistic;
+    }
+
+    @PostMapping("list")
+    @ApiOperation("集合查询")
+    public R<List<MercFeeStatisticDto.Vo>> list(@RequestBody MercFeeStatisticDto.SelectList selectList) {
+        LambdaQueryWrapper<MercFeeStatistic> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, MercFeeStatistic.class).build();
+        List<MercFeeStatistic> list = list(lambdaQueryWrapper);
+        return R.ok(copy(MercFeeStatisticDto.Vo.class, list));
+    }
+
+    @PostMapping("page")
+    @ApiOperation("分页查询")
+    public R<PageBean<MercFeeStatisticDto.Vo>> page(@RequestBody MercFeeStatisticDto.Page page) {
+        PageBean pageBean = page.getPage();
+        LambdaQueryWrapper<MercFeeStatistic> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, MercFeeStatistic.class).build();
+        IPage<MercFeeStatistic> iPage = page(toIPage(pageBean), lambdaQueryWrapper);
+        return R.ok(toPageBean(MercFeeStatisticDto.Vo.class, iPage));
+    }
+
+    @PostMapping("save")
+    @ApiOperation("添加")
+    public R save(@RequestBody @Validated MercFeeStatisticDto.Save save) {
+        MercFeeStatistic saveInfo = copy(MercFeeStatistic.class, save);
+        save(saveInfo);
+        return R.ok();
+    }
+
+    @PostMapping("update")
+    @ApiOperation("修改")
+    public R update(@RequestBody @Validated MercFeeStatisticDto.Update update) {
+        MercFeeStatistic updateInfo = copy(MercFeeStatistic.class, update);
+        updateById(updateInfo);
+        return R.ok();
+    }
+}

+ 28 - 1
device-api/src/main/java/com/xy/dto/MercFeeCountMonthDto.java

@@ -7,6 +7,7 @@ import lombok.Data;
 import lombok.experimental.Accessors;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
 
 /**
@@ -36,12 +37,32 @@ public class MercFeeCountMonthDto {
     @Data
     @Accessors(chain = true)
     public static class Page extends Vo {
+        @ApiModelProperty(value = "月份-起")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime beginTime;
+
+        @ApiModelProperty(value = "月份-止")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime endTime;
 
         @ApiModelProperty(value = "分页对象", required = true)
         private PageBean page;
 
     }
 
+    @Data
+    @Accessors(chain = true)
+    public static class ConfirmDTO {
+        @NotNull(message = "确认对象不可为空!")
+        @ApiModelProperty(value = "ID", required = true)
+        private Long id;
+
+        @ApiModelProperty(value = "父商户ID", hidden = true)
+        private Long parentMercId;
+
+
+    }
+
     @Data
     @Accessors(chain = true)
     public static class Save extends Vo {
@@ -64,6 +85,12 @@ public class MercFeeCountMonthDto {
         @ApiModelProperty(value = "商户ID")
         private Long mercId;
 
+        @ApiModelProperty(value = "商户名称")
+        private String mercName;
+
+        @ApiModelProperty(value = "父商户ID")
+        private Long parentMercId;
+
 
         @ApiModelProperty(value = "统计日期202206")
         private Integer dateValue;
@@ -74,7 +101,7 @@ public class MercFeeCountMonthDto {
         @ApiModelProperty(value = "佣金")
         private Integer brokerage;
 
-        @ApiModelProperty(value = "缴费类型")
+        @ApiModelProperty(value = "缴费类型;字典-merc_fee_type")
         private Integer feeType;
 
         @ApiModelProperty(value = "创建时间")

+ 29 - 0
device-api/src/main/java/com/xy/dto/MercFeeSettleDto.java

@@ -6,7 +6,10 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * <p>
@@ -33,12 +36,38 @@ public class MercFeeSettleDto {
 
     }
 
+    @Data
+    @Accessors(chain = true)
+    public static class ApplyDTO {
+
+        @ApiModelProperty(value = "商户ID", hidden = true)
+        private Long mercId;
+
+        @NotNull(message = "结算金额不可为空")
+        @ApiModelProperty(value = "结算金额")
+        private Integer settleMoney;
+
+        @ApiModelProperty(value = "发票图片(最多支持4个,|分隔)")
+        private String titleImg;
+    }
+
+
     @Data
     @Accessors(chain = true)
     public static class Save extends Vo {
 
     }
 
+    @Data
+    @Accessors(chain = true)
+    public static class DoSettle {
+        @NotEmpty(message = "未选择操作对象")
+        @ApiModelProperty(value = "ids")
+        private List<Long> ids;
+
+    }
+
+
     @Data
     @Accessors(chain = true)
     public static class Update extends Vo {

+ 97 - 0
device-api/src/main/java/com/xy/dto/MercFeeStatisticDto.java

@@ -0,0 +1,97 @@
+package com.xy.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xy.utils.PageBean;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 商户佣金费用统计
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-04-24
+ */
+public class MercFeeStatisticDto {
+
+    @Data
+    @Accessors(chain = true)
+    public static class SelectList extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Page extends Vo {
+
+        @ApiModelProperty(value = "分页对象", required = true)
+        private PageBean page;
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Save extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Update extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Vo {
+
+        @ApiModelProperty(value = "商户ID")
+        private Long mercId;
+
+        @ApiModelProperty(value = "累计已结算佣金")
+        private Integer settleMoney;
+
+        @ApiModelProperty(value = "可结算佣金")
+        private Integer unSettleMoney;
+
+        @ApiModelProperty(value = "累计已确认佣金")
+        private Integer verifyMoney;
+
+        @ApiModelProperty(value = "创建时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime createTime;
+
+        @ApiModelProperty(value = "更新时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime updateTime;
+
+
+    }
+
+
+    @Data
+    @Accessors(chain = true)
+    public static class InFoVO {
+
+        @ApiModelProperty(value = "商户ID")
+        private Long mercId;
+
+        @ApiModelProperty(value = "累计已结算佣金")
+        private Integer settleMoney;
+
+        @ApiModelProperty(value = "可结算佣金")
+        private Integer unSettleMoney;
+
+        @ApiModelProperty(value = "累计已确认佣金")
+        private Integer verifyMoney;
+
+        @ApiModelProperty(value = "结算中金额")
+        private Integer settlingMoney;
+
+    }
+
+}

+ 16 - 0
device-api/src/main/java/com/xy/service/MercFeeStatisticService.java

@@ -0,0 +1,16 @@
+package com.xy.service;
+
+import com.xy.annotate.RestMappingController;
+
+/**
+ * <p>
+ * 商户佣金费用统计 服务类
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-04-24
+ */
+@RestMappingController("/merc-fee-statistic")
+public interface MercFeeStatisticService {
+
+}

+ 48 - 0
device-api/src/main/java/com/xy/utils/enums/MercFeeSettleSate.java

@@ -0,0 +1,48 @@
+package com.xy.utils.enums;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.ToString;
+
+/**
+ * 佣金费用结算状态 (1 未结算、结算中、2 已结算)
+ */
+@Getter
+@ToString
+@AllArgsConstructor
+public enum MercFeeSettleSate {
+
+
+    S1(1, "未结算"),
+    S2(2, "结算中"),
+    S3(3, "已结算"),
+    ;
+
+    /**
+     * 编码值
+     */
+    private Integer code;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+
+    /**
+     * 通过code获取enum
+     *
+     * @param code
+     * @return
+     */
+    public static MercFeeSettleSate getEnumByCode(Integer code) {
+        MercFeeSettleSate[] values = values();
+        for (MercFeeSettleSate value : values) {
+            if (value.getCode().equals(code)) {
+                return value;
+            }
+        }
+        return null;
+    }
+}