فهرست منبع

新增
1、消费券导入接口

liangwenxuan 3 ماه پیش
والد
کامیت
b269f42d68

+ 24 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/ElderlyConsumerVouchersController.java

@@ -3,11 +3,13 @@ package cn.iocoder.yudao.module.system.controller.admin.biz;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyConsumerVouchersPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyConsumerVouchersRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyConsumerVouchersSaveReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.excel.ElderlyConsumerVouchersImportExcelVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyConsumerVouchersDO;
 import cn.iocoder.yudao.module.system.service.biz.ElderlyConsumerVouchersService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -22,9 +24,14 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -78,4 +85,21 @@ public class ElderlyConsumerVouchersController {
         PageResult<ElderlyConsumerVouchersDO> pageResult = elderlyConsumerVouchersService.getPage(pageReqVO);
         return success(BeanUtils.toBean(pageResult, ElderlyConsumerVouchersRespVO.class));
     }
+
+    @GetMapping("/import-template")
+    @Operation(summary = "下载长者消费券导入模板")
+    @TenantIgnore
+    public void importTemplate(HttpServletResponse response) throws IOException {
+        ExcelUtils.write(response, "长者消费券导入模板.xlsx", "模板",
+                ElderlyConsumerVouchersImportExcelVO.class, Collections.emptyList());
+    }
+
+    @PostMapping("/import")
+    @Operation(summary = "导入长者消费券")
+    @TenantIgnore
+    public CommonResult<Boolean> importData(@RequestParam("file") MultipartFile file) throws IOException {
+        List<ElderlyConsumerVouchersImportExcelVO> list = ExcelUtils.read(file, ElderlyConsumerVouchersImportExcelVO.class);
+        elderlyConsumerVouchersService.importData(list);
+        return success(true);
+    }
 }

+ 37 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/excel/ElderlyConsumerVouchersImportExcelVO.java

@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz.vo.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ * 长者消费券导入 VO
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false)
+public class ElderlyConsumerVouchersImportExcelVO {
+
+    @ExcelProperty("长者姓名")
+    private String elderName;
+
+    @ExcelProperty("身份证号")
+    private String idCard;
+
+    @ExcelProperty("账单归属月(yyyy-MM)")
+    private String billingMonth;
+
+    @ExcelProperty("消费券金额")
+    private BigDecimal amount;
+
+    @ExcelProperty("备注")
+    private String remarks;
+}
+

+ 4 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyConsumerVouchersService.java

@@ -3,9 +3,11 @@ package cn.iocoder.yudao.module.system.service.biz;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyConsumerVouchersPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyConsumerVouchersSaveReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.excel.ElderlyConsumerVouchersImportExcelVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyConsumerVouchersDO;
 
 import javax.validation.Valid;
+import java.util.List;
 
 public interface ElderlyConsumerVouchersService {
 
@@ -18,5 +20,7 @@ public interface ElderlyConsumerVouchersService {
     ElderlyConsumerVouchersDO get(Long id);
 
     PageResult<ElderlyConsumerVouchersDO> getPage(ElderlyConsumerVouchersPageReqVO pageReqVO);
+
+    void importData(List<ElderlyConsumerVouchersImportExcelVO> list);
 }
 

+ 72 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyConsumerVouchersServiceImpl.java

@@ -4,12 +4,16 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyConsumerVouchersPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyConsumerVouchersSaveReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.excel.ElderlyConsumerVouchersImportExcelVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyConsumerVouchersDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyInfoDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ExpenseOrderDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ExpenseOrderItemDO;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyConsumerVouchersMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyInfoMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.ExpenseOrderItemMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.ExpenseOrderMapper;
 import cn.iocoder.yudao.module.system.enums.change.BusinessConstants;
@@ -47,6 +51,9 @@ public class ElderlyConsumerVouchersServiceImpl implements ElderlyConsumerVouche
     @Resource
     private ExpenseOrderItemMapper expenseOrderItemMapper;
 
+    @Resource
+    private ElderlyInfoMapper elderlyInfoMapper;
+
     @Override
     public Long create(ElderlyConsumerVouchersDO createReqVO) {
         validateBillingMonth(createReqVO.getBillingMonth());
@@ -82,6 +89,67 @@ public class ElderlyConsumerVouchersServiceImpl implements ElderlyConsumerVouche
         return new PageResult<>(list, page.getTotal());
     }
 
+    @Override
+    public void importData(List<ElderlyConsumerVouchersImportExcelVO> list) {
+        if (list == null || list.isEmpty()) {
+            throw exception(COMMON_ERROR, "导入数据不能为空");
+        }
+        Long currentTenantId = TenantContextHolder.getTenantId();
+        for (int i = 0; i < list.size(); i++) {
+            int excelRow = i + 2;
+            ElderlyConsumerVouchersImportExcelVO item = list.get(i);
+            if (item == null) {
+                throw exception(COMMON_ERROR, "第" + excelRow + "行数据为空");
+            }
+            if (StringUtils.isBlank(item.getElderName())) {
+                throw exception(COMMON_ERROR, "第" + excelRow + "行【长者姓名】不能为空");
+            }
+            if (StringUtils.isBlank(item.getIdCard())) {
+                throw exception(COMMON_ERROR, "第" + excelRow + "行【身份证号】不能为空");
+            }
+            if (item.getAmount() == null) {
+                throw exception(COMMON_ERROR, "第" + excelRow + "行【消费券金额】不能为空");
+            }
+            if (StringUtils.isBlank(item.getBillingMonth())) {
+                throw exception(COMMON_ERROR, "第" + excelRow + "行【账单归属月】不能为空");
+            }
+            validateBillingMonth(item.getBillingMonth());
+
+            ElderlyInfoDO elderlyInfo = elderlyInfoMapper.selectOne(new LambdaQueryWrapperX<ElderlyInfoDO>()
+                    .eq(ElderlyInfoDO::getElderName, item.getElderName())
+                    .eq(ElderlyInfoDO::getIdCard, item.getIdCard())
+                    .eqIfPresent(ElderlyInfoDO::getTenantId, currentTenantId));
+            if (elderlyInfo == null) {
+                throw exception(COMMON_ERROR, "第" + excelRow + "行未找到匹配长者(姓名+身份证)");
+            }
+
+            ExpenseOrderDO expenseOrder = expenseOrderMapper.selectOne(new LambdaQueryWrapperX<ExpenseOrderDO>()
+                            .eqIfPresent(ExpenseOrderDO::getTenantId, elderlyInfo.getTenantId())
+                            .eq(ExpenseOrderDO::getElderId, elderlyInfo.getId())
+                            .eq(ExpenseOrderDO::getIsShow, true)
+                            .eq(ExpenseOrderDO::getIsLock,0)
+                            .eq(ExpenseOrderDO::getConfirmStatus,0)
+                            .ne(ExpenseOrderDO::getPayStatus, 1)
+                            .eq(ExpenseOrderDO::getBillingMonth, item.getBillingMonth())
+                            .in(ExpenseOrderDO::getType, 1, 2));
+            if (expenseOrder == null) {
+                throw exception(COMMON_ERROR, "第" + excelRow + "行未找到可抵扣账单(需存在未缴费且可见的对应账单月账单)");
+            }
+            validateExpenseOrderNotConfirmedAndNotLock(expenseOrder);
+
+            ElderlyConsumerVouchersDO data = ElderlyConsumerVouchersDO.builder()
+                    .elderId(elderlyInfo.getId())
+                    .billingMonth(item.getBillingMonth())
+                    .amount(item.getAmount())
+                    .remarks(item.getRemarks())
+                    .status(0)
+                    .returnStatus(0)
+                    .tenantId(elderlyInfo.getTenantId())
+                    .build();
+            this.create(data);
+        }
+    }
+
     /**
      * 消费券录入对应未缴费的账单需要更新
      */
@@ -90,8 +158,10 @@ public class ElderlyConsumerVouchersServiceImpl implements ElderlyConsumerVouche
                 .eq(ExpenseOrderDO::getElderId, createReqVO.getElderId())
                 .eq(ExpenseOrderDO::getIsShow, true)
                 .ne(ExpenseOrderDO::getPayStatus, 1)
+                .eq(ExpenseOrderDO::getIsLock,0)
+                .eq(ExpenseOrderDO::getConfirmStatus,0)
                 .eq(ExpenseOrderDO::getBillingMonth, createReqVO.getBillingMonth())
-                .in(ExpenseOrderDO::getType, 1,2));
+                .in(ExpenseOrderDO::getType, 1, 2));
 
         if (expenseOrder == null) {
             return;
@@ -116,7 +186,7 @@ public class ElderlyConsumerVouchersServiceImpl implements ElderlyConsumerVouche
         orderItem.setEndDate(yearMonth.atEndOfMonth());
         orderItem.setTenantId(createReqVO.getTenantId());
         orderItem.setPayStatus(0);
-        orderItem.setDescription(StringUtils.isBlank(createReqVO.getRemarks()) ? yearMonth+"消费券抵扣" : createReqVO.getRemarks()) ;
+        orderItem.setDescription(StringUtils.isBlank(createReqVO.getRemarks()) ? yearMonth + "消费券抵扣" : createReqVO.getRemarks());
         expenseOrderItemMapper.insert(orderItem);
 
         BigDecimal currentAmount = expenseOrder.getActualAmount() != null ? expenseOrder.getActualAmount() : BigDecimal.ZERO;