瀏覽代碼

快递期末余额汇总

yzc 11 月之前
父節點
當前提交
b7832d9ba0

+ 35 - 0
hx-common/src/main/java/com/fjhx/common/controller/logistics/LogisticsEndingAmountController.java

@@ -0,0 +1,35 @@
+package com.fjhx.common.controller.logistics;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.common.entity.logistics.dto.LogisticsEndingAmountSelectDto;
+import com.fjhx.common.service.logistics.LogisticsEndingAmountService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 物流期末余额 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2024-05-06
+ */
+@RestController
+@RequestMapping("/logisticsEndingAmount")
+public class LogisticsEndingAmountController {
+
+    @Autowired
+    private LogisticsEndingAmountService logisticsEndingAmountService;
+
+    @PostMapping("/logisticsRechargeSummary")
+    List<JSONObject> logisticsRechargeSummary(@RequestBody LogisticsEndingAmountSelectDto dto) {
+        return logisticsEndingAmountService.logisticsRechargeSummary(dto);
+    }
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/logistics/dto/LogisticsEndingAmountDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.logistics.dto;
+
+import com.fjhx.common.entity.logistics.po.LogisticsEndingAmount;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 物流期末余额新增编辑入参实体
+ *
+ * @author
+ * @since 2024-05-06
+ */
+@Getter
+@Setter
+public class LogisticsEndingAmountDto extends LogisticsEndingAmount {
+
+}

+ 21 - 0
hx-common/src/main/java/com/fjhx/common/entity/logistics/dto/LogisticsEndingAmountSelectDto.java

@@ -0,0 +1,21 @@
+package com.fjhx.common.entity.logistics.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 物流期末余额列表查询入参实体
+ *
+ * @author
+ * @since 2024-05-06
+ */
+@Getter
+@Setter
+public class LogisticsEndingAmountSelectDto extends BaseSelectDto {
+
+    /**
+     * 年份过滤
+     */
+    private int year;
+}

+ 44 - 0
hx-common/src/main/java/com/fjhx/common/entity/logistics/po/LogisticsEndingAmount.java

@@ -0,0 +1,44 @@
+package com.fjhx.common.entity.logistics.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 物流期末余额
+ * </p>
+ *
+ * @author
+ * @since 2024-05-06
+ */
+@Getter
+@Setter
+@TableName("logistics_ending_amount")
+public class LogisticsEndingAmount extends BasePo {
+
+    /**
+     * 物流公司id
+     */
+    private Long logisticsCompanyId;
+
+    /**
+     * 帐期
+     */
+    private Date accountDate;
+
+    /**
+     * 期末余额
+     */
+    private BigDecimal endingBalance;
+
+    /**
+     * 期末应付款余额
+     */
+    private BigDecimal endingPayableBalance;
+
+}

+ 31 - 0
hx-common/src/main/java/com/fjhx/common/entity/logistics/vo/LogisticsEndingAmountVo.java

@@ -0,0 +1,31 @@
+package com.fjhx.common.entity.logistics.vo;
+
+import com.fjhx.common.entity.logistics.po.LogisticsEndingAmount;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 物流期末余额列表查询返回值实体
+ *
+ * @author
+ * @since 2024-05-06
+ */
+@Getter
+@Setter
+public class LogisticsEndingAmountVo extends LogisticsEndingAmount {
+    /**
+     * 预付金额
+     */
+    private BigDecimal advanceAmount;
+    /**
+     * 抵扣金额
+     */
+    private BigDecimal deductionAmount;
+
+    /**
+     * 账期月份
+     */
+    private Integer accountPeriodMonth;
+}

+ 23 - 0
hx-common/src/main/java/com/fjhx/common/mapper/logistics/LogisticsEndingAmountMapper.java

@@ -0,0 +1,23 @@
+package com.fjhx.common.mapper.logistics;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.common.entity.logistics.dto.LogisticsEndingAmountSelectDto;
+import com.fjhx.common.entity.logistics.po.LogisticsEndingAmount;
+import com.fjhx.common.entity.logistics.vo.LogisticsEndingAmountVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 物流期末余额 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2024-05-06
+ */
+public interface LogisticsEndingAmountMapper extends BaseMapper<LogisticsEndingAmount> {
+
+    List<LogisticsEndingAmountVo> logisticsRechargeSummary(@Param("dto") LogisticsEndingAmountSelectDto dto);
+}

+ 22 - 0
hx-common/src/main/java/com/fjhx/common/service/logistics/LogisticsEndingAmountService.java

@@ -0,0 +1,22 @@
+package com.fjhx.common.service.logistics;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.common.entity.logistics.dto.LogisticsEndingAmountSelectDto;
+import com.fjhx.common.entity.logistics.po.LogisticsEndingAmount;
+import com.ruoyi.common.core.service.BaseService;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 物流期末余额 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-05-06
+ */
+public interface LogisticsEndingAmountService extends BaseService<LogisticsEndingAmount> {
+
+    List<JSONObject> logisticsRechargeSummary(LogisticsEndingAmountSelectDto dto);
+}

+ 151 - 0
hx-common/src/main/java/com/fjhx/common/service/logistics/impl/LogisticsEndingAmountServiceImpl.java

@@ -0,0 +1,151 @@
+package com.fjhx.common.service.logistics.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.entity.logistics.dto.LogisticsEndingAmountSelectDto;
+import com.fjhx.common.entity.logistics.po.LogisticsCompanyInfo;
+import com.fjhx.common.entity.logistics.po.LogisticsEndingAmount;
+import com.fjhx.common.entity.logistics.vo.LogisticsEndingAmountVo;
+import com.fjhx.common.mapper.logistics.LogisticsEndingAmountMapper;
+import com.fjhx.common.service.logistics.LogisticsCompanyInfoService;
+import com.fjhx.common.service.logistics.LogisticsEndingAmountService;
+import com.ruoyi.common.utils.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+
+/**
+ * <p>
+ * 物流期末余额 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-05-06
+ */
+@Service
+public class LogisticsEndingAmountServiceImpl extends ServiceImpl<LogisticsEndingAmountMapper, LogisticsEndingAmount> implements LogisticsEndingAmountService {
+
+    @Autowired
+    private LogisticsCompanyInfoService logisticsCompanyInfoService;
+
+    /**
+     * 每月1日0点1分 赋值上月期末余额
+     */
+    @PostConstruct
+    @Scheduled(cron = "0 1 0 1 * ?")
+    public void autoSaveEndingAmount() {
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        SecurityUtils.setTenantId("000000");
+        DateTime lastMonth = DateUtil.offsetMonth(new Date(), -1);
+        int year = DateUtil.year(lastMonth);
+        int month = DateUtil.month(lastMonth) + 1;
+
+        LogisticsEndingAmountSelectDto dto = new LogisticsEndingAmountSelectDto();
+        dto.setYear(year);
+
+        List<JSONObject> jsonObjects = logisticsRechargeSummary(dto);
+        for (JSONObject json : jsonObjects) {
+            Long logisticsCompanyId = json.getLong("id");
+            LogisticsEndingAmountVo logisticsEndingAmountVo = json.getObject("" + month, LogisticsEndingAmountVo.class);
+
+            //更新期末余额
+            String format = StrUtil.format("{}-{}", year, month);
+            LogisticsEndingAmount one = this.getOne(q -> q
+                    .eq(LogisticsEndingAmount::getLogisticsCompanyId, logisticsCompanyId)
+                    .apply("DATE_FORMAT(account_date,'%Y-%m') = {0}", format)
+            );
+            if (ObjectUtil.isEmpty(one)) {
+                one = new LogisticsEndingAmount();
+                one.setLogisticsCompanyId(logisticsCompanyId);
+                one.setAccountDate(DateUtil.parse(format, "yyyy-MM"));
+                one.setEndingBalance(BigDecimal.ZERO);
+            }
+
+            //赋值期末余额
+            BigDecimal endingBalance = logisticsEndingAmountVo.getEndingBalance();
+            if (ObjectUtil.isEmpty(endingBalance)) {
+                endingBalance = BigDecimal.ZERO;
+            }
+            one.setEndingBalance(endingBalance);
+
+            this.saveOrUpdate(one);
+        }
+        SecurityUtils.clearTenantId();
+        DynamicDataSourceContextHolder.clear();
+    }
+
+    @Override
+    public List<JSONObject> logisticsRechargeSummary(LogisticsEndingAmountSelectDto dto) {
+        List<JSONObject> outList = new ArrayList<>();
+
+        //默认赋值年
+        if (ObjectUtil.isEmpty(dto.getYear())) {
+            dto.setYear(DateUtil.year(new Date()));
+        }
+
+        List<LogisticsEndingAmountVo> logisticsRechargeSummaryBos = baseMapper.logisticsRechargeSummary(dto);
+        Map<Long, List<LogisticsEndingAmountVo>> logisticsRechargeMap = logisticsRechargeSummaryBos.stream()
+                .collect(Collectors.groupingBy(LogisticsEndingAmountVo::getLogisticsCompanyId));
+
+        List<LogisticsCompanyInfo> list = logisticsCompanyInfoService.list();
+
+
+        for (LogisticsCompanyInfo logisticsCompanyInfo : list) {
+            JSONObject logisticsCompanyInfoJson = JSONObject.parseObject(JSONObject.toJSONString(logisticsCompanyInfo));
+            //赋值年初余额
+            BigDecimal yearBeginBalance = BigDecimal.ZERO;
+            String lastYearEndMonth = StrUtil.format("{}-12", dto.getYear() - 1);
+            LogisticsEndingAmount lastYearEndAmount = this.getOne(q -> q
+                    .eq(LogisticsEndingAmount::getLogisticsCompanyId, logisticsCompanyInfo.getId())
+                    .apply("DATE_FORMAT(account_date,'%Y-%m') = {0}", lastYearEndMonth)
+            );
+            if (ObjectUtil.isNotEmpty(lastYearEndAmount)) {
+                yearBeginBalance = lastYearEndAmount.getEndingBalance();
+            }
+            logisticsCompanyInfoJson.put("yearBeginBalance", yearBeginBalance);
+
+            //上一期末余额
+            BigDecimal lastEndingBalance = yearBeginBalance;
+
+            //赋值每一个月信息
+            List<LogisticsEndingAmountVo> list1 = logisticsRechargeMap.getOrDefault(logisticsCompanyInfo.getId(), new ArrayList<>());
+            Map<Integer, LogisticsEndingAmountVo> collect = list1.stream().collect(Collectors.toMap(LogisticsEndingAmountVo::getAccountPeriodMonth, Function.identity()));
+            for (int i = 1; i <= 12; i++) {
+                LogisticsEndingAmountVo logisticsRecharge = collect.getOrDefault(i, new LogisticsEndingAmountVo());
+                BigDecimal advanceAmount = logisticsRecharge.getAdvanceAmount();
+                if (advanceAmount == null) {
+                    advanceAmount = BigDecimal.ZERO;
+                }
+                BigDecimal deductionAmount = logisticsRecharge.getDeductionAmount();
+                if (deductionAmount == null) {
+                    deductionAmount = BigDecimal.ZERO;
+                }
+
+                //期末余额 = 期初余额 + 预付 - 抵扣
+                logisticsRecharge.setEndingBalance(lastEndingBalance.add(advanceAmount).subtract(deductionAmount));
+
+                logisticsCompanyInfoJson.put("" + i, logisticsRecharge);
+            }
+
+            outList.add(logisticsCompanyInfoJson);
+        }
+
+        return outList;
+    }
+}

+ 21 - 0
hx-common/src/main/resources/mapper/logistics/LogisticsEndingAmountMapper.xml

@@ -0,0 +1,21 @@
+<?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.fjhx.common.mapper.logistics.LogisticsEndingAmountMapper">
+    <select id="logisticsRechargeSummary"
+            resultType="com.fjhx.common.entity.logistics.vo.LogisticsEndingAmountVo">
+        SELECT cod.logistics_company_id, MONTH ( ap.expenses_time ) AS accountPeriodMonth, sum ( IF ( cc.is_advance = 1, cod.current_payable, 0 ) ) AS advanceAmount, sum ( IF ( cc.is_public_transfer = 1, cod.deduction_prepaid_tax, cod.deduction_prepaid )) AS deductionAmount
+        FROM
+            cost_control cc
+            JOIN payment_type pt
+        ON cc.cost_type = pt.id
+            JOIN cost_control_detail cod ON cod.cost_control_id = cc.id
+            JOIN account_payment ap ON ap.cost_control_id = cc.id
+        WHERE
+            pt.`name` LIKE '快递%'
+          AND ap.`status` != 20
+          AND YEAR ( ap.expenses_time ) = YEAR ( CURRENT_DATE )
+        GROUP BY
+            cod.logistics_company_id,
+            MONTH ( ap.expenses_time );
+    </select>
+</mapper>