Procházet zdrojové kódy

账单管理 导入功能

mac před 7 měsíci
rodič
revize
9edd9d9cbb

+ 28 - 46
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/model/LhbOrderRecharge.java

@@ -17,10 +17,10 @@ import com.kxs.common.core.valid.Phone;
 import jakarta.validation.constraints.NotBlank;
 
 /**
- * 订单号码充值记录(LhbOrderRecharge)表实体类
+ * 号码账单记录(LhbOrderRecharge)表实体类
  *
  * @author 系统
- * @since 2024-10-18 16:10:14
+ * @since 2024-10-30 16:34:01
  */
 @EqualsAndHashCode(callSuper = true)
 @Data
@@ -38,6 +38,7 @@ public class LhbOrderRecharge extends Model<LhbOrderRecharge> implements Seriali
     @TableId(type = IdType.AUTO)
     private Integer id;
 
+
     /**
      * 修改人
      */
@@ -53,36 +54,10 @@ public class LhbOrderRecharge extends Model<LhbOrderRecharge> implements Seriali
 
 
     /**
-     * 充值金额 单位分
-     */
-    @Schema(description = "充值金额 单位分")
-    private BigDecimal rechargeFee;
-
-
-    /**
-     * 支付金额 分
-     */
-    @Schema(description = "支付金额 分")
-    private BigDecimal payFee;
-
-
-    /**
-     * 产品ID
+     * 账单金额 单位分
      */
-    @Schema(description = "产品ID")
-    private Integer goodsId;
-
-    /**
-     * 电话
-     */
-    @Schema(description = "电话")
-    private String phone;
-
-    /**
-     * 是否首冲
-     */
-    @Schema(description = "是否首冲")
-    private Integer isFirst;
+    @Schema(description = "账单金额 单位分")
+    private BigDecimal billFee;
 
 
     /**
@@ -116,38 +91,45 @@ public class LhbOrderRecharge extends Model<LhbOrderRecharge> implements Seriali
 
 
     /**
-     * 套餐ID
+     * 通道号
      */
-    @Schema(description = "套餐ID")
-    private Integer skuId;
+    @Schema(description = "通道号")
+    private String ifCode;
 
 
     /**
-     * 套餐名称
+     * 手机号码
      */
-    @Schema(description = "套餐名称")
-    private String skuName;
+    @Schema(description = "手机号码")
+    private String phone;
 
 
     /**
-     * 活动编码
+     * 订单号
      */
-    @Schema(description = "活动编码")
-    private String activityCode;
+    @Schema(description = "订单号")
+    private String orderSn;
 
 
     /**
-     * 能否充值标志0该档次不能充值1可以充值
+     * 账单月份
      */
-    @Schema(description = "能否充值标志0该档次不能充值1可以充值")
-    private Integer canRecharge;
+    @Schema(description = "账单月份")
+    private Integer billMonth;
 
 
     /**
-     * 通道号
+     * 商品名称
      */
-    @Schema(description = "通道号")
-    private String ifCode;
+    @Schema(description = "商品名称")
+    private String goodsName;
+
+
+    /**
+     * 服务商号
+     */
+    @Schema(description = "服务商号")
+    private String isvNo;
 
 
 

+ 72 - 0
lhb-basic/lhb-basic-api/src/main/java/com/kxs/lhb/basic/api/vo/admin/bill/BillExcelVO.java

@@ -0,0 +1,72 @@
+package com.kxs.lhb.basic.api.vo.admin.bill;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.kxs.common.excel.annotation.ExcelLine;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 广电号码账单导入
+ *
+ * @author 没秃顶的码农
+ * @date 2024-10-29
+ */
+@Data
+@ColumnWidth(30)
+public class BillExcelVO implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 导入时候回显行号
+	 */
+	@ExcelLine
+	@ExcelIgnore
+	private Long lineNum;
+
+	/**
+	 * 手机号
+	 */
+	@NotNull(message = "手机号不能为空")
+	@ExcelProperty("手机号")
+	private String phone;
+
+	/**
+	 * 账单金额
+	 */
+	@NotBlank(message = "账单金额不能为空")
+	@ExcelProperty("账单金额")
+	private String billFee;
+
+	/**
+	 * 订单号
+	 */
+	@NotNull(message = "订单号不能为空")
+	@ExcelProperty("订单号")
+	private Integer orderSn;
+
+	/**
+	 * 账单月份
+	 */
+	@NotNull(message = "账单月份不能为空")
+	@ExcelProperty("账单月份")
+	private Integer billMonth;
+
+	/**
+	 * 商品名称
+	 */
+	@NotNull(message = "商品名称不能为空")
+	@ExcelProperty("商品名称")
+	private Integer goodsName;
+
+
+
+}

+ 26 - 7
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/admin/SysRechargeController.java

@@ -1,25 +1,27 @@
 package com.kxs.lhb.basic.biz.controller.admin;
 
+import cn.hutool.core.util.IdUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.kxs.common.core.util.R;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.kxs.common.security.annotation.Inner;
-import com.kxs.common.log.annotation.SysLog;
+import com.kxs.common.excel.annotation.RequestExcel;
+import com.kxs.common.idempotent.annotation.Idempotent;
+import com.kxs.lhb.basic.api.model.LhbOrderRecharge;
+import com.kxs.lhb.basic.api.vo.admin.bill.BillExcelVO;
 import org.springdoc.core.annotations.ParameterObject;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import com.kxs.lhb.basic.api.model.LhbOrderRecharge;
-import org.apache.ibatis.annotations.Param;
 import com.kxs.lhb.basic.biz.service.LhbOrderRechargeService;
 
+import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.http.HttpHeaders;
-import org.springframework.security.access.prepost.PreAuthorize;
 
-import java.util.List;
 import lombok.RequiredArgsConstructor;
 
+import java.util.List;
+
 /**
  * 充值记录(SysRecharge)控制层
  *
@@ -50,7 +52,24 @@ public class SysRechargeController {
     @GetMapping("/page")
     public R page(@ParameterObject Page<LhbOrderRecharge> page, @ParameterObject LhbOrderRecharge param) {
 
-        return R.ok(lhbOrderRechargeService.page(page, new QueryWrapper<>(param)));
+        return R.ok(lhbOrderRechargeService.page(page, Wrappers.lambdaQuery(param).orderByDesc(LhbOrderRecharge::getCreateTime)));
+    }
+
+
+    /**
+     * 导入账单
+     *
+     * @param billExcelList Bill Excel 列表
+     * @param bindingResult 绑定结果
+     * @return {@link R }
+     */
+    @PostMapping("/import")
+    public R importBill(@RequestExcel(ignoreEmptyRow = true) List<BillExcelVO> billExcelList, BindingResult bindingResult) {
+
+        //进度条key
+        String uuid = IdUtil.simpleUUID();
+        lhbOrderRechargeService.importBill(billExcelList, uuid, bindingResult);
+        return R.ok(uuid);
     }
 
 

+ 4 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/controller/cusmoter/OrderController.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxs.common.core.util.R;
 import com.kxs.common.core.valid.group.Insert;
 import com.kxs.common.core.valid.group.Update;
+import com.kxs.common.idempotent.annotation.Idempotent;
 import com.kxs.lhb.basic.api.model.LhbOrder;
 import com.kxs.lhb.basic.biz.service.LhbOrderService;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -41,6 +42,7 @@ public class OrderController {
      * @RequestBody param 实体参数
      * @return 下单
      */
+    @Idempotent(expireTime = 30)
     @PostMapping("/prePhone")
     public R prePhone(@Validated({Insert.class}) @RequestBody LhbOrder param) {
 
@@ -54,6 +56,7 @@ public class OrderController {
      * @RequestBody param 实体参数
      * @return 下单
      */
+    @Idempotent(key = "#makeMobile",expireTime = 15, info = "操作频繁,15秒后重试")
     @PostMapping("/submit")
     public R submit(@Validated({Update.class}) @RequestBody LhbOrder param) {
 
@@ -95,6 +98,7 @@ public class OrderController {
      */
     @PostMapping("/payOrder")
     public R payOrder(@RequestBody LhbOrder param) {
+
         return R.ok(lhbOrderService.payOrder(param));
     }
 

+ 1 - 1
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mapper/LhbOrderRechargeMapper.java

@@ -1,8 +1,8 @@
 package com.kxs.lhb.basic.biz.mapper;
 
+import com.kxs.lhb.basic.api.model.LhbOrderRecharge;
 import org.apache.ibatis.annotations.Mapper;
 import com.github.yulichang.base.MPJBaseMapper;
-import com.kxs.lhb.basic.api.model.LhbOrderRecharge;
 
 
 /**

+ 8 - 6
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/mq/model/params/OrderNotify.java

@@ -12,21 +12,23 @@ import java.math.BigDecimal;
  * @author 没秃顶的码农
  * @date 2024-09-02
  */
-@EqualsAndHashCode(callSuper = true)
 @Data
 @Builder
-public class OrderNotify extends IsvParams{
+public class OrderNotify{
 
     private String isvNo;
 
-    private String employNum;
-
     private String mobile;
 
     /**
-     * 充值金额 单位(分)
+     * 账单金额 分
+     */
+    private BigDecimal amount;
+
+    /**
+     * 账单月
      */
-    private BigDecimal rechargeAmount;
+    private Integer month;
 
 
 

+ 5 - 0
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/LhbOrderRechargeService.java

@@ -2,6 +2,10 @@ package com.kxs.lhb.basic.biz.service;
 
 import com.github.yulichang.base.MPJBaseService;
 import com.kxs.lhb.basic.api.model.LhbOrderRecharge;
+import com.kxs.lhb.basic.api.vo.admin.bill.BillExcelVO;
+import org.springframework.validation.BindingResult;
+
+import java.util.List;
 
 
 /**
@@ -12,5 +16,6 @@ import com.kxs.lhb.basic.api.model.LhbOrderRecharge;
  */
 public interface LhbOrderRechargeService extends MPJBaseService<LhbOrderRecharge> {
 
+    void importBill(List<BillExcelVO> billExcelList, String uuid, BindingResult bindingResult);
 }
 

+ 72 - 3
lhb-basic/lhb-basic-biz/src/main/java/com/kxs/lhb/basic/biz/service/impl/LhbOrderRechargeServiceImpl.java

@@ -1,14 +1,36 @@
 package com.kxs.lhb.basic.biz.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.github.yulichang.toolkit.JoinWrappers;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.kxs.common.excel.converters.ImportAsyncInfo;
+import com.kxs.common.excel.vo.ErrorMessage;
+import com.kxs.lhb.basic.api.model.LhbArea;
+import com.kxs.lhb.basic.api.model.LhbOrder;
+import com.kxs.lhb.basic.api.model.LhbOrderRecharge;
+import com.kxs.lhb.basic.api.vo.admin.bill.BillExcelVO;
 import com.kxs.lhb.basic.biz.mapper.LhbOrderRechargeMapper;
+import com.kxs.lhb.basic.biz.mq.model.params.BindNotify;
+import com.kxs.lhb.basic.biz.mq.model.params.OrderNotify;
+import com.kxs.lhb.basic.biz.service.LhbNotifyService;
 import com.kxs.lhb.basic.biz.service.LhbOrderRechargeService;
+import com.kxs.lhb.basic.biz.service.LhbOrderService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import com.kxs.lhb.basic.api.model.LhbOrderRecharge;
+import org.springframework.validation.BindingResult;
+
+import java.time.LocalDateTime;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 
 /**
@@ -22,4 +44,51 @@ import com.kxs.lhb.basic.api.model.LhbOrderRecharge;
 @Slf4j
 public class LhbOrderRechargeServiceImpl extends MPJBaseServiceImpl<LhbOrderRechargeMapper, LhbOrderRecharge> implements LhbOrderRechargeService {
 
+    private final RedisTemplate<String, Object> redisTemplate;
+
+    private final LhbOrderService orderService;
+
+    private final LhbNotifyService notifyService;
+
+    @Override
+    public void importBill(List<BillExcelVO> billExcelList, String uuid, BindingResult bindingResult) {
+        //上传内容信息
+        ImportAsyncInfo importAsyncInfo = new ImportAsyncInfo();
+        importAsyncInfo.setTotality(billExcelList.size());
+
+        for (BillExcelVO billExcelVO : billExcelList) {
+            Set<String> errorMsg = new HashSet<>();
+            LhbOrderRecharge recharge = getOne(Wrappers.lambdaQuery(LhbOrderRecharge.class).eq(LhbOrderRecharge::getOrderSn, billExcelVO.getOrderSn()));
+            if (recharge != null) {
+                errorMsg.add(billExcelVO.getOrderSn() + "账单已导入!");
+            }
+            if (CollUtil.isNotEmpty(errorMsg)) {
+                ErrorMessage errorMessage = new ErrorMessage(billExcelVO.getLineNum(), errorMsg);
+                importAsyncInfo.errAdd(1);
+                importAsyncInfo.errListAdd(errorMessage);
+                importAsyncInfo.doneAdd(1);
+            }
+            if (CollUtil.isEmpty(errorMsg)) {
+                LhbOrderRecharge orderRecharge = new LhbOrderRecharge();
+                BeanUtils.copyProperties(billExcelVO, orderRecharge);
+                LhbOrder order = orderService.getOne(Wrappers.lambdaQuery(LhbOrder.class).eq(LhbOrder::getMakeMobile, billExcelVO.getPhone()));
+                orderRecharge.setIfCode(order.getIfCode());
+                orderRecharge.setIsvNo(order.getIsvNo());
+                save(orderRecharge);
+
+                OrderNotify orderNotify = OrderNotify.builder()
+                        .mobile(order.getMakeMobile())
+                        .isvNo(order.getIsvNo())
+                        .amount(orderRecharge.getBillFee())
+                        .month(orderRecharge.getBillMonth())
+                        .build();
+                notifyService.orderPush(orderNotify, order.getIsvNo());
+
+                importAsyncInfo.sucAdd(1);
+                importAsyncInfo.doneAdd(1);
+            }
+
+            redisTemplate.opsForValue().set(uuid, JSON.toJSONString(importAsyncInfo), 15, TimeUnit.MINUTES);
+        }
+    }
 }

+ 9 - 8
lhb-basic/lhb-basic-biz/src/main/resources/mapper/LhbOrderRechargeMapper.xml

@@ -6,22 +6,23 @@
         <result column="id" property="id" />
         <result column="update_by" property="updateBy" />
         <result column="create_by" property="createBy" />
-        <result column="recharge_fee" property="rechargeFee" />
-        <result column="pay_fee" property="payFee" />
-        <result column="goods_id" property="goodsId" />
         <result column="version" property="version" />
         <result column="del_flag" property="delFlag" />
         <result column="update_time" property="updateTime" />
         <result column="create_time" property="createTime" />
-        <result column="sku_id" property="skuId" />
-        <result column="sku_name" property="skuName" />
-        <result column="activity_code" property="activityCode" />
-        <result column="can_recharge" property="canRecharge" />
         <result column="if_code" property="ifCode" />
         <result column="phone" property="phone" />
-        <result column="is_first" property="isFirst" />
+        <result column="bill_fee" property="billFee" />
+        <result column="order_sn" property="orderSn" />
+        <result column="bill_month" property="billMonth" />
+        <result column="goods_name" property="goodsName" />
+        <result column="isv_no" property="isvNo" />
 
     </resultMap>
 
 
+
+
+
+
 </mapper>

+ 1 - 1
lhb-gateway/src/main/java/com/kxs/gateway/api/config/RouterFunctionConfiguration.java

@@ -27,7 +27,7 @@ public class RouterFunctionConfiguration {
 	@Bean
 	public RouterFunction<ServerResponse> routerFunction() {
 		return RouterFunctions.route(
-				RequestPredicates.path("/v1/llb/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
+				RequestPredicates.path("/v1/lhb/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
 				imageCodeHandler);
 	}