Browse Source

feat(shop): 实现售电云分销订单Excel导入与结算功能

- 新增售电云分销订单控制器SdyDealerOrderController
- 实现Excel批量导入售电云分销订单功能
- 添加订单结算接口,支持更新结算状态和时间
- 创建售电云分销订单导入参数类SdyDealerOrderImportParam
- 在ShopDealerOrder实体中添加用户昵称和分销商昵称字段- 扩展ShopDealerOrderMapper.xml关联查询用户信息- 增加订单备注字段comments及查询条件支持- 实现通过经销商名称获取申请信息的方法getByDealerNameRel- 在导入逻辑中检查重复数据并跳过已存在记录
- 添加佣金比例rate和单价price字段支持
dev3
科技小王子 2 weeks ago
parent
commit
bc41607c5d
  1. 136
      src/main/java/com/gxwebsoft/sdy/controller/SdyDealerOrderController.java
  2. 52
      src/main/java/com/gxwebsoft/sdy/param/SdyDealerOrderImportParam.java
  3. 44
      src/main/java/com/gxwebsoft/shop/controller/ShopDealerOrderController.java
  4. 28
      src/main/java/com/gxwebsoft/shop/entity/ShopDealerOrder.java
  5. 6
      src/main/java/com/gxwebsoft/shop/entity/ShopDealerUser.java
  6. 10
      src/main/java/com/gxwebsoft/shop/mapper/xml/ShopDealerOrderMapper.xml
  7. 4
      src/main/java/com/gxwebsoft/shop/param/ShopDealerOrderParam.java
  8. 4
      src/main/java/com/gxwebsoft/shop/param/ShopDealerUserParam.java
  9. 2
      src/main/java/com/gxwebsoft/shop/service/ShopDealerApplyService.java
  10. 8
      src/main/java/com/gxwebsoft/shop/service/impl/ShopDealerApplyServiceImpl.java

136
src/main/java/com/gxwebsoft/sdy/controller/SdyDealerOrderController.java

@ -0,0 +1,136 @@
package com.gxwebsoft.sdy.controller;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.hutool.core.util.ObjectUtil;
import com.gxwebsoft.common.core.annotation.OperationLog;
import com.gxwebsoft.common.core.web.ApiResult;
import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.sdy.param.SdyDealerOrderImportParam;
import com.gxwebsoft.shop.entity.ShopDealerApply;
import com.gxwebsoft.shop.entity.ShopDealerOrder;
import com.gxwebsoft.shop.service.ShopDealerApplyService;
import com.gxwebsoft.shop.service.ShopDealerOrderService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
/**
* 售电云分销订单控制器
*
* @author 科技小王子
* @since 2025-08-12 11:55:18
*/
@Tag(name = "售电云分销订单管理")
@RestController
@RequestMapping("/api/sdy/sdy-dealer-order")
public class SdyDealerOrderController extends BaseController {
@Resource
private ShopDealerOrderService shopDealerOrderService;
@Resource
private ShopDealerApplyService shopDealerApplyService;
/**
* excel批量导入售电云分销订单
*/
@PreAuthorize("hasAuthority('shop:shopDealerOrder:save')")
@OperationLog
@Operation(summary = "批量导入售电云分销订单")
@Transactional(rollbackFor = {Exception.class})
@PostMapping("/import")
public ApiResult<List<String>> importBatch(MultipartFile file) {
ImportParams importParams = new ImportParams();
try {
System.out.println("开始导入数据...");
System.out.println("文件大小: " + (file != null ? file.getSize() : "null"));
// 导入XLS文件的内容
List<SdyDealerOrderImportParam> list = ExcelImportUtil.importExcel(file.getInputStream(), SdyDealerOrderImportParam.class, importParams);
// 打印导入的数据条数用于调试
System.out.println("导入数据条数: " + (list != null ? list.size() : 0));
// 打印第一条数据用于调试
if (list != null && !list.isEmpty()) {
SdyDealerOrderImportParam first = list.get(0);
System.out.println("第一条数据: " + first);
System.out.println("comments: " + first.getComments());
System.out.println("userId: " + first.getUserId());
System.out.println("orderId: " + first.getOrderId());
}
if (list == null || list.isEmpty()) {
return fail("未读取到任何数据,请检查Excel文件格式和数据行位置", null);
}
int importedCount = 0;
for (SdyDealerOrderImportParam d : list) {
// 检查是否已存在相同的记录(根据comments字段和未结算状态)
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<ShopDealerOrder> queryWrapper = new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<>();
queryWrapper.eq(ShopDealerOrder::getComments, d.getComments()); // 使用comments字段
queryWrapper.eq(ShopDealerOrder::getIsSettled, 0); // 未结算状态
if (shopDealerOrderService.count(queryWrapper) == 0) {
// 不存在相同记录,可以导入
ShopDealerOrder item = new ShopDealerOrder();
// 手动映射字段
item.setOrderId(d.getOrderId());
item.setOrderPrice(d.getOrderPrice());
item.setFirstUserId(d.getFirstUserId());
item.setSecondUserId(d.getSecondUserId());
item.setThirdUserId(d.getThirdUserId());
item.setFirstMoney(d.getFirstMoney());
item.setSecondMoney(d.getSecondMoney());
item.setThirdMoney(d.getThirdMoney());
item.setTenantId(d.getTenantId());
item.setComments(d.getComments());
item.setIsInvalid(1);
item.setIsSettled(0); // 新导入的数据设为未结算
// 查询绑定关系
ShopDealerApply dealerApply = shopDealerApplyService.getByDealerNameRel(d.getComments());
// 已签约客户
if(dealerApply != null){
item.setIsInvalid(0);
item.setUserId(dealerApply.getUserId());
item.setFirstUserId(dealerApply.getRefereeId());
}
System.out.println("准备导入数据: " + item);
if (ObjectUtil.isNotEmpty(item)) {
shopDealerOrderService.save(item);
importedCount++;
}
} else {
System.out.println("跳过重复数据: " + d.getComments());
}
}
return success("成功导入" + importedCount + "条,重复或已存在" + (list.size() - importedCount) + "条", null);
} catch (Exception e) {
e.printStackTrace();
return fail("导入失败: " + e.getMessage(), null);
}
}
@PreAuthorize("hasAuthority('shop:shopDealerOrder:update')")
@OperationLog
@Operation(summary = "结算订单")
@PutMapping()
public ApiResult<?> saveSettled(@RequestBody ShopDealerOrder shopDealerOrder) {
shopDealerOrder.setSettleTime(LocalDateTime.now());
if (shopDealerOrderService.updateById(shopDealerOrder)) {
return success("结算成功");
}
return fail("结算失败");
}
}

52
src/main/java/com/gxwebsoft/sdy/param/SdyDealerOrderImportParam.java

@ -0,0 +1,52 @@
package com.gxwebsoft.sdy.param;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 售电云分销订单导入参数
*
* @author 科技小王子
* @since 2025-08-12 11:55:18
*/
@Data
public class SdyDealerOrderImportParam implements Serializable {
private static final long serialVersionUID = 1L;
@Excel(name = "用户ID")
private Integer userId;
@Excel(name = "订单ID")
private Integer orderId;
@Excel(name = "结算电量")
private BigDecimal orderPrice;
@Excel(name = "一级分销商ID")
private Integer firstUserId;
@Excel(name = "二级分销商ID")
private Integer secondUserId;
@Excel(name = "三级分销商ID")
private Integer thirdUserId;
@Excel(name = "一级佣金")
private BigDecimal firstMoney;
@Excel(name = "二级佣金")
private BigDecimal secondMoney;
@Excel(name = "三级佣金")
private BigDecimal thirdMoney;
@Excel(name = "公司名称")
private String comments;
@Excel(name = "租户ID")
private Integer tenantId;
}

44
src/main/java/com/gxwebsoft/shop/controller/ShopDealerOrderController.java

@ -1,19 +1,27 @@
package com.gxwebsoft.shop.controller;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.shop.service.ShopDealerOrderService;
import com.gxwebsoft.shop.entity.ShopDealerOrder;
import com.gxwebsoft.shop.param.ShopDealerOrderParam;
import com.gxwebsoft.shop.param.ShopDealerOrderImportParam;
import com.gxwebsoft.common.core.utils.JSONUtil;
import com.gxwebsoft.common.core.web.ApiResult;
import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.common.core.web.PageParam;
import com.gxwebsoft.common.core.web.BatchParam;
import com.gxwebsoft.common.core.annotation.OperationLog;
import com.gxwebsoft.common.system.entity.User;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.List;
@ -126,4 +134,38 @@ public class ShopDealerOrderController extends BaseController {
return fail("删除失败");
}
/**
* excel批量导入分销商订单记录表
*/
@PreAuthorize("hasAuthority('shop:shopDealerOrder:save')")
@OperationLog
@Operation(summary = "批量导入分销商订单记录表")
@Transactional(rollbackFor = {Exception.class})
@PostMapping("/import")
public ApiResult<List<String>> importBatch(MultipartFile file) {
ImportParams importParams = new ImportParams();
try {
// 第三步:导入XLS文件的内容
List<ShopDealerOrderImportParam> list = ExcelImportUtil.importExcel(file.getInputStream(), ShopDealerOrderImportParam.class, importParams);
list.forEach(d -> {
ShopDealerOrder item = JSONUtil.parseObject(JSONUtil.toJSONString(d), ShopDealerOrder.class);
assert item != null;
if (ObjectUtil.isNotEmpty(item)) {
// 设置默认值
if (item.getIsInvalid() == null) {
item.setIsInvalid(0); // 新导入的数据isInvalid设为0(未失效)
}
if (item.getIsSettled() == null) {
item.setIsSettled(0); // 新导入的数据isSettled设为0(未结算)
}
shopDealerOrderService.save(item);
}
});
return success("成功导入" + list.size() + "条", null);
} catch (Exception e) {
e.printStackTrace();
}
return fail("导入失败", null);
}
}

28
src/main/java/com/gxwebsoft/shop/entity/ShopDealerOrder.java

@ -2,6 +2,7 @@ package com.gxwebsoft.shop.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
@ -30,6 +31,10 @@ public class ShopDealerOrder implements Serializable {
@Schema(description = "买家用户ID")
private Integer userId;
@Schema(description = "买家用户昵称")
@TableField(exist = false)
private String nickname;
@Schema(description = "订单ID")
private Integer orderId;
@ -39,12 +44,24 @@ public class ShopDealerOrder implements Serializable {
@Schema(description = "分销商用户id(一级)")
private Integer firstUserId;
@Schema(description = "分销商用户昵称(一级)")
@TableField(exist = false)
private String firstNickname;
@Schema(description = "分销商用户id(二级)")
private Integer secondUserId;
@Schema(description = "分销商用户昵称(二级)")
@TableField(exist = false)
private String secondNickname;
@Schema(description = "分销商用户id(三级)")
private Integer thirdUserId;
@Schema(description = "分销商用户昵称(三级)")
@TableField(exist = false)
private String thirdNickname;
@Schema(description = "分销佣金(一级)")
private BigDecimal firstMoney;
@ -54,6 +71,14 @@ public class ShopDealerOrder implements Serializable {
@Schema(description = "分销佣金(三级)")
private BigDecimal thirdMoney;
@Schema(description = "佣金比例")
@TableField(exist = false)
private BigDecimal rate;
@Schema(description = "单价")
@TableField(exist = false)
private BigDecimal price;
@Schema(description = "订单是否失效(0未失效 1已失效)")
private Integer isInvalid;
@ -63,6 +88,9 @@ public class ShopDealerOrder implements Serializable {
@Schema(description = "结算时间")
private LocalDateTime settleTime;
@Schema(description = "备注")
private String comments;
@Schema(description = "商城ID")
private Integer tenantId;

6
src/main/java/com/gxwebsoft/shop/entity/ShopDealerUser.java

@ -50,6 +50,12 @@ public class ShopDealerUser implements Serializable {
@Schema(description = "累积提现佣金")
private BigDecimal totalMoney;
@Schema(description = "单价")
private BigDecimal price;
@Schema(description = "佣金比例")
private BigDecimal rate;
@Schema(description = "推荐人用户ID")
private Integer refereeId;

10
src/main/java/com/gxwebsoft/shop/mapper/xml/ShopDealerOrderMapper.xml

@ -4,8 +4,13 @@
<!-- 关联查询sql -->
<sql id="selectSql">
SELECT a.*
SELECT a.*, b.nickname, c.nickname AS firstNickname, d.nickname AS secondNickname, e.nickname AS thirdNickname, f.rate, f.price
FROM shop_dealer_order a
LEFT JOIN gxwebsoft_core.sys_user b ON a.user_id = b.user_id
LEFT JOIN gxwebsoft_core.sys_user c ON a.first_user_id = c.user_id
LEFT JOIN gxwebsoft_core.sys_user d ON a.second_user_id = d.user_id
LEFT JOIN gxwebsoft_core.sys_user e ON a.third_user_id = e.user_id
LEFT JOIN shop_dealer_user f ON a.user_id = f.user_id
<where>
<if test="param.id != null">
AND a.id = #{param.id}
@ -43,6 +48,9 @@
<if test="param.isSettled != null">
AND a.is_settled = #{param.isSettled}
</if>
<if test="param.comments != null">
AND a.comments = #{param.comments}
</if>
<if test="param.settleTime != null">
AND a.settle_time = #{param.settleTime}
</if>

4
src/main/java/com/gxwebsoft/shop/param/ShopDealerOrderParam.java

@ -74,4 +74,8 @@ public class ShopDealerOrderParam extends BaseParam {
@QueryField(type = QueryType.EQ)
private String settleTime;
@Schema(description = "备注")
@QueryField(type = QueryType.EQ)
private String comments;
}

4
src/main/java/com/gxwebsoft/shop/param/ShopDealerUserParam.java

@ -55,6 +55,10 @@ public class ShopDealerUserParam extends BaseParam {
@QueryField(type = QueryType.EQ)
private BigDecimal totalMoney;
@Schema(description = "佣金比例")
@QueryField(type = QueryType.EQ)
private BigDecimal rate;
@Schema(description = "推荐人用户ID")
@QueryField(type = QueryType.EQ)
private Integer refereeId;

2
src/main/java/com/gxwebsoft/shop/service/ShopDealerApplyService.java

@ -40,4 +40,6 @@ public interface ShopDealerApplyService extends IService<ShopDealerApply> {
ShopDealerApply getByIdRel(Integer applyId);
ShopDealerApply getByUserIdRel(Integer userId);
ShopDealerApply getByDealerNameRel(String dealerName);
}

8
src/main/java/com/gxwebsoft/shop/service/impl/ShopDealerApplyServiceImpl.java

@ -51,4 +51,12 @@ public class ShopDealerApplyServiceImpl extends ServiceImpl<ShopDealerApplyMappe
return param.getOne(baseMapper.selectListRel(param));
}
@Override
public ShopDealerApply getByDealerNameRel(String dealerName) {
ShopDealerApplyParam param = new ShopDealerApplyParam();
param.setDealerName(dealerName);
param.setType(4);
return param.getOne(baseMapper.selectListRel(param));
}
}

Loading…
Cancel
Save