feat(dealer): 添加经销商设置和模板更新功能

- 在DealerController中添加updateDealerSettings和updateDealerTemplate接口
- 在DealerServiceI接口中定义updateSettings和updateTemplate方法
- 从DealerCreateCmd中移除设置相关字段,改用专门的更新命令对象
- 实现DealerUpdateSettingsCmd和DealerUpdateTemplateCmd两个新的命令DTO
- 创建DealerUpdateSettingsCmdExe和DealerUpdateTemplateCmdExe执行器
- 在DealerGateway中添加对应的更新方法
- 在DealerGatewayImpl中实现具体的数据库更新逻辑
- 更新DealerConvert转换器,忽略设置字段的映射
This commit is contained in:
shenyifei 2026-01-06 13:22:14 +08:00
parent 134a1d34b9
commit df9988b747
11 changed files with 303 additions and 138 deletions

View File

@ -6,10 +6,7 @@ import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.xunhong.erp.turbo.api.biz.api.DealerServiceI;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerDragCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.*;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerShowQry;
@ -92,4 +89,18 @@ public class DealerController {
dealerService.drag(dealerDragCmd);
return Response.buildSuccess();
}
@SaCheckLogin
@RequestMapping(value = "updateDealerSettings", method = {RequestMethod.PATCH, RequestMethod.PUT})
@Operation(summary = "更新经销商设置", method = "PATCH")
public SingleResponse<DealerVO> updateDealerSettings(@RequestBody @Validated DealerUpdateSettingsCmd dealerUpdateSettingsCmd) {
return SingleResponse.of(dealerService.updateSettings(dealerUpdateSettingsCmd));
}
@SaCheckLogin
@RequestMapping(value = "updateDealerTemplate", method = {RequestMethod.PATCH, RequestMethod.PUT})
@Operation(summary = "更新经销商发货单模板", method = "PATCH")
public SingleResponse<DealerVO> updateDealerTemplate(@RequestBody @Validated DealerUpdateTemplateCmd dealerUpdateTemplateCmd) {
return SingleResponse.of(dealerService.updateTemplate(dealerUpdateTemplateCmd));
}
}

View File

@ -0,0 +1,29 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerUpdateSettingsCmd;
import com.xunhong.erp.turbo.api.biz.dto.vo.DealerVO;
import com.xunhong.erp.turbo.biz.app.assembler.DealerAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.Dealer;
import com.xunhong.erp.turbo.biz.domain.gateway.DealerGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 经销商设置更新执行器
*
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class DealerUpdateSettingsCmdExe {
private final DealerAssembler dealerAssembler;
private final DealerGateway dealerGateway;
public DealerVO execute(DealerUpdateSettingsCmd dealerUpdateSettingsCmd) {
Dealer dealer = dealerGateway.updateSettings(dealerUpdateSettingsCmd);
return dealerAssembler.toDealerVO(dealer);
}
}

View File

@ -0,0 +1,29 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerUpdateTemplateCmd;
import com.xunhong.erp.turbo.api.biz.dto.vo.DealerVO;
import com.xunhong.erp.turbo.biz.app.assembler.DealerAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.Dealer;
import com.xunhong.erp.turbo.biz.domain.gateway.DealerGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 经销商发货单模板更新执行器
*
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class DealerUpdateTemplateCmdExe {
private final DealerAssembler dealerAssembler;
private final DealerGateway dealerGateway;
public DealerVO execute(DealerUpdateTemplateCmd dealerUpdateTemplateCmd) {
Dealer dealer = dealerGateway.updateTemplate(dealerUpdateTemplateCmd);
return dealerAssembler.toDealerVO(dealer);
}
}

View File

@ -1,18 +1,13 @@
package com.xunhong.erp.turbo.biz.app.service;
import com.xunhong.erp.turbo.api.biz.api.DealerServiceI;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerDragCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.*;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.DealerVO;
import com.xunhong.erp.turbo.base.dto.PageDTO;
import com.xunhong.erp.turbo.biz.app.executor.cmd.DealerCreateCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.cmd.DealerDestroyCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.cmd.DealerUpdateCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.cmd.*;
import com.xunhong.erp.turbo.biz.app.executor.query.DealerDragCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.query.DealerListQryExe;
import com.xunhong.erp.turbo.biz.app.executor.query.DealerPageQryExe;
@ -40,6 +35,8 @@ public class DealerServiceImpl implements DealerServiceI {
private final DealerPageQryExe dealerPageQryExe;
private final DealerListQryExe dealerListQryExe;
private final DealerDragCmdExe dealerDragCmdExe;
private final DealerUpdateSettingsCmdExe dealerUpdateSettingsCmdExe;
private final DealerUpdateTemplateCmdExe dealerUpdateTemplateCmdExe;
@Override
public DealerVO create(DealerCreateCmd dealerCreateCmd) {
@ -75,4 +72,14 @@ public class DealerServiceImpl implements DealerServiceI {
public void drag(DealerDragCmd dealerDragCmd) {
dealerDragCmdExe.execute(dealerDragCmd);
}
@Override
public DealerVO updateSettings(DealerUpdateSettingsCmd dealerUpdateSettingsCmd) {
return dealerUpdateSettingsCmdExe.execute(dealerUpdateSettingsCmd);
}
@Override
public DealerVO updateTemplate(DealerUpdateTemplateCmd dealerUpdateTemplateCmd) {
return dealerUpdateTemplateCmdExe.execute(dealerUpdateTemplateCmd);
}
}

View File

@ -1,10 +1,7 @@
package com.xunhong.erp.turbo.biz.domain.gateway;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerDragCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.*;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerShowQry;
@ -29,4 +26,8 @@ public interface DealerGateway {
void destroy(DealerDestroyCmd dealerDestroyCmd);
void drag(DealerDragCmd dealerDragCmd);
Dealer updateSettings(DealerUpdateSettingsCmd dealerUpdateSettingsCmd);
Dealer updateTemplate(DealerUpdateTemplateCmd dealerUpdateTemplateCmd);
}

View File

@ -4,7 +4,6 @@ import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerUpdateCmd;
import com.xunhong.erp.turbo.biz.domain.entity.Dealer;
import com.xunhong.erp.turbo.biz.infrastructure.entity.DealerDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.DealerSettingDO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
@ -34,7 +33,7 @@ public interface DealerConvert {
@Mapping(target = "dealerPaymentAccountList", source = "dealerPaymentAccountDOList")
Dealer toDealer(DealerDO dealerDO);
@Mapping(target = "setting", expression = "java(this.toSettingDO(dealerCreateCmd))")
@Mapping(target = "setting", ignore = true)
@Mapping(target = "sort", ignore = true)
@Mapping(target = "deliveryTemplate", ignore = true)
@Mapping(target = "dealerPaymentAccountDOList", ignore = true)
@ -44,27 +43,7 @@ public interface DealerConvert {
@Mapping(target = "createdAt", ignore = true)
DealerDO toDealerDO(DealerCreateCmd dealerCreateCmd);
default DealerSettingDO toSettingDO(DealerCreateCmd dealerCreateCmd) {
DealerSettingDO dealerSettingDO = new DealerSettingDO();
dealerSettingDO.setEnableShare(dealerCreateCmd.getEnableShare());
dealerSettingDO.setShareRatio(dealerCreateCmd.getShareRatio());
dealerSettingDO.setFreightCostFlag(dealerCreateCmd.getFreightCostFlag());
dealerSettingDO.setStrawMatCostFlag(dealerCreateCmd.getStrawMatCostFlag());
dealerSettingDO.setIncludePackingFlag(dealerCreateCmd.getIncludePackingFlag());
dealerSettingDO.setIncludeFreightFlag(dealerCreateCmd.getIncludeFreightFlag());
dealerSettingDO.setEnableAccrualTax(dealerCreateCmd.getEnableAccrualTax());
dealerSettingDO.setAccrualTaxRatio(dealerCreateCmd.getAccrualTaxRatio());
dealerSettingDO.setEnableCompanyRebate(dealerCreateCmd.getEnableCompanyRebate());
dealerSettingDO.setCompanyRebateRatio(dealerCreateCmd.getCompanyRebateRatio());
dealerSettingDO.setShareAdjusted(dealerCreateCmd.getShareAdjusted());
dealerSettingDO.setEnableLoss(dealerCreateCmd.getEnableLoss());
dealerSettingDO.setLossAmount(dealerCreateCmd.getLossAmount());
dealerSettingDO.setEnableInitialTrainNo(dealerCreateCmd.getEnableInitialTrainNo());
dealerSettingDO.setInitialTrainNo(dealerCreateCmd.getInitialTrainNo());
return dealerSettingDO;
}
@Mapping(target = "setting", expression = "java(this.toSettingDO(dealerUpdateCmd))")
@Mapping(target = "setting", ignore = true)
@Mapping(target = "sort", ignore = true)
@Mapping(target = "dealerPaymentAccountDOList", ignore = true)
@Mapping(target = "version", ignore = true)

View File

@ -7,10 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerDragCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.*;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerShowQry;
@ -175,4 +172,71 @@ public class DealerGatewayImpl implements DealerGateway {
return prevSort != null && nextSort != null
&& (nextSort - prevSort) < 1.0; // 判断间隙是否耗尽
}
@Override
public Dealer updateSettings(DealerUpdateSettingsCmd dealerUpdateSettingsCmd) {
LambdaQueryWrapper<DealerDO> queryWrapper = Wrappers.lambdaQuery(DealerDO.class);
queryWrapper.eq(DealerDO::getDealerId, dealerUpdateSettingsCmd.getDealerId());
queryWrapper.last("limit 1");
DealerDO dealerDO = dealerMapper.selectOne(queryWrapper);
if (dealerDO == null) {
return null;
}
// 更新设置字段
DealerSettingDO setting = dealerDO.getSetting();
if (setting == null) {
setting = new DealerSettingDO();
dealerDO.setSetting(setting);
}
// 分成设置
setting.setEnableShare(dealerUpdateSettingsCmd.getEnableShare());
setting.setShareRatio(dealerUpdateSettingsCmd.getShareRatio());
// 成本标志
setting.setFreightCostFlag(dealerUpdateSettingsCmd.getFreightCostFlag());
setting.setStrawMatCostFlag(dealerUpdateSettingsCmd.getStrawMatCostFlag());
setting.setIncludePackingFlag(dealerUpdateSettingsCmd.getIncludePackingFlag());
setting.setIncludeFreightFlag(dealerUpdateSettingsCmd.getIncludeFreightFlag());
// 计提税金
setting.setEnableAccrualTax(dealerUpdateSettingsCmd.getEnableAccrualTax());
setting.setAccrualTaxRatio(dealerUpdateSettingsCmd.getAccrualTaxRatio());
// 公司返点
setting.setEnableCompanyRebate(dealerUpdateSettingsCmd.getEnableCompanyRebate());
setting.setCompanyRebateRatio(dealerUpdateSettingsCmd.getCompanyRebateRatio());
setting.setShareAdjusted(dealerUpdateSettingsCmd.getShareAdjusted());
// 损耗设置
setting.setEnableLoss(dealerUpdateSettingsCmd.getEnableLoss());
setting.setLossAmount(dealerUpdateSettingsCmd.getLossAmount());
// 初始车次号
setting.setEnableInitialTrainNo(dealerUpdateSettingsCmd.getEnableInitialTrainNo());
setting.setInitialTrainNo(dealerUpdateSettingsCmd.getInitialTrainNo());
dealerMapper.updateById(dealerDO);
return dealerConvert.toDealer(dealerDO);
}
@Override
public Dealer updateTemplate(DealerUpdateTemplateCmd dealerUpdateTemplateCmd) {
LambdaQueryWrapper<DealerDO> queryWrapper = Wrappers.lambdaQuery(DealerDO.class);
queryWrapper.eq(DealerDO::getDealerId, dealerUpdateTemplateCmd.getDealerId());
queryWrapper.last("limit 1");
DealerDO dealerDO = dealerMapper.selectOne(queryWrapper);
if (dealerDO == null) {
return null;
}
// 更新发货单模板
dealerDO.setDeliveryTemplate(dealerUpdateTemplateCmd.getDeliveryTemplate());
dealerMapper.updateById(dealerDO);
return dealerConvert.toDealer(dealerDO);
}
}

View File

@ -1,9 +1,6 @@
package com.xunhong.erp.turbo.api.biz.api;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerDragCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.*;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerShowQry;
@ -29,5 +26,9 @@ public interface DealerServiceI {
void destroy(DealerDestroyCmd dealerDestroyCmd);
void drag(DealerDragCmd dealerDragCmd);
DealerVO updateSettings(DealerUpdateSettingsCmd dealerUpdateSettingsCmd);
DealerVO updateTemplate(DealerUpdateTemplateCmd dealerUpdateTemplateCmd);
}

View File

@ -40,42 +40,6 @@ public class DealerCreateCmd extends Command {
@Schema(title = "经销商类型1_市场2_超市", requiredMode = Schema.RequiredMode.REQUIRED)
private DealerTypeEnum dealerType;
/**
* 是否开启分成
*/
@Schema(title = "是否开启分成")
private Boolean enableShare;
/**
* 分成比例
*/
@Schema(title = "分成比例")
private BigDecimal shareRatio;
/**
* 运费是否作为成本
*/
@Schema(title = "运费是否作为成本")
private Boolean freightCostFlag;
/**
* 草帘是否作为成本
*/
@Schema(title = "草帘是否作为成本")
private Boolean strawMatCostFlag;
/**
* 发货单合计金额是否含包装费
*/
@Schema(title = "发货单合计金额是否含包装费")
private Boolean includePackingFlag;
/**
* 发货单合计金额是否含包运费
*/
@Schema(title = "发货单合计金额是否含包运费")
private Boolean includeFreightFlag;
/**
* 应收金额
*/
@ -93,60 +57,5 @@ public class DealerCreateCmd extends Command {
*/
@Schema(title = "状态1_启用0_禁用", requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean status;
/**
* 是否开启计提税金
*/
@Schema(title = "是否开启计提税金")
private Boolean enableAccrualTax;
/**
* 计提税金比例
*/
@Schema(title = "计提税金比例")
private BigDecimal accrualTaxRatio;
/**
* 是否开启公司返点
*/
@Schema(title = "是否开启公司返点")
private Boolean enableCompanyRebate;
/**
* 公司返点比例
*/
@Schema(title = "公司返点比例")
private BigDecimal companyRebateRatio;
/**
* 是否可调整比例
*/
@Schema(title = "是否可调整比例")
private Boolean shareAdjusted;
/**
* 是否开启损耗
*/
@Schema(title = "是否开启损耗")
private Boolean enableLoss;
/**
* 损耗金额
*/
@Schema(title = "损耗金额")
private BigDecimal lossAmount;
/**
* 是否启用初始车次号
*/
@Schema(title = "是否启用初始车次号")
private Boolean enableInitialTrainNo;
/**
* 初始车次号
*/
@Schema(title = "初始车次号")
private Integer initialTrainNo;
}

View File

@ -0,0 +1,112 @@
package com.xunhong.erp.turbo.api.biz.dto.cmd;
import com.xunhong.erp.turbo.base.dto.Command;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 经销商设置更新命令
*
* @author shenyifei
*/
@Data
@Schema(title = "经销商设置更新")
@EqualsAndHashCode(callSuper = true)
public class DealerUpdateSettingsCmd extends Command {
@Schema(title = "经销商ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long dealerId;
/**
* 是否开启分成
*/
@Schema(title = "是否开启分成")
private Boolean enableShare;
/**
* 分成比例
*/
@Schema(title = "分成比例")
private BigDecimal shareRatio;
/**
* 运费是否作为成本
*/
@Schema(title = "运费是否作为成本")
private Boolean freightCostFlag;
/**
* 草帘是否作为成本
*/
@Schema(title = "草帘是否作为成本")
private Boolean strawMatCostFlag;
/**
* 发货单合计金额是否含包装费
*/
@Schema(title = "发货单合计金额是否含包装费")
private Boolean includePackingFlag;
/**
* 发货单合计金额是否含包运费
*/
@Schema(title = "发货单合计金额是否含包运费")
private Boolean includeFreightFlag;
/**
* 是否开启计提税金
*/
@Schema(title = "是否开启计提税金")
private Boolean enableAccrualTax;
/**
* 计提税金比例
*/
@Schema(title = "计提税金比例")
private BigDecimal accrualTaxRatio;
/**
* 是否开启公司返点
*/
@Schema(title = "是否开启公司返点")
private Boolean enableCompanyRebate;
/**
* 公司返点比例
*/
@Schema(title = "公司返点比例")
private BigDecimal companyRebateRatio;
/**
* 是否可调整比例
*/
@Schema(title = "是否可调整比例")
private Boolean shareAdjusted;
/**
* 是否开启损耗
*/
@Schema(title = "是否开启损耗")
private Boolean enableLoss;
/**
* 损耗金额
*/
@Schema(title = "损耗金额")
private BigDecimal lossAmount;
/**
* 是否启用初始车次号
*/
@Schema(title = "是否启用初始车次号")
private Boolean enableInitialTrainNo;
/**
* 初始车次号
*/
@Schema(title = "初始车次号")
private Integer initialTrainNo;
}

View File

@ -0,0 +1,23 @@
package com.xunhong.erp.turbo.api.biz.dto.cmd;
import com.xunhong.erp.turbo.base.dto.Command;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 经销商发货单模板更新命令
*
* @author shenyifei
*/
@Data
@Schema(title = "经销商发货单模板更新")
@EqualsAndHashCode(callSuper = true)
public class DealerUpdateTemplateCmd extends Command {
@Schema(title = "经销商ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long dealerId;
@Schema(title = "发货单模板", requiredMode = Schema.RequiredMode.REQUIRED)
private String deliveryTemplate;
}