浏览代码

供应商应付账款汇总

yzc 10 月之前
父节点
当前提交
e9c562d76e

+ 40 - 0
hx-form/src/main/java/com/fjhx/form/MyMergeStrategy.java

@@ -0,0 +1,40 @@
+package com.fjhx.form;
+
+import com.alibaba.excel.write.handler.RowWriteHandler;
+import com.alibaba.excel.write.handler.context.RowWriteHandlerContext;
+import org.apache.poi.ss.util.CellRangeAddress;
+
+import java.util.List;
+import java.util.Map;
+
+//	@Data
+//	@AllArgsConstructor
+public class MyMergeStrategy implements RowWriteHandler {
+
+    // 合并的起始行:key:开始,value;结束
+    private Map<Integer, Integer> map;
+
+    // 要合并的列
+    private List<Integer> cols;
+
+    public MyMergeStrategy(Map<Integer, Integer> mapMerge, List<Integer> asList) {
+        map = mapMerge;
+        cols = asList;
+    }
+
+    @Override
+    public void afterRowDispose(RowWriteHandlerContext context) {
+        // 如果是head或者当前行不是合并的起始行,跳过
+        if (context.getHead() || !map.containsKey(context.getRowIndex())) {
+            return;
+        }
+        Integer endrow = map.get(context.getRowIndex());
+        if (!context.getRowIndex().equals(endrow)) {
+            // 编列合并的列,合并行
+            for (Integer col : cols) {
+                // CellRangeAddress(起始行,结束行,起始列,结束列)
+                context.getWriteSheetHolder().getSheet().addMergedRegionUnsafe(new CellRangeAddress(context.getRowIndex(), endrow, col, col));
+            }
+        }
+    }
+}

+ 13 - 4
hx-form/src/main/java/com/fjhx/form/controller/FinanceReportController.java

@@ -2,10 +2,7 @@ package com.fjhx.form.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.account.entity.account.dto.AccountRunningWaterDto;
-import com.fjhx.form.entity.RemitDetailSelectDto;
-import com.fjhx.form.entity.RemitDetailVo;
-import com.fjhx.form.entity.SubjectBalanceBo;
-import com.fjhx.form.entity.SubjectBalanceSelectDto;
+import com.fjhx.form.entity.*;
 import com.fjhx.form.service.FinanceReportService;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.enums.BusinessType;
@@ -46,4 +43,16 @@ public class FinanceReportController {
     public void editRemitDetail(@RequestBody AccountRunningWaterDto dto) {
         financeReportService.editRemitDetail(dto);
     }
+
+    @PostMapping("/accountsPayablePage")
+    Page<AccountsPayableVo> getAccountsPayablePage(@RequestBody AccountsPayableSelectDto dto) {
+        return financeReportService.getAccountsPayablePage(dto);
+    }
+
+    @Log(title = "应付账款汇总", businessType = BusinessType.EXPORT)
+    @PostMapping("/accountsPayableExportExcel")
+    public void excelExport(HttpServletResponse httpServletResponse, @RequestBody AccountsPayableSelectDto dto) {
+        financeReportService.accountsPayableExportExcel(httpServletResponse, dto);
+    }
+
 }

+ 35 - 0
hx-form/src/main/java/com/fjhx/form/controller/payable/PayableBalanceController.java

@@ -0,0 +1,35 @@
+package com.fjhx.form.controller.payable;
+
+import com.fjhx.form.entity.payable.dto.PayableBalanceDto;
+import com.fjhx.form.service.payable.PayableBalanceService;
+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;
+
+
+/**
+ * <p>
+ * 应付帐款余额 前端控制器
+ * </p>
+ *
+ * @author _
+ * @since 2024-06-04
+ */
+@RestController
+@RequestMapping("/payableBalance")
+public class PayableBalanceController {
+
+    private final PayableBalanceService payableBalanceService;
+
+    public PayableBalanceController(PayableBalanceService payableBalanceService) {
+        this.payableBalanceService = payableBalanceService;
+    }
+
+
+    @PostMapping("/edit")
+    public void edit(@RequestBody PayableBalanceDto dto) {
+        payableBalanceService.edit(dto);
+    }
+
+}

+ 11 - 0
hx-form/src/main/java/com/fjhx/form/entity/AccountsPayableSelectDto.java

@@ -0,0 +1,11 @@
+package com.fjhx.form.entity;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class AccountsPayableSelectDto extends BaseSelectDto {
+    private Integer year;
+}

+ 76 - 0
hx-form/src/main/java/com/fjhx/form/entity/AccountsPayableVo.java

@@ -0,0 +1,76 @@
+package com.fjhx.form.entity;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class AccountsPayableVo {
+    /**
+     * 字符串id
+     */
+    private String idStr;
+    /**
+     * 供应商id
+     */
+    private Long supplierId;
+    private String supplierName;
+    private String supplierShortName;
+    private String supplierTaxPoints;
+    /**
+     * 仓库id
+     */
+    private Long warehouseId;
+    private String warehouseName;
+    /**
+     * 年初余额
+     */
+    private BigDecimal yearBeginBalance;
+    /**
+     * 月数据
+     */
+    @JsonIgnore
+    private String dataJson;
+    private JSONObject monthData;
+    /**
+     * 备注
+     */
+    private String remark;
+
+    @Getter
+    @Setter
+    public static class MonthDataVo {
+        /**
+         * 到货金额
+         */
+        private BigDecimal arrivalAmount;
+        /**
+         * 到货调整金额
+         */
+        private BigDecimal arrivalAdjustAmount;
+        /**
+         * 退货金额
+         */
+        private BigDecimal backAmount;
+        /**
+         * 税费
+         */
+        private BigDecimal taxAmount;
+        /**
+         * 税费调整
+         */
+        private BigDecimal taxAdjustAmount;
+        /**
+         * 付款金额
+         */
+        private BigDecimal paymentAmount;
+        /**
+         * 期末金额
+         */
+        private BigDecimal endAmount;
+    }
+}

+ 17 - 0
hx-form/src/main/java/com/fjhx/form/entity/payable/dto/PayableBalanceDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.form.entity.payable.dto;
+
+import com.fjhx.form.entity.payable.po.PayableBalance;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 应付帐款余额新增编辑入参实体
+ *
+ * @author
+ * @since 2024-06-04
+ */
+@Getter
+@Setter
+public class PayableBalanceDto extends PayableBalance {
+
+}

+ 17 - 0
hx-form/src/main/java/com/fjhx/form/entity/payable/dto/PayableBalanceSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.form.entity.payable.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 应付帐款余额列表查询入参实体
+ *
+ * @author
+ * @since 2024-06-04
+ */
+@Getter
+@Setter
+public class PayableBalanceSelectDto extends BaseSelectDto {
+
+}

+ 70 - 0
hx-form/src/main/java/com/fjhx/form/entity/payable/po/PayableBalance.java

@@ -0,0 +1,70 @@
+package com.fjhx.form.entity.payable.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 应付帐款余额
+ * </p>
+ *
+ * @author
+ * @since 2024-06-04
+ */
+@Getter
+@Setter
+@TableName("payable_balance")
+public class PayableBalance extends BaseIdPo {
+
+    /**
+     * 字符串id_供应商id-仓库id
+     */
+    private String idStr;
+
+    /**
+     * 年份
+     */
+    private Integer year;
+
+    /**
+     * 期末余额
+     */
+    private BigDecimal endBalance;
+
+    /**
+     * 税费调整
+     */
+    private BigDecimal month1TaxAdjust;
+
+    private BigDecimal month2TaxAdjust;
+
+    private BigDecimal month3TaxAdjust;
+
+    private BigDecimal month4TaxAdjust;
+
+    private BigDecimal month5TaxAdjust;
+
+    private BigDecimal month6TaxAdjust;
+
+    private BigDecimal month7TaxAdjust;
+
+    private BigDecimal month8TaxAdjust;
+
+    private BigDecimal month9TaxAdjust;
+
+    private BigDecimal month10TaxAdjust;
+
+    private BigDecimal month11TaxAdjust;
+
+    private BigDecimal month12TaxAdjust;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 17 - 0
hx-form/src/main/java/com/fjhx/form/entity/payable/vo/PayableBalanceVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.form.entity.payable.vo;
+
+import com.fjhx.form.entity.payable.po.PayableBalance;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 应付帐款余额列表查询返回值实体
+ *
+ * @author
+ * @since 2024-06-04
+ */
+@Getter
+@Setter
+public class PayableBalanceVo extends PayableBalance {
+
+}

+ 6 - 0
hx-form/src/main/java/com/fjhx/form/mapper/FinanceReportMapper.java

@@ -1,6 +1,7 @@
 package com.fjhx.form.mapper;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.form.entity.AccountsPayableVo;
 import com.fjhx.form.entity.RemitDetailVo;
 import com.fjhx.form.entity.SubjectBalanceBo;
 import com.fjhx.form.entity.SubjectBalanceSelectDto;
@@ -22,4 +23,9 @@ public interface FinanceReportMapper {
 
     List<RemitDetailVo> getRemitDetailPage(@Param("ew") IWrapper<Object> wrapper);
 
+    Page<AccountsPayableVo> getAccountsPayablePage(@Param("page") Page<Object> page, @Param("ew") IWrapper<Object> wrapper, @Param("year") Integer yaar);
+
+    List<AccountsPayableVo> getAccountsPayablePage(@Param("ew") IWrapper<Object> wrapper, @Param("year") Integer yaar);
+
+
 }

+ 17 - 0
hx-form/src/main/java/com/fjhx/form/mapper/payable/PayableBalanceMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.form.mapper.payable;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.form.entity.payable.po.PayableBalance;
+
+
+/**
+ * <p>
+ * 应付帐款余额 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2024-06-04
+ */
+public interface PayableBalanceMapper extends BaseMapper<PayableBalance> {
+
+}

+ 11 - 4
hx-form/src/main/java/com/fjhx/form/service/FinanceReportService.java

@@ -2,10 +2,7 @@ package com.fjhx.form.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.account.entity.account.dto.AccountRunningWaterDto;
-import com.fjhx.form.entity.RemitDetailSelectDto;
-import com.fjhx.form.entity.RemitDetailVo;
-import com.fjhx.form.entity.SubjectBalanceBo;
-import com.fjhx.form.entity.SubjectBalanceSelectDto;
+import com.fjhx.form.entity.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
@@ -24,4 +21,14 @@ public interface FinanceReportService {
      * 汇款明细数据修改
      */
     void editRemitDetail(AccountRunningWaterDto dto);
+
+    /**
+     * 应付账款汇总报表
+     */
+    Page<AccountsPayableVo> getAccountsPayablePage(AccountsPayableSelectDto dto);
+
+    /**
+     * 应付账款Excel导出
+     */
+    void accountsPayableExportExcel(HttpServletResponse response, AccountsPayableSelectDto dto);
 }

+ 202 - 7
hx-form/src/main/java/com/fjhx/form/service/impl/FinanceReportServiceImpl.java

@@ -3,6 +3,9 @@ package com.fjhx.form.service.impl;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.util.DateUtils;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,26 +15,28 @@ import com.fjhx.account.service.account.AccountRunningWaterService;
 import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.common.utils.excel.util.ExcelUtil;
-import com.fjhx.form.entity.RemitDetailSelectDto;
-import com.fjhx.form.entity.RemitDetailVo;
-import com.fjhx.form.entity.SubjectBalanceBo;
-import com.fjhx.form.entity.SubjectBalanceSelectDto;
+import com.fjhx.form.entity.*;
 import com.fjhx.form.entity.calculate.po.CalculateItemBalance;
+import com.fjhx.form.entity.payable.po.PayableBalance;
 import com.fjhx.form.mapper.FinanceReportMapper;
 import com.fjhx.form.service.FinanceReportService;
 import com.fjhx.form.service.calculate.CalculateItemBalanceService;
+import com.fjhx.form.service.payable.PayableBalanceService;
+import com.fjhx.supply.service.supplier.SupplierInfoService;
+import com.fjhx.wms.service.warehouse.WarehouseService;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
+import org.apache.commons.codec.Charsets;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.net.URLEncoder;
+import java.util.*;
 
 @Service
 public class FinanceReportServiceImpl implements FinanceReportService {
@@ -41,6 +46,13 @@ public class FinanceReportServiceImpl implements FinanceReportService {
     private CalculateItemBalanceService calculateItemBalanceService;
     @Resource
     private AccountRunningWaterService accountRunningWaterService;
+    @Resource
+    private SupplierInfoService supplierInfoService;
+    @Resource
+    private WarehouseService warehouseService;
+
+    @Resource
+    private PayableBalanceService payableBalanceService;
 
     @Override
     public List<SubjectBalanceBo> subjectBalance(SubjectBalanceSelectDto dto) {
@@ -210,4 +222,187 @@ public class FinanceReportServiceImpl implements FinanceReportService {
                 .set(AccountRunningWater::getUpdateUser, SecurityUtils.getUserId())
         );
     }
+
+    @Override
+    public Page<AccountsPayableVo> getAccountsPayablePage(AccountsPayableSelectDto dto) {
+        Assert.notEmpty(dto.getYear(), "年份不能为空!");
+
+        Page<AccountsPayableVo> accountsPayablePage = financeReportMapper.getAccountsPayablePage(dto.getPage(), IWrapper.getWrapper(), dto.getYear());
+        List<AccountsPayableVo> records = accountsPayablePage.getRecords();
+
+        //赋值详情
+        setAccountsPayableInfo(records, dto);
+
+        return accountsPayablePage;
+    }
+
+    /**
+     * 应付账款详情
+     */
+    private void setAccountsPayableInfo(List<AccountsPayableVo> records, AccountsPayableSelectDto dto) {
+        //获取年初数据
+        Map<String, BigDecimal> lastEndBalanceMap = payableBalanceService.mapKV(PayableBalance::getIdStr, PayableBalance::getEndBalance, q -> q
+                .eq(PayableBalance::getYear, dto.getYear() - 1));
+        //获取当年数据
+        Map<String, PayableBalance> balanceMap = payableBalanceService.mapKEntity(PayableBalance::getIdStr, q -> q.eq(PayableBalance::getYear, dto.getYear()));
+
+        for (AccountsPayableVo record : records) {
+            //赋值年初余额
+            record.setYearBeginBalance(lastEndBalanceMap.getOrDefault(record.getIdStr(), BigDecimal.ZERO));
+
+            //上月余额
+            BigDecimal lastMonthEndBalance = record.getYearBeginBalance();
+
+            //赋值备注
+            PayableBalance payableBalance = balanceMap.getOrDefault(record.getIdStr(), new PayableBalance());
+            record.setRemark(payableBalance.getRemark());
+
+            //将当前年数据转JSON
+            JSONObject balanceJson = JSONObject.parse(JSONObject.toJSONString(payableBalance));
+
+            //处理月数据
+            JSONObject dataJson = JSONObject.parse(record.getDataJson());
+            JSONObject monthJson = new JSONObject();
+            //赋值每月数据
+            for (int i = 1; i <= 12; i++) {
+                AccountsPayableVo.MonthDataVo monthData = dataJson.getObject(i + "", AccountsPayableVo.MonthDataVo.class);
+                if (ObjectUtil.isNull(monthData)) {
+                    monthData = new AccountsPayableVo.MonthDataVo();
+                    monthData.setArrivalAmount(BigDecimal.ZERO);
+                    monthData.setArrivalAdjustAmount(BigDecimal.ZERO);
+                    monthData.setBackAmount(BigDecimal.ZERO);
+                    monthData.setTaxAmount(BigDecimal.ZERO);
+                    monthData.setTaxAdjustAmount(BigDecimal.ZERO);
+                    monthData.setPaymentAmount(BigDecimal.ZERO);
+                    monthData.setEndAmount(BigDecimal.ZERO);
+                }
+
+                //调整借方发生额 为负数
+                monthData.setPaymentAmount(BigDecimal.ZERO.subtract(monthData.getPaymentAmount()));
+
+                //赋值税费调整
+                BigDecimal monthTaxAdjust = balanceJson.getBigDecimal("month" + i + "TaxAdjust");
+                if (ObjectUtil.isEmpty(monthTaxAdjust)) {
+                    monthTaxAdjust = BigDecimal.ZERO;
+                }
+                monthData.setTaxAdjustAmount(monthTaxAdjust);
+
+                monthJson.put(i + "", monthData);
+
+                //赋值余额
+                BigDecimal add = lastMonthEndBalance.add(monthData.getArrivalAmount()).add(monthData.getBackAmount()).add(monthData.getArrivalAdjustAmount())
+                        .add(monthData.getTaxAmount()).add(monthTaxAdjust).add(monthData.getPaymentAmount());
+                monthData.setEndAmount(add);
+                lastMonthEndBalance = add;
+            }
+            record.setMonthData(monthJson);
+        }
+        //赋值供应商名称
+        supplierInfoService.attributeAssign(records, AccountsPayableVo::getSupplierId, (item, supplier) -> {
+            item.setSupplierName(supplier.getName());
+            item.setSupplierShortName(supplier.getShortName());
+            item.setSupplierTaxPoints(supplier.getPrivTaxPoints());
+        });
+        //赋值仓库名称
+        warehouseService.attributeAssign(records, AccountsPayableVo::getWarehouseId, (item, warehouse) -> {
+            item.setWarehouseName(warehouse.getName());
+        });
+    }
+
+    @Override
+    public void accountsPayableExportExcel(HttpServletResponse response, AccountsPayableSelectDto dto) {
+        List<AccountsPayableVo> list = financeReportMapper.getAccountsPayablePage(IWrapper.getWrapper(), dto.getYear());
+
+        //赋值详情
+        setAccountsPayableInfo(list, dto);
+
+        //数据处理
+        List<List<Object>> writeList = new ArrayList<List<Object>>();
+        for (AccountsPayableVo accountsPayableVo : list) {
+            List<Object> item = new ArrayList<>();
+            item.add(accountsPayableVo.getSupplierShortName());
+            item.add(accountsPayableVo.getWarehouseName());
+            item.add(accountsPayableVo.getSupplierTaxPoints());
+            item.add(accountsPayableVo.getYearBeginBalance());
+
+            JSONObject monthData = accountsPayableVo.getMonthData();
+            for (int i = 1; i <= 12; i++) {
+                AccountsPayableVo.MonthDataVo month = monthData.getObject(1 + "", AccountsPayableVo.MonthDataVo.class);
+                item.add(month.getArrivalAmount());
+                item.add(month.getBackAmount());
+                item.add(month.getArrivalAdjustAmount());
+                item.add(month.getTaxAmount());
+                item.add(month.getTaxAdjustAmount());
+                item.add(month.getPaymentAmount());
+                item.add(month.getEndAmount());
+            }
+
+            item.add(accountsPayableVo.getRemark());
+
+            writeList.add(item);
+        }
+
+        //标题
+        List<List<String>> headList = new ArrayList<List<String>>();
+        headList.add(Arrays.asList("", "简称"));
+        headList.add(Arrays.asList("", "入库仓库"));
+        headList.add(Arrays.asList("", "税点"));
+        headList.add(Arrays.asList("", "年初余额"));
+        for (int i = 1; i <= 12; i++) {
+            List<String> asList = Arrays.asList("到货金额", "退货金额", "货款调整", "税费", "税费调整", "借方发生额", "期末余额");
+            for (String ti : asList) {
+                headList.add(Arrays.asList(i + "月", ti));
+            }
+        }
+        headList.add(Arrays.asList("", "备注"));
+
+        //导出
+        try {
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding(Charsets.UTF_8.name());
+            String fileName = DateUtils.format(new Date(), DateUtils.DATE_FORMAT_14) + "导出数据";
+            fileName = URLEncoder.encode(fileName, Charsets.UTF_8.name());
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+            EasyExcel.write(response.getOutputStream()).sheet().head(headList).doWrite(writeList);
+        } catch (Exception e) {
+            throw new ServiceException(e.getMessage());
+        }
+    }
+
+    /**
+     * 每月1日0点1分 赋值上月应付余额
+     */
+//    @PostConstruct
+    @Scheduled(cron = "0 1 0 1 * ?")
+    public void autoSaveAccountsPayablePageEnding() {
+        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;
+
+        AccountsPayableSelectDto dto = new AccountsPayableSelectDto();
+        dto.setYear(year);
+        List<AccountsPayableVo> list = financeReportMapper.getAccountsPayablePage(IWrapper.getWrapper(), dto.getYear());
+        setAccountsPayableInfo(list, dto);
+
+        for (AccountsPayableVo accountsPayableVo : list) {
+            AccountsPayableVo.MonthDataVo monthData = accountsPayableVo.getMonthData().getObject(month + "", AccountsPayableVo.MonthDataVo.class);
+
+            PayableBalance payableBalance = payableBalanceService.getOne(q -> q
+                    .eq(PayableBalance::getIdStr, accountsPayableVo.getIdStr()).eq(PayableBalance::getYear, year));
+            if (ObjectUtil.isEmpty(payableBalance)) {
+                payableBalance = new PayableBalance();
+                payableBalance.setIdStr(accountsPayableVo.getIdStr());
+                payableBalance.setYear(year);
+            }
+            payableBalance.setEndBalance(monthData.getEndAmount());
+
+            payableBalanceService.saveOrUpdate(payableBalance);
+        }
+
+        SecurityUtils.clearTenantId();
+        DynamicDataSourceContextHolder.clear();
+    }
 }

+ 19 - 0
hx-form/src/main/java/com/fjhx/form/service/payable/PayableBalanceService.java

@@ -0,0 +1,19 @@
+package com.fjhx.form.service.payable;
+
+import com.fjhx.form.entity.payable.po.PayableBalance;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 应付帐款余额 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-06-04
+ */
+public interface PayableBalanceService extends BaseService<PayableBalance> {
+
+    void edit(PayableBalance dto);
+
+}

+ 37 - 0
hx-form/src/main/java/com/fjhx/form/service/payable/impl/PayableBalanceServiceImpl.java

@@ -0,0 +1,37 @@
+package com.fjhx.form.service.payable.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.utils.Assert;
+import com.fjhx.form.entity.payable.po.PayableBalance;
+import com.fjhx.form.mapper.payable.PayableBalanceMapper;
+import com.fjhx.form.service.payable.PayableBalanceService;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 应付帐款余额 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-06-04
+ */
+@Service
+public class PayableBalanceServiceImpl extends ServiceImpl<PayableBalanceMapper, PayableBalance> implements PayableBalanceService {
+
+    @DSTransactional
+    @Override
+    public void edit(PayableBalance dto) {
+        Assert.notEmpty(dto.getIdStr(), "idStr 不能为空!");
+        Assert.notEmpty(dto.getYear(), "年份不能为空!");
+
+        PayableBalance one = getOne(q -> q.eq(PayableBalance::getIdStr, dto.getIdStr()));
+        if (ObjectUtil.isNotEmpty(one)) {
+            dto.setId(one.getId());
+        }
+
+        this.saveOrUpdate(dto);
+    }
+}

+ 85 - 0
hx-form/src/main/resources/mapper/FinanceReportMapper.xml

@@ -138,4 +138,89 @@
                             GROUP BY cl.id) t1 ON t1.business_id = arw.id
             ${ew.customSqlSegment}
     </select>
+    <select id="getAccountsPayablePage" resultType="com.fjhx.form.entity.AccountsPayableVo">
+        SELECT t1.id_str,
+               t1.supplier_id,
+               t1.warehouse_id,
+               CONCAT(
+                       '{',
+                       GROUP_CONCAT(
+                               '"',
+                               date_format(t1.account_period, '%c'),
+                               '":',
+                               '{"arrivalAmount":',
+                               IFNULL(t1.arrival_amount, 0),
+                               ',"arrivalAdjustAmount":',
+                               IFNULL(t1.arrival_adjust_amount, 0),
+                               ',"backAmount":',
+                               IFNULL(t1.back_amount, 0),
+                               ',"taxAmount":',
+                               IFNULL(t1.tax_amount, 0),
+                               ',"paymentAmount":',
+                               IFNULL(t1.payment_amount, 0),
+                               '}'
+                           ),
+                       '}'
+                   ) AS dataJson
+        FROM (SELECT t1.id_str,
+                     t1.supplier_id,
+                     t1.warehouse_id,
+                     t1.account_period                         AS account_period,
+                     sum(arrival_amount)                       AS arrival_amount,
+                     sum(back_amount)                          AS back_amount,
+                     sum(arrival_adjust_amount)                AS arrival_adjust_amount,
+                     sum(amount)                               AS amount,
+                     sum(amount_including_tax)                 AS amount_including_tax,
+                     sum(payment_amount)                       AS payment_amount,
+                     (sum(amount_including_tax) - sum(amount)) AS tax_amount
+              FROM (SELECT CONCAT(ep.sell_corporation_id, '-', sj.warehouse_id) AS id_str,
+                           ep.sell_corporation_id                               as supplier_id,
+                           sj.warehouse_id,
+                           sjd.account_period,
+                           IF
+                               (
+                                       sj.type =
+                                       104,
+                                       epp.price *
+                                       sjd.quantity,
+                                       0)                                       AS arrival_amount,
+                           IF
+                               (
+                                       sj.type =
+                                       6,
+                                       epp.price *
+                                       sjd.quantity,
+                                       0)                                       AS back_amount,
+                           ad.adjust_amount                                     AS arrival_adjust_amount,
+                           epp.price * sjd.quantity                             AS amount,
+                           epp.price_including_tax * sjd.quantity               AS amount_including_tax,
+                           NULL                                                 AS payment_amount
+                    FROM stock_journal_details sjd
+                             LEFT JOIN arrival_detail ad ON sjd.arrival_detail_id = ad.id
+                             LEFT JOIN ehsd_purchase_product epp ON sjd.purchase_detail_id = epp.id
+                             JOIN stock_journal sj ON sjd.stock_journal_id = sj.id
+                             JOIN ehsd_purchase ep ON sjd.purchase_id = ep.id
+                    UNION ALL
+                    SELECT CONCAT(ccd.supplier_id, '-', sj.warehouse_id) AS id_str,
+                           ccd.supplier_id,
+                           sj.warehouse_id,
+                           ccd.account_period,
+                           NULL                                          AS arrival_amount,
+                           NULL                                          AS back_amount,
+                           NULL                                          AS arrival_adjust_amount,
+                           NULL                                          AS amount,
+                           NULL                                          AS amount_including_tax,
+                           ccd.money                                     AS payment_amount
+                    FROM cost_control_detail ccd
+                             JOIN stock_journal_details sjd
+                                  ON FIND_IN_SET(sjd.id, ccd.stock_journal_details_ids)
+                             JOIN stock_journal sj ON sjd.stock_journal_id = sj.id
+                    WHERE sjd.settle_status = 1) t1
+              WHERE
+                  YEAR ( t1.account_period ) = #{year}
+              GROUP BY
+                  t1.id_str,
+                  date_format( t1.account_period, '%Y-%m' )) AS t1
+        GROUP BY t1.id_str
+    </select>
 </mapper>

+ 4 - 0
hx-form/src/main/resources/mapper/payable/PayableBalanceMapper.xml

@@ -0,0 +1,4 @@
+<?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.form.mapper.payable.PayableBalanceMapper">
+</mapper>