feat(order): 添加订单成本项详情和付款功能

- 新增订单成本项详情查询接口showOrderCost
- 实现订单成本项付款功能payOrderCost
- 添加OrderCostShowQry和OrderCostPayCmd数据传输对象
- 在PaymentRecord中关联订单成本项信息
- 优化供应商发票查询逻辑,添加发票ID筛选条件
- 修复付款记录查询中的供应商ID筛选条件
- 添加费用不存在的业务异常码B_BIZ_COST_NOT_FOUND
- 优化支付记录编号生成逻辑
- 修复枚举值名称从COST到ORDER_COST的映射
- 添加采购订单成本项目信息到PaymentRecordVO
This commit is contained in:
shenyifei 2026-01-08 10:55:08 +08:00
parent c4aa2ad5bf
commit b06a6a1fdd
29 changed files with 451 additions and 49 deletions

View File

@ -5,8 +5,11 @@ import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse; import com.alibaba.cola.dto.SingleResponse;
import com.xunhong.erp.turbo.api.biz.api.OrderCostServiceI; import com.xunhong.erp.turbo.api.biz.api.OrderCostServiceI;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd; import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostPayCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostPageQry; import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.OrderCostVO; import com.xunhong.erp.turbo.api.biz.dto.vo.OrderCostVO;
import com.xunhong.erp.turbo.api.biz.dto.vo.PaymentRecordVO;
import com.xunhong.erp.turbo.api.rbac.dto.constants.RoleConstant; import com.xunhong.erp.turbo.api.rbac.dto.constants.RoleConstant;
import com.xunhong.erp.turbo.api.user.api.AdminServiceI; import com.xunhong.erp.turbo.api.user.api.AdminServiceI;
import com.xunhong.erp.turbo.api.user.dto.qry.AdminShowQry; import com.xunhong.erp.turbo.api.user.dto.qry.AdminShowQry;
@ -16,6 +19,7 @@ import com.xunhong.erp.turbo.base.dto.UserSession;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -23,6 +27,7 @@ import org.springframework.web.bind.annotation.*;
/** /**
* @author shenyifei * @author shenyifei
*/ */
@Slf4j
@Tag(name = "OrderCost", description = "订单成本项管理") @Tag(name = "OrderCost", description = "订单成本项管理")
@RestController("operationOrderCostController") @RestController("operationOrderCostController")
@RequestMapping(value = "/operation") @RequestMapping(value = "/operation")
@ -52,6 +57,15 @@ public class OrderCostController {
PageDTO<OrderCostVO> page = orderCostService.page(orderCostPageQry); PageDTO<OrderCostVO> page = orderCostService.page(orderCostPageQry);
return PageResponse.of(page.getRecords(), (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent()); return PageResponse.of(page.getRecords(), (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent());
} }
@SaCheckLogin
// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_ORDER_SUPPLIER_VIEW})
@GetMapping("showOrderCost")
@Operation(summary = "订单成本项详情", method = "GET")
public SingleResponse<OrderCostVO> showOrderCost(@ModelAttribute @Validated OrderCostShowQry orderCostShowQry) {
return SingleResponse.of(orderCostService.show(orderCostShowQry));
}
@SaCheckLogin @SaCheckLogin
// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_ORDER_SUPPLIER_UPDATE}) // @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_ORDER_SUPPLIER_UPDATE})
@PostMapping(value = "createOrderCost") @PostMapping(value = "createOrderCost")
@ -59,4 +73,12 @@ public class OrderCostController {
public SingleResponse<OrderCostVO> createOrderCost(@RequestBody @Validated OrderCostCreateCmd orderCostCreateCmd) { public SingleResponse<OrderCostVO> createOrderCost(@RequestBody @Validated OrderCostCreateCmd orderCostCreateCmd) {
return SingleResponse.of(orderCostService.create(orderCostCreateCmd)); return SingleResponse.of(orderCostService.create(orderCostCreateCmd));
} }
@SaCheckLogin
// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_ORDER_SUPPLIER_UPDATE})
@PostMapping(value = "payOrderCost")
@Operation(summary = "费用付款", method = "POST")
public SingleResponse<PaymentRecordVO> payOrderCost(@RequestBody @Validated OrderCostPayCmd orderCostPayCmd) {
return SingleResponse.of(orderCostService.pay(orderCostPayCmd));
}
} }

View File

@ -12,6 +12,7 @@ import org.mapstruct.NullValueCheckStrategy;
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) @Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface PaymentRecordAssembler { public interface PaymentRecordAssembler {
@Mapping(target = "orderCostVO", source = "orderCost")
@Mapping(target = "companyVO", source = "company") @Mapping(target = "companyVO", source = "company")
@Mapping(target = "supplierVO", source = "supplier") @Mapping(target = "supplierVO", source = "supplier")
@Mapping(target = "paymentTaskVO", source = "paymentTask") @Mapping(target = "paymentTaskVO", source = "paymentTask")

View File

@ -0,0 +1,28 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostPayCmd;
import com.xunhong.erp.turbo.api.biz.dto.vo.PaymentRecordVO;
import com.xunhong.erp.turbo.biz.app.assembler.PaymentRecordAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.PaymentRecord;
import com.xunhong.erp.turbo.biz.domain.gateway.OrderCostGateway;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
/**
* 费用付款执行器
*
* @author shenyifei
*/
@Component
@RequiredArgsConstructor
public class OrderCostPayCmdExe {
private final OrderCostGateway orderCostGateway;
private final PaymentRecordAssembler paymentRecordAssembler;
public PaymentRecordVO execute(OrderCostPayCmd orderCostPayCmd) {
PaymentRecord paymentRecord = orderCostGateway.pay(orderCostPayCmd);
return paymentRecordAssembler.toPaymentRecordVO(paymentRecord);
}
}

View File

@ -0,0 +1,27 @@
package com.xunhong.erp.turbo.biz.app.executor.query;
import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.OrderCostVO;
import com.xunhong.erp.turbo.biz.app.assembler.OrderCostAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.OrderCost;
import com.xunhong.erp.turbo.biz.domain.gateway.OrderCostGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class OrderCostShowQryExe {
private final OrderCostGateway orderCostGateway;
private final OrderCostAssembler orderCostAssembler;
public OrderCostVO execute(OrderCostShowQry orderCostShowQry) {
OrderCost orderCost = orderCostGateway.show(orderCostShowQry);
return orderCostAssembler.toOrderCostVO(orderCost);
}
}

View File

@ -2,11 +2,16 @@ package com.xunhong.erp.turbo.biz.app.service;
import com.xunhong.erp.turbo.api.biz.api.OrderCostServiceI; import com.xunhong.erp.turbo.api.biz.api.OrderCostServiceI;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd; import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostPayCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostPageQry; import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.OrderCostVO; import com.xunhong.erp.turbo.api.biz.dto.vo.OrderCostVO;
import com.xunhong.erp.turbo.api.biz.dto.vo.PaymentRecordVO;
import com.xunhong.erp.turbo.base.dto.PageDTO; import com.xunhong.erp.turbo.base.dto.PageDTO;
import com.xunhong.erp.turbo.biz.app.executor.cmd.OrderCostCreateCmdExe; import com.xunhong.erp.turbo.biz.app.executor.cmd.OrderCostCreateCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.cmd.OrderCostPayCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.query.OrderCostPageQryExe; import com.xunhong.erp.turbo.biz.app.executor.query.OrderCostPageQryExe;
import com.xunhong.erp.turbo.biz.app.executor.query.OrderCostShowQryExe;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.config.annotation.DubboService;
@ -23,6 +28,8 @@ public class OrderCostServiceImpl implements OrderCostServiceI {
private final OrderCostPageQryExe orderCostPageQryExe; private final OrderCostPageQryExe orderCostPageQryExe;
private final OrderCostCreateCmdExe orderCostCreateCmdExe; private final OrderCostCreateCmdExe orderCostCreateCmdExe;
private final OrderCostShowQryExe orderCostShowQryExe;
private final OrderCostPayCmdExe orderCostPayCmdExe;
@Override @Override
public PageDTO<OrderCostVO> page(OrderCostPageQry orderCostPageQry) { public PageDTO<OrderCostVO> page(OrderCostPageQry orderCostPageQry) {
@ -33,5 +40,15 @@ public class OrderCostServiceImpl implements OrderCostServiceI {
public OrderCostVO create(OrderCostCreateCmd orderCostCreateCmd) { public OrderCostVO create(OrderCostCreateCmd orderCostCreateCmd) {
return orderCostCreateCmdExe.execute(orderCostCreateCmd); return orderCostCreateCmdExe.execute(orderCostCreateCmd);
} }
@Override
public OrderCostVO show(OrderCostShowQry orderCostShowQry) {
return orderCostShowQryExe.execute(orderCostShowQry);
}
@Override
public PaymentRecordVO pay(OrderCostPayCmd orderCostPayCmd) {
return orderCostPayCmdExe.execute(orderCostPayCmd);
}
} }

View File

@ -125,5 +125,10 @@ public class PaymentRecord extends DTO {
* 公司 * 公司
*/ */
private Company company; private Company company;
/**
* 成本项
*/
private OrderCost orderCost;
} }

View File

@ -2,8 +2,11 @@ package com.xunhong.erp.turbo.biz.domain.gateway;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd; import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostPayCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostPageQry; import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostShowQry;
import com.xunhong.erp.turbo.biz.domain.entity.OrderCost; import com.xunhong.erp.turbo.biz.domain.entity.OrderCost;
import com.xunhong.erp.turbo.biz.domain.entity.PaymentRecord;
/** /**
* @author shenyifei * @author shenyifei
@ -12,5 +15,9 @@ public interface OrderCostGateway {
IPage<OrderCost> page(OrderCostPageQry orderCostPageQry); IPage<OrderCost> page(OrderCostPageQry orderCostPageQry);
OrderCost save(OrderCostCreateCmd orderCostCreateCmd); OrderCost save(OrderCostCreateCmd orderCostCreateCmd);
OrderCost show(OrderCostShowQry orderCostShowQry);
PaymentRecord pay(OrderCostPayCmd orderCostPayCmd);
} }

View File

@ -1,10 +1,12 @@
package com.xunhong.erp.turbo.biz.infrastructure.convert; package com.xunhong.erp.turbo.biz.infrastructure.convert;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd; import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostPayCmd;
import com.xunhong.erp.turbo.biz.domain.entity.Order; import com.xunhong.erp.turbo.biz.domain.entity.Order;
import com.xunhong.erp.turbo.biz.domain.entity.OrderCost; import com.xunhong.erp.turbo.biz.domain.entity.OrderCost;
import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderCostDO; import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderCostDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderDO; import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.PaymentRecordDO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
import org.mapstruct.NullValueCheckStrategy; import org.mapstruct.NullValueCheckStrategy;
@ -45,6 +47,7 @@ public interface OrderCostConvert {
@Mapping(target = "order", source = "orderDO") @Mapping(target = "order", source = "orderDO")
OrderCost toOrderCost(OrderCostDO orderCostDO); OrderCost toOrderCost(OrderCostDO orderCostDO);
@Mapping(target = "orderVehicleDO", ignore = true)
@Mapping(target = "version", ignore = true) @Mapping(target = "version", ignore = true)
@Mapping(target = "updatedAt", ignore = true) @Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "orderDO", ignore = true) @Mapping(target = "orderDO", ignore = true)
@ -54,4 +57,19 @@ public interface OrderCostConvert {
@Mapping(target = "isDelete", ignore = true) @Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true) @Mapping(target = "createdAt", ignore = true)
OrderCostDO toOrderCostDO(OrderCostCreateCmd orderCostCreateCmd); OrderCostDO toOrderCostDO(OrderCostCreateCmd orderCostCreateCmd);
@Mapping(target = "version", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "targetType", ignore = true)
@Mapping(target = "targetId", ignore = true)
@Mapping(target = "supplierDO", ignore = true)
@Mapping(target = "paymentTaskId", ignore = true)
@Mapping(target = "paymentTaskDO", ignore = true)
@Mapping(target = "paymentRecordSn", ignore = true)
@Mapping(target = "paymentRecordId", ignore = true)
@Mapping(target = "paidState", ignore = true)
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "companyDO", ignore = true)
PaymentRecordDO toPaymentRecordDO(OrderCostPayCmd orderCostPayCmd);
} }

View File

@ -15,11 +15,13 @@ import org.mapstruct.NullValueCheckStrategy;
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) @Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface PaymentRecordConvert { public interface PaymentRecordConvert {
@Mapping(target = "orderCost", source = "orderCostDO")
@Mapping(target = "company", source = "companyDO") @Mapping(target = "company", source = "companyDO")
@Mapping(target = "paymentTask", source = "paymentTaskDO") @Mapping(target = "paymentTask", source = "paymentTaskDO")
@Mapping(target = "supplier", source = "supplierDO") @Mapping(target = "supplier", source = "supplierDO")
PaymentRecord toPaymentRecord(PaymentRecordDO paymentRecordDO); PaymentRecord toPaymentRecord(PaymentRecordDO paymentRecordDO);
@Mapping(target = "orderCostDO", ignore = true)
@Mapping(target = "companyDO", ignore = true) @Mapping(target = "companyDO", ignore = true)
@Mapping(target = "supplierDO", ignore = true) @Mapping(target = "supplierDO", ignore = true)
@Mapping(target = "paymentTaskDO", ignore = true) @Mapping(target = "paymentTaskDO", ignore = true)
@ -29,6 +31,7 @@ public interface PaymentRecordConvert {
@Mapping(target = "createdAt", ignore = true) @Mapping(target = "createdAt", ignore = true)
PaymentRecordDO toPaymentRecordDO(PaymentRecordCreateCmd paymentRecordCreateCmd); PaymentRecordDO toPaymentRecordDO(PaymentRecordCreateCmd paymentRecordCreateCmd);
@Mapping(target = "orderCostDO", ignore = true)
@Mapping(target = "companyDO", ignore = true) @Mapping(target = "companyDO", ignore = true)
@Mapping(target = "supplierDO", ignore = true) @Mapping(target = "supplierDO", ignore = true)
@Mapping(target = "paymentTaskDO", ignore = true) @Mapping(target = "paymentTaskDO", ignore = true)

View File

@ -135,5 +135,19 @@ public class PaymentRecordDO extends BaseDO<PaymentRecordDO> {
@TableField(exist = false) @TableField(exist = false)
private CompanyDO companyDO; private CompanyDO companyDO;
@TableField(exist = false)
private OrderCostDO orderCostDO;
/**
* 付款记录编号
*
* @return 付款记录编号
*/
public String generatePaymentRecordSn() {
// 生成类似 PAY20251105001 格式的编号
return "PAY" + java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.BASIC_ISO_DATE)
+ String.format("%03d", System.currentTimeMillis() % 1000);
}
} }

View File

@ -6,21 +6,24 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd; import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostPayCmd;
import com.xunhong.erp.turbo.api.biz.dto.enums.PaymentRecordStateEnum;
import com.xunhong.erp.turbo.api.biz.dto.enums.PaymentTargetTypeEnum;
import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostPageQry; import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostShowQry;
import com.xunhong.erp.turbo.api.biz.exception.BizErrorCode;
import com.xunhong.erp.turbo.api.biz.exception.BizException;
import com.xunhong.erp.turbo.biz.domain.entity.OrderCost; import com.xunhong.erp.turbo.biz.domain.entity.OrderCost;
import com.xunhong.erp.turbo.biz.domain.entity.PaymentRecord;
import com.xunhong.erp.turbo.biz.domain.gateway.OrderCostGateway; import com.xunhong.erp.turbo.biz.domain.gateway.OrderCostGateway;
import com.xunhong.erp.turbo.biz.infrastructure.convert.OrderCostConvert; import com.xunhong.erp.turbo.biz.infrastructure.convert.OrderCostConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.CostDO; import com.xunhong.erp.turbo.biz.infrastructure.convert.PaymentRecordConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderCompanyDO; import com.xunhong.erp.turbo.biz.infrastructure.entity.*;
import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderCostDO; import com.xunhong.erp.turbo.biz.infrastructure.mapper.*;
import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderDO;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.CostMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.OrderCompanyMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.OrderCostMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.OrderMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -44,6 +47,9 @@ public class OrderCostGatewayImpl implements OrderCostGateway {
private final CostMapper costMapper; private final CostMapper costMapper;
private final PaymentRecordMapper paymentRecordMapper;
private final PaymentRecordConvert paymentRecordConvert;
@Override @Override
public IPage<OrderCost> page(OrderCostPageQry orderCostPageQry) { public IPage<OrderCost> page(OrderCostPageQry orderCostPageQry) {
@ -95,5 +101,53 @@ public class OrderCostGatewayImpl implements OrderCostGateway {
return orderCostConvert.toOrderCost(orderCostDO); return orderCostConvert.toOrderCost(orderCostDO);
} }
@Override
public OrderCost show(OrderCostShowQry orderCostShowQry) {
OrderCostDO orderCostDO = orderCostMapper.selectById(orderCostShowQry.getOrderCostId());
if (Objects.isNull(orderCostDO)) {
return null;
}
OrderCompanyDO orderCompanyDO = orderCompanyMapper.selectOne(Wrappers.lambdaQuery(OrderCompanyDO.class)
.eq(OrderCompanyDO::getOrderId, orderCostDO.getOrderId()));
if (Objects.nonNull(orderCompanyDO)) {
orderCostDO.setOrderCompanyDO(orderCompanyDO);
}
OrderDO orderDO = orderMapper.selectByOrderId(orderCostDO.getOrderId());
if (Objects.nonNull(orderDO)) {
orderCostDO.setOrderDO(orderDO);
}
return orderCostConvert.toOrderCost(orderCostDO);
}
@Override
@Transactional
public PaymentRecord pay(OrderCostPayCmd orderCostPayCmd) {
// 获取费用详情
LambdaQueryWrapper<OrderCostDO> queryWrapper = Wrappers.lambdaQuery(OrderCostDO.class);
queryWrapper.eq(OrderCostDO::getOrderCostId, orderCostPayCmd.getOrderCostId());
queryWrapper.select(OrderCostDO::getOrderCostId, OrderCostDO::getCostId, OrderCostDO::getPrice, OrderCostDO::getIsPaid);
OrderCostDO orderCostDO = orderCostMapper.selectOne(queryWrapper);
if (Objects.isNull(orderCostDO)) {
throw new BizException(BizErrorCode.B_BIZ_COST_NOT_FOUND);
}
PaymentRecordDO paymentRecordDO = orderCostConvert.toPaymentRecordDO(orderCostPayCmd);
paymentRecordDO.setPaymentRecordSn(paymentRecordDO.generatePaymentRecordSn());
paymentRecordDO.setTargetId(orderCostPayCmd.getOrderCostId());
paymentRecordDO.setTargetType(PaymentTargetTypeEnum.ORDER_COST);
paymentRecordDO.setPaidState(PaymentRecordStateEnum.PAID);
orderCostDO.setIsPaid(Boolean.TRUE);
orderCostMapper.updateById(orderCostDO);
paymentRecordMapper.insert(paymentRecordDO);
return paymentRecordConvert.toPaymentRecord(paymentRecordDO);
}
} }

View File

@ -204,6 +204,7 @@ public class OrderGatewayImpl implements OrderGateway {
orderDO.setOrderPackageDOList(orderPackageDOList.stream().filter(orderPackageDO -> Objects.isNull(orderPackageDO.getOrderSupplierId())).toList()); orderDO.setOrderPackageDOList(orderPackageDOList.stream().filter(orderPackageDO -> Objects.isNull(orderPackageDO.getOrderSupplierId())).toList());
Set<Long> invoiceIdList = orderSupplierDOList.stream().map(OrderSupplierDO::getInvoiceId).collect(Collectors.toSet()); Set<Long> invoiceIdList = orderSupplierDOList.stream().map(OrderSupplierDO::getInvoiceId).collect(Collectors.toSet());
if (CollUtil.isNotEmpty(invoiceIdList)) {
List<SupplierInvoiceDO> supplierInvoiceDOList = supplierInvoiceMapper.selectByIds(invoiceIdList); List<SupplierInvoiceDO> supplierInvoiceDOList = supplierInvoiceMapper.selectByIds(invoiceIdList);
Map<Long, SupplierInvoiceDO> supplierInvoiceDOMap = supplierInvoiceDOList.stream().collect(Collectors.toMap(SupplierInvoiceDO::getSupplierInvoiceId, Function.identity())); Map<Long, SupplierInvoiceDO> supplierInvoiceDOMap = supplierInvoiceDOList.stream().collect(Collectors.toMap(SupplierInvoiceDO::getSupplierInvoiceId, Function.identity()));
@ -215,6 +216,7 @@ public class OrderGatewayImpl implements OrderGateway {
orderSupplierDO.setOrderPackageDOList(orderPackageDOList.stream().filter(orderPackageDO -> orderSupplierDO.getOrderSupplierId().equals(orderPackageDO.getOrderSupplierId())).toList()); orderSupplierDO.setOrderPackageDOList(orderPackageDOList.stream().filter(orderPackageDO -> orderSupplierDO.getOrderSupplierId().equals(orderPackageDO.getOrderSupplierId())).toList());
}); });
} }
}
orderDO.setOrderSupplierDOList(orderSupplierDOList); orderDO.setOrderSupplierDOList(orderSupplierDOList);
@ -916,6 +918,15 @@ public class OrderGatewayImpl implements OrderGateway {
} }
} }
/**
* 生成编码
*/
private String generateInvoiceSn() {
// 生成类似 SO20251105001 格式的编号
return java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.BASIC_ISO_DATE)
+ String.format("%03d", System.currentTimeMillis() % 1000);
}
/** /**
* 处理供应商发票信息 * 处理供应商发票信息
* 逻辑 * 逻辑
@ -936,7 +947,7 @@ public class OrderGatewayImpl implements OrderGateway {
boolean hasInvoiceImg = CollUtil.isNotEmpty(frontendInvoiceImg); boolean hasInvoiceImg = CollUtil.isNotEmpty(frontendInvoiceImg);
// 场景1前端传了invoiceId且与数据库中的invoiceId不一致 // 场景1前端传了invoiceId且与数据库中的invoiceId不一致
if (frontendInvoiceId != null && !frontendInvoiceId.equals(dbInvoiceId)) { if (frontendInvoiceId != null && !frontendInvoiceId.equals(dbInvoiceId) && frontendInvoiceId > 0) {
// 删除旧的发票记录 // 删除旧的发票记录
if (dbInvoiceId != null) { if (dbInvoiceId != null) {
supplierInvoiceMapper.deleteById(dbInvoiceId); supplierInvoiceMapper.deleteById(dbInvoiceId);
@ -956,6 +967,7 @@ public class OrderGatewayImpl implements OrderGateway {
newInvoice.setInvoiceImg(frontendInvoiceImg); newInvoice.setInvoiceImg(frontendInvoiceImg);
newInvoice.setCreatedBy(orderStep2Cmd.getCreatedBy()); newInvoice.setCreatedBy(orderStep2Cmd.getCreatedBy());
newInvoice.setCreatedByName(orderStep2Cmd.getCreatedByName()); newInvoice.setCreatedByName(orderStep2Cmd.getCreatedByName());
newInvoice.setInvoiceSn("INV" + generateInvoiceSn());
// 构建 orderSupplierInvoice 列表 // 构建 orderSupplierInvoice 列表
List<OrderSupplierInvoice> orderSupplierInvoiceList = buildOrderSupplierInvoiceList(supplierDO); List<OrderSupplierInvoice> orderSupplierInvoiceList = buildOrderSupplierInvoiceList(supplierDO);

View File

@ -45,6 +45,7 @@ public class OrderSupplierGatewayImpl implements OrderSupplierGateway {
public IPage<OrderSupplier> page(OrderSupplierPageQry orderSupplierPageQry) { public IPage<OrderSupplier> page(OrderSupplierPageQry orderSupplierPageQry) {
LambdaQueryWrapper<OrderSupplierDO> queryWrapper = Wrappers.lambdaQuery(OrderSupplierDO.class); LambdaQueryWrapper<OrderSupplierDO> queryWrapper = Wrappers.lambdaQuery(OrderSupplierDO.class);
queryWrapper.eq(Objects.nonNull(orderSupplierPageQry.getInvoiceUpload()), OrderSupplierDO::getInvoiceUpload, orderSupplierPageQry.getInvoiceUpload()); queryWrapper.eq(Objects.nonNull(orderSupplierPageQry.getInvoiceUpload()), OrderSupplierDO::getInvoiceUpload, orderSupplierPageQry.getInvoiceUpload());
queryWrapper.eq(Objects.nonNull(orderSupplierPageQry.getInvoiceId()), OrderSupplierDO::getInvoiceId, orderSupplierPageQry.getInvoiceId());
queryWrapper.eq(Objects.nonNull(orderSupplierPageQry.getIsPaid()), OrderSupplierDO::getIsPaid, orderSupplierPageQry.getIsPaid()); queryWrapper.eq(Objects.nonNull(orderSupplierPageQry.getIsPaid()), OrderSupplierDO::getIsPaid, orderSupplierPageQry.getIsPaid());
queryWrapper.orderByDesc(OrderSupplierDO::getCreatedAt); queryWrapper.orderByDesc(OrderSupplierDO::getCreatedAt);

View File

@ -16,14 +16,8 @@ import com.xunhong.erp.turbo.api.biz.dto.qry.PaymentRecordShowQry;
import com.xunhong.erp.turbo.biz.domain.entity.PaymentRecord; import com.xunhong.erp.turbo.biz.domain.entity.PaymentRecord;
import com.xunhong.erp.turbo.biz.domain.gateway.PaymentRecordGateway; import com.xunhong.erp.turbo.biz.domain.gateway.PaymentRecordGateway;
import com.xunhong.erp.turbo.biz.infrastructure.convert.PaymentRecordConvert; import com.xunhong.erp.turbo.biz.infrastructure.convert.PaymentRecordConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.CompanyDO; import com.xunhong.erp.turbo.biz.infrastructure.entity.*;
import com.xunhong.erp.turbo.biz.infrastructure.entity.PaymentRecordDO; import com.xunhong.erp.turbo.biz.infrastructure.mapper.*;
import com.xunhong.erp.turbo.biz.infrastructure.entity.PaymentTaskDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.SupplierDO;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.CompanyMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.PaymentRecordMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.PaymentTaskMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.SupplierMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@ -47,6 +41,8 @@ public class PaymentRecordGatewayImpl implements PaymentRecordGateway {
private final SupplierMapper supplierMapper; private final SupplierMapper supplierMapper;
private final CompanyMapper companyMapper; private final CompanyMapper companyMapper;
private final OrderCostMapper orderCostMapper;
@Override @Override
public PaymentRecord save(PaymentRecordCreateCmd paymentRecordCreateCmd) { public PaymentRecord save(PaymentRecordCreateCmd paymentRecordCreateCmd) {
PaymentRecordDO paymentRecordDO = paymentRecordConvert.toPaymentRecordDO(paymentRecordCreateCmd); PaymentRecordDO paymentRecordDO = paymentRecordConvert.toPaymentRecordDO(paymentRecordCreateCmd);
@ -60,6 +56,9 @@ public class PaymentRecordGatewayImpl implements PaymentRecordGateway {
LambdaQueryWrapper<PaymentRecordDO> queryWrapper = Wrappers.lambdaQuery(PaymentRecordDO.class); LambdaQueryWrapper<PaymentRecordDO> queryWrapper = Wrappers.lambdaQuery(PaymentRecordDO.class);
queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getPaymentTaskId()), PaymentRecordDO::getPaymentTaskId, paymentRecordPageQry.getPaymentTaskId()); queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getPaymentTaskId()), PaymentRecordDO::getPaymentTaskId, paymentRecordPageQry.getPaymentTaskId());
queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getPaymentRecordId()), PaymentRecordDO::getPaymentRecordId, paymentRecordPageQry.getPaymentRecordId()); queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getPaymentRecordId()), PaymentRecordDO::getPaymentRecordId, paymentRecordPageQry.getPaymentRecordId());
queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getTargetType()), PaymentRecordDO::getTargetType, paymentRecordPageQry.getTargetType());
queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getSupplierId()), PaymentRecordDO::getTargetId, paymentRecordPageQry.getSupplierId());
queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getSupplierId()), PaymentRecordDO::getTargetType, PaymentTargetTypeEnum.SUPPLIER);
queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getPaidState()), PaymentRecordDO::getPaidState, paymentRecordPageQry.getPaidState()); queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getPaidState()), PaymentRecordDO::getPaidState, paymentRecordPageQry.getPaidState());
queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getAccountType()), PaymentRecordDO::getAccountType, paymentRecordPageQry.getAccountType()); queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getAccountType()), PaymentRecordDO::getAccountType, paymentRecordPageQry.getAccountType());
queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getAccountCategory()), PaymentRecordDO::getAccountCategory, paymentRecordPageQry.getAccountCategory()); queryWrapper.eq(Objects.nonNull(paymentRecordPageQry.getAccountCategory()), PaymentRecordDO::getAccountCategory, paymentRecordPageQry.getAccountCategory());
@ -68,7 +67,7 @@ public class PaymentRecordGatewayImpl implements PaymentRecordGateway {
queryWrapper.orderByDesc(PaymentRecordDO::getCreatedAt); queryWrapper.orderByDesc(PaymentRecordDO::getCreatedAt);
IPage<PaymentRecordDO> page = new Page<>(paymentRecordPageQry.getPageIndex(), paymentRecordPageQry.getPageSize()); IPage<PaymentRecordDO> page = new Page<>(paymentRecordPageQry.getPageIndex(), paymentRecordPageQry.getPageSize());
page = paymentRecordMapper.selectPage(page, queryWrapper); page = paymentRecordMapper.selectPage(page, queryWrapper, paymentRecordPageQry);
if (PaymentTargetTypeEnum.SUPPLIER.equals(paymentRecordPageQry.getTargetType())) { if (PaymentTargetTypeEnum.SUPPLIER.equals(paymentRecordPageQry.getTargetType())) {
Set<Long> paymentTaskIdList = page.getRecords().stream().map(PaymentRecordDO::getPaymentTaskId).collect(Collectors.toSet()); Set<Long> paymentTaskIdList = page.getRecords().stream().map(PaymentRecordDO::getPaymentTaskId).collect(Collectors.toSet());
@ -96,6 +95,19 @@ public class PaymentRecordGatewayImpl implements PaymentRecordGateway {
} }
} }
if (PaymentTargetTypeEnum.ORDER_COST.equals(paymentRecordPageQry.getTargetType())) {
Set<Long> orderCostIdList = page.getRecords().stream().map(PaymentRecordDO::getTargetId).collect(Collectors.toSet());
if (CollUtil.isNotEmpty(orderCostIdList)) {
LambdaQueryWrapper<OrderCostDO> queryWrapper3 = Wrappers.lambdaQuery(OrderCostDO.class);
queryWrapper3.in(OrderCostDO::getOrderCostId, orderCostIdList);
List<OrderCostDO> orderCostDOList = orderCostMapper.selectList(queryWrapper3);
Map<Long, OrderCostDO> orderCostDOMap = orderCostDOList.stream().collect(Collectors.toMap(OrderCostDO::getOrderCostId, Function.identity()));
page.getRecords().forEach(paymentRecordDO -> {
paymentRecordDO.setOrderCostDO(orderCostDOMap.get(paymentRecordDO.getTargetId()));
});
}
}
Set<Long> companyIdList = page.getRecords().stream().map(PaymentRecordDO::getCompanyId).collect(Collectors.toSet()); Set<Long> companyIdList = page.getRecords().stream().map(PaymentRecordDO::getCompanyId).collect(Collectors.toSet());
if (CollUtil.isNotEmpty(companyIdList)) { if (CollUtil.isNotEmpty(companyIdList)) {
List<CompanyDO> companyDOList = companyMapper.selectByIds(companyIdList); List<CompanyDO> companyDOList = companyMapper.selectByIds(companyIdList);

View File

@ -71,17 +71,6 @@ public class PaymentTaskGatewayImpl implements PaymentTaskGateway {
+ String.format("%03d", System.currentTimeMillis() % 1000); + String.format("%03d", System.currentTimeMillis() % 1000);
} }
/**
* 付款记录编号
*
* @return 付款记录编号
*/
private String generatePaymentRecordSn() {
// 生成类似 PAY20251105001 格式的编号
return "PAY" + java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.BASIC_ISO_DATE)
+ String.format("%03d", System.currentTimeMillis() % 1000);
}
@Override @Override
@Transactional @Transactional
public PaymentTask save(PaymentTaskCreateCmd paymentTaskCreateCmd) { public PaymentTask save(PaymentTaskCreateCmd paymentTaskCreateCmd) {
@ -250,12 +239,12 @@ public class PaymentTaskGatewayImpl implements PaymentTaskGateway {
// 创建付款记录 // 创建付款记录
PaymentRecordDO paymentRecordDO = new PaymentRecordDO(); PaymentRecordDO paymentRecordDO = new PaymentRecordDO();
paymentRecordDO.setPaymentRecordSn(generatePaymentRecordSn()); paymentRecordDO.setPaymentRecordSn(paymentRecordDO.generatePaymentRecordSn());
paymentRecordDO.setPaymentTaskId(paymentTaskPayCmd.getPaymentTaskId()); paymentRecordDO.setPaymentTaskId(paymentTaskPayCmd.getPaymentTaskId());
paymentRecordDO.setTargetId(paymentTaskDO.getTargetId()); paymentRecordDO.setTargetId(paymentTaskDO.getTargetId());
paymentRecordDO.setTargetType(paymentTaskDO.getTaskType().equals(PaymentTaskTypeEnum.MELON_FARMER) paymentRecordDO.setTargetType(paymentTaskDO.getTaskType().equals(PaymentTaskTypeEnum.MELON_FARMER)
? PaymentTargetTypeEnum.SUPPLIER ? PaymentTargetTypeEnum.SUPPLIER
: PaymentTargetTypeEnum.COST); : PaymentTargetTypeEnum.ORDER_COST);
paymentRecordDO.setCompanyId(paymentTaskPayCmd.getCompanyId()); paymentRecordDO.setCompanyId(paymentTaskPayCmd.getCompanyId());
paymentRecordDO.setAccountCategory(paymentTaskPayCmd.getAccountCategory()); paymentRecordDO.setAccountCategory(paymentTaskPayCmd.getAccountCategory());
paymentRecordDO.setAccountType(paymentTaskPayCmd.getAccountType()); paymentRecordDO.setAccountType(paymentTaskPayCmd.getAccountType());

View File

@ -25,6 +25,7 @@ import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.Objects;
/** /**
* @author shenyifei * @author shenyifei
@ -68,10 +69,11 @@ public class SupplierInvoiceGatewayImpl implements SupplierInvoiceGateway {
@Override @Override
public IPage<SupplierInvoice> page(SupplierInvoicePageQry supplierInvoicePageQry) { public IPage<SupplierInvoice> page(SupplierInvoicePageQry supplierInvoicePageQry) {
LambdaQueryWrapper<SupplierInvoiceDO> queryWrapper = Wrappers.lambdaQuery(SupplierInvoiceDO.class); LambdaQueryWrapper<SupplierInvoiceDO> queryWrapper = Wrappers.lambdaQuery(SupplierInvoiceDO.class);
queryWrapper.eq(Objects.nonNull(supplierInvoicePageQry.getSupplierId()), SupplierInvoiceDO::getSupplierId, supplierInvoicePageQry.getSupplierId());
queryWrapper.orderByDesc(SupplierInvoiceDO::getCreatedAt); queryWrapper.orderByDesc(SupplierInvoiceDO::getCreatedAt);
IPage<SupplierInvoiceDO> page = new Page<>(supplierInvoicePageQry.getPageIndex(), supplierInvoicePageQry.getPageSize()); IPage<SupplierInvoiceDO> page = new Page<>(supplierInvoicePageQry.getPageIndex(), supplierInvoicePageQry.getPageSize());
page = supplierInvoiceMapper.selectPage(page, queryWrapper); page = supplierInvoiceMapper.selectPage(page, queryWrapper, supplierInvoicePageQry);
return page.convert(supplierInvoiceConvert::toInvoice); return page.convert(supplierInvoiceConvert::toInvoice);
} }

View File

@ -1,13 +1,19 @@
package com.xunhong.erp.turbo.biz.infrastructure.mapper; package com.xunhong.erp.turbo.biz.infrastructure.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.xunhong.erp.turbo.api.biz.dto.qry.PaymentRecordPageQry;
import com.xunhong.erp.turbo.biz.infrastructure.entity.PaymentRecordDO; import com.xunhong.erp.turbo.biz.infrastructure.entity.PaymentRecordDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/** /**
* @author shenyifei * @author shenyifei
*/ */
@Mapper @Mapper
public interface PaymentRecordMapper extends BaseMapper<PaymentRecordDO> { public interface PaymentRecordMapper extends BaseMapper<PaymentRecordDO> {
IPage<PaymentRecordDO> selectPage(IPage<PaymentRecordDO> page, @Param(Constants.WRAPPER) LambdaQueryWrapper<PaymentRecordDO> queryWrapper, @Param("query") PaymentRecordPageQry paymentRecordPageQry);
} }

View File

@ -1,8 +1,13 @@
package com.xunhong.erp.turbo.biz.infrastructure.mapper; package com.xunhong.erp.turbo.biz.infrastructure.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.xunhong.erp.turbo.api.biz.dto.qry.SupplierInvoicePageQry;
import com.xunhong.erp.turbo.biz.infrastructure.entity.SupplierInvoiceDO; import com.xunhong.erp.turbo.biz.infrastructure.entity.SupplierInvoiceDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/** /**
* 发票记录表Mapper * 发票记录表Mapper
@ -10,4 +15,5 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface SupplierInvoiceMapper extends BaseMapper<SupplierInvoiceDO> { public interface SupplierInvoiceMapper extends BaseMapper<SupplierInvoiceDO> {
IPage<SupplierInvoiceDO> selectPage(IPage<SupplierInvoiceDO> page, @Param(Constants.WRAPPER) LambdaQueryWrapper<SupplierInvoiceDO> queryWrapper, @Param("query") SupplierInvoicePageQry supplierInvoicePageQry);
} }

View File

@ -28,5 +28,29 @@
<result property="isDelete" column="is_delete"/> <result property="isDelete" column="is_delete"/>
<result property="version" column="version"/> <result property="version" column="version"/>
</resultMap> </resultMap>
<select id="selectPage"
resultType="com.xunhong.erp.turbo.biz.infrastructure.entity.PaymentRecordDO"
resultMap="BaseResultMap">
SELECT
pr.*
FROM payment_record pr
<if test="query.costId">
LEFT JOIN order_cost oc ON oc.order_cost_id = pr.target_id and
oc.is_delete = 0 and pr.target_type = 2
</if>
<where>
pr.is_delete = 0
<if test="query.costId">
AND oc.cost_id = #{query.costId}
</if>
<if test="ew != null">
<if test="ew.nonEmptyOfWhere">
AND
</if>
${ew.sqlSegment}
</if>
</where>
</select>
</mapper> </mapper>

View File

@ -1,13 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?> <?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"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="com.xunhong.erp.turbo.biz.infrastructure.mapper.SupplierInvoiceMapper"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<resultMap id="BaseResultMap" type="com.xunhong.erp.turbo.biz.infrastructure.entity.SupplierInvoiceDO"> <mapper
namespace="com.xunhong.erp.turbo.biz.infrastructure.mapper.SupplierInvoiceMapper">
<resultMap id="BaseResultMap"
type="com.xunhong.erp.turbo.biz.infrastructure.entity.SupplierInvoiceDO">
<result property="supplierInvoiceId" column="supplier_invoice_id"/> <result property="supplierInvoiceId" column="supplier_invoice_id"/>
<result property="invoiceSn" column="invoice_sn"/> <result property="invoiceSn" column="invoice_sn"/>
<result property="type" column="type"/> <result property="type" column="type"/>
<result property="supplierId" column="supplier_id"/> <result property="supplierId" column="supplier_id"/>
<result property="supplierName" column="supplier_name"/> <result property="supplierName" column="supplier_name"/>
<result property="orderSupplierInvoiceList" column="order_supplier_invoice" <result property="orderSupplierInvoiceList"
column="order_supplier_invoice"
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/> typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
<result property="invoiceImg" column="invoice_img" <result property="invoiceImg" column="invoice_img"
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/> typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
@ -19,5 +23,32 @@
<result property="isDelete" column="is_delete"/> <result property="isDelete" column="is_delete"/>
<result property="version" column="version"/> <result property="version" column="version"/>
</resultMap> </resultMap>
<select id="selectPage"
resultType="com.xunhong.erp.turbo.biz.infrastructure.entity.SupplierInvoiceDO"
resultMap="BaseResultMap">
SELECT
si.*
FROM supplier_invoice si
<where>
si.is_delete = 0
<if test="query.poStates != null and query.poStates.size() > 0">
AND si.supplier_invoice_id IN (
SELECT invoice_id FROM order_supplier WHERE order_id IN (
SELECT order_id FROM `order` WHERE state IN
<foreach collection="query.poStates" item="state" open="("
separator="," close=")">
#{state.type}
</foreach>
)
)
</if>
<if test="ew != null">
<if test="ew.nonEmptyOfWhere">
AND
</if>
${ew.sqlSegment}
</if>
</where>
</select>
</mapper> </mapper>

View File

@ -1,8 +1,11 @@
package com.xunhong.erp.turbo.api.biz.api; package com.xunhong.erp.turbo.api.biz.api;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd; import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.OrderCostPayCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostPageQry; import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.OrderCostShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.OrderCostVO; import com.xunhong.erp.turbo.api.biz.dto.vo.OrderCostVO;
import com.xunhong.erp.turbo.api.biz.dto.vo.PaymentRecordVO;
import com.xunhong.erp.turbo.base.dto.PageDTO; import com.xunhong.erp.turbo.base.dto.PageDTO;
/** /**
@ -12,5 +15,9 @@ public interface OrderCostServiceI {
PageDTO<OrderCostVO> page(OrderCostPageQry orderCostPageQry); PageDTO<OrderCostVO> page(OrderCostPageQry orderCostPageQry);
OrderCostVO create(OrderCostCreateCmd orderCostCreateCmd); OrderCostVO create(OrderCostCreateCmd orderCostCreateCmd);
OrderCostVO show(OrderCostShowQry orderCostShowQry);
PaymentRecordVO pay(OrderCostPayCmd orderCostPayCmd);
} }

View File

@ -0,0 +1,59 @@
package com.xunhong.erp.turbo.api.biz.dto.cmd;
import com.xunhong.erp.turbo.api.biz.dto.enums.CompanyPaymentAccountCategoryEnum;
import com.xunhong.erp.turbo.api.biz.dto.enums.CompanyPaymentAccountTypeEnum;
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;
import java.time.LocalDateTime;
import java.util.List;
/**
* 费用付款命令
*
* @author shenyifei
*/
@Data
@Schema(title = "费用付款")
@EqualsAndHashCode(callSuper = true)
public class OrderCostPayCmd extends Command {
@Schema(title = "费用ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long orderCostId;
@Schema(title = "付款金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal paidAmount;
@Schema(title = "付款公司ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long companyId;
@Schema(title = "账户类别1_对公账户2_私人账户", requiredMode = Schema.RequiredMode.REQUIRED)
private CompanyPaymentAccountCategoryEnum accountCategory;
@Schema(title = "账户类型1_银行卡2_支付宝3_微信", requiredMode = Schema.RequiredMode.REQUIRED)
private CompanyPaymentAccountTypeEnum accountType;
@Schema(title = "银行名称")
private String bankName;
@Schema(title = "支行名称")
private String branchName;
@Schema(title = "开户公司名称/支付宝昵称/微信号", requiredMode = Schema.RequiredMode.REQUIRED)
private String accountName;
@Schema(title = "银行账号/支付宝账号/微信账号", requiredMode = Schema.RequiredMode.REQUIRED)
private String accountNumber;
@Schema(title = "支付时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime paidAt;
@Schema(title = "支付凭证")
private List<String> paidCredentials;
@Schema(title = "备注")
private String remark;
}

View File

@ -16,7 +16,7 @@ public enum PaymentTargetTypeEnum {
* 付款对象类型1_瓜农2_成本项 * 付款对象类型1_瓜农2_成本项
*/ */
SUPPLIER(1, "瓜农"), SUPPLIER(1, "瓜农"),
COST(2, "成本项"); ORDER_COST(2, "成本项");
@EnumValue @EnumValue
private final int type; private final int type;

View File

@ -0,0 +1,18 @@
package com.xunhong.erp.turbo.api.biz.dto.qry;
import com.xunhong.erp.turbo.base.dto.Query;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author shenyifei
*/
@Data
@Schema(title = "订单成本项详情查询")
@EqualsAndHashCode(callSuper = true)
public class OrderCostShowQry extends Query {
@Schema(title = "费用ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long orderCostId;
}

View File

@ -50,5 +50,8 @@ public class OrderSupplierPageQry extends PageQuery {
*/ */
@Schema(title = "供应商类型1_瓜农2_自家档口3_其他家档口") @Schema(title = "供应商类型1_瓜农2_自家档口3_其他家档口")
private SupplierTypeEnum type; private SupplierTypeEnum type;
@Schema(title = "发票ID", type = "string")
private Long invoiceId;
} }

View File

@ -57,6 +57,18 @@ public class PaymentRecordPageQry extends PageQuery {
@Schema(title = "付款任务ID", type = "string") @Schema(title = "付款任务ID", type = "string")
private Long paymentTaskId; private Long paymentTaskId;
/**
* 供应商ID
*/
@Schema(title = "供应商ID", type = "string")
private Long supplierId;
/**
* 成本项ID
*/
@Schema(title = "成本项ID", type = "string")
private Long costId;
/** /**
* 账户类别1_对公账户2_私人账户 * 账户类别1_对公账户2_私人账户
*/ */

View File

@ -1,10 +1,13 @@
package com.xunhong.erp.turbo.api.biz.dto.qry; package com.xunhong.erp.turbo.api.biz.dto.qry;
import com.xunhong.erp.turbo.api.biz.dto.enums.OrderStateEnum;
import com.xunhong.erp.turbo.base.dto.PageQuery; import com.xunhong.erp.turbo.base.dto.PageQuery;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.List;
/** /**
* @author shenyifei * @author shenyifei
*/ */
@ -15,5 +18,19 @@ public class SupplierInvoicePageQry extends PageQuery {
@Schema(title = "瓜农发票ID", type = "string") @Schema(title = "瓜农发票ID", type = "string")
private Long supplierInvoiceId; private Long supplierInvoiceId;
/**
* 瓜农发票编号
*/
@Schema(title = "瓜农发票编号", type = "string")
private String invoiceSn;
/**
* 发票开具人
*/
@Schema(title = "瓜农发票开具人", type = "string")
private Long supplierId;
@Schema(title = "订单状态")
private List<OrderStateEnum> poStates;
} }

View File

@ -134,5 +134,8 @@ public class PaymentRecordVO extends DTO {
@Schema(title = "公司信息") @Schema(title = "公司信息")
private CompanyVO companyVO; private CompanyVO companyVO;
@Schema(title = "采购订单成本项目信息")
private OrderCostVO orderCostVO;
} }

View File

@ -40,8 +40,12 @@ public enum BizErrorCode implements ErrorCode {
/** /**
* 审核记录不存在 * 审核记录不存在
*/ */
B_BIZ_AUDIT_NOT_FOUND("B_BIZ_AUDIT_NOT_FOUND", "审核记录不存在"); B_BIZ_AUDIT_NOT_FOUND("B_BIZ_AUDIT_NOT_FOUND", "审核记录不存在"),
;
/**
* 费用不存在
*/
B_BIZ_COST_NOT_FOUND("B_BIZ_COST_NOT_FOUND", "费用不存在");;
private final String code; private final String code;