接入司机开票申请待办流程

This commit is contained in:
jsowell
2026-07-16 17:06:49 +08:00
parent 974e68cf54
commit cbc2e3c721
13 changed files with 353 additions and 20 deletions

View File

@@ -61,7 +61,7 @@ public interface OrderInvoiceRecordService {
* @param orderInvoiceRecord 申请开票
* @return 结果
*/
public int updateOrderInvoiceRecord(OrderInvoiceRecord orderInvoiceRecord);
public int updateOrderInvoiceRecord(OrderInvoiceRecord orderInvoiceRecord, Long operatorId, String operatorName);
/**
* 批量删除申请开票
@@ -69,7 +69,7 @@ public interface OrderInvoiceRecordService {
* @param ids 需要删除的申请开票主键集合
* @return 结果
*/
public int deleteOrderInvoiceRecordByIds(Integer[] ids);
public int deleteOrderInvoiceRecordByIds(Integer[] ids, String operatorName);
/**
* 删除申请开票信息
@@ -77,5 +77,5 @@ public interface OrderInvoiceRecordService {
* @param id 申请开票主键
* @return 结果
*/
public int deleteOrderInvoiceRecordById(Integer id);
public int deleteOrderInvoiceRecordById(Integer id, String operatorName);
}

View File

@@ -2,21 +2,31 @@ package com.jsowell.pile.service.impl;
import com.google.common.collect.Lists;
import com.jsowell.common.core.domain.vo.AuthorizedDeptVO;
import com.jsowell.common.util.StringUtils;
import com.jsowell.pile.domain.OrderInvoiceRecord;
import com.jsowell.pile.domain.PileMerchantInfo;
import com.jsowell.pile.dto.GetInvoiceInfoDTO;
import com.jsowell.pile.dto.QueryInvoiceRecordDTO;
import com.jsowell.pile.mapper.OrderInvoiceRecordMapper;
import com.jsowell.pile.service.MemberInvoiceTitleService;
import com.jsowell.pile.service.OrderInvoiceRecordService;
import com.jsowell.pile.service.OrderBasicInfoService;
import com.jsowell.pile.service.PileMerchantInfoService;
import com.jsowell.pile.util.UserUtils;
import com.jsowell.pile.vo.base.OrderAmountDetailVO;
import com.jsowell.pile.vo.uniapp.customer.InvoiceTitleVO;
import com.jsowell.pile.vo.web.InvoiceRecordVO;
import com.jsowell.pile.vo.web.OrderInvoiceRecordVO;
import com.jsowell.system.constant.TodoTaskConstants;
import com.jsowell.system.domain.dto.TodoTaskCreateCommand;
import com.jsowell.system.service.TodoTaskAssigneeService;
import com.jsowell.system.service.TodoTaskService;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -30,6 +40,11 @@ import java.util.List;
*/
@Service
public class OrderInvoiceRecordServiceImpl implements OrderInvoiceRecordService {
private static final Logger log = LoggerFactory.getLogger(OrderInvoiceRecordServiceImpl.class);
private static final String TODO_TASK_TYPE = "INVOICE_REVIEW";
private static final String TODO_BUSINESS_TYPE = "ORDER_INVOICE_RECORD";
private static final String TODO_ROUTE_NAME = "invoiceDetail";
@Autowired
private OrderInvoiceRecordMapper orderInvoiceRecordMapper;
@@ -39,6 +54,15 @@ public class OrderInvoiceRecordServiceImpl implements OrderInvoiceRecordService
@Autowired
private OrderBasicInfoService orderBasicInfoService;
@Autowired
private PileMerchantInfoService pileMerchantInfoService;
@Autowired
private TodoTaskAssigneeService todoTaskAssigneeService;
@Autowired
private TodoTaskService todoTaskService;
/**
* 查询申请开票
*
@@ -132,8 +156,13 @@ public class OrderInvoiceRecordServiceImpl implements OrderInvoiceRecordService
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int insertOrderInvoiceRecord(OrderInvoiceRecord orderInvoiceRecord) {
return orderInvoiceRecordMapper.insertOrderInvoiceRecord(orderInvoiceRecord);
int rows = orderInvoiceRecordMapper.insertOrderInvoiceRecord(orderInvoiceRecord);
if (rows > 0) {
createInvoiceReviewTodos(orderInvoiceRecord);
}
return rows;
}
/**
@@ -143,8 +172,14 @@ public class OrderInvoiceRecordServiceImpl implements OrderInvoiceRecordService
* @return 结果
*/
@Override
public int updateOrderInvoiceRecord(OrderInvoiceRecord orderInvoiceRecord) {
return orderInvoiceRecordMapper.updateOrderInvoiceRecord(orderInvoiceRecord);
@Transactional(rollbackFor = Exception.class)
public int updateOrderInvoiceRecord(OrderInvoiceRecord orderInvoiceRecord, Long operatorId, String operatorName) {
int rows = orderInvoiceRecordMapper.updateOrderInvoiceRecord(orderInvoiceRecord);
if (rows > 0 && "1".equals(orderInvoiceRecord.getStatus())) {
todoTaskService.completeByBusiness(TODO_BUSINESS_TYPE, String.valueOf(orderInvoiceRecord.getId()),
null, operatorId, operatorName);
}
return rows;
}
/**
@@ -154,8 +189,18 @@ public class OrderInvoiceRecordServiceImpl implements OrderInvoiceRecordService
* @return 结果
*/
@Override
public int deleteOrderInvoiceRecordByIds(Integer[] ids) {
return orderInvoiceRecordMapper.deleteOrderInvoiceRecordByIds(ids);
@Transactional(rollbackFor = Exception.class)
public int deleteOrderInvoiceRecordByIds(Integer[] ids, String operatorName) {
int rows = orderInvoiceRecordMapper.deleteOrderInvoiceRecordByIds(ids);
if (rows > 0 && ids != null) {
for (Integer id : ids) {
if (id != null) {
todoTaskService.cancelByBusiness(TODO_BUSINESS_TYPE, String.valueOf(id), null,
operatorName, "开票申请已关闭");
}
}
}
return rows;
}
/**
@@ -165,7 +210,71 @@ public class OrderInvoiceRecordServiceImpl implements OrderInvoiceRecordService
* @return 结果
*/
@Override
public int deleteOrderInvoiceRecordById(Integer id) {
return orderInvoiceRecordMapper.deleteOrderInvoiceRecordById(id);
@Transactional(rollbackFor = Exception.class)
public int deleteOrderInvoiceRecordById(Integer id, String operatorName) {
int rows = orderInvoiceRecordMapper.deleteOrderInvoiceRecordById(id);
if (rows > 0) {
todoTaskService.cancelByBusiness(TODO_BUSINESS_TYPE, String.valueOf(id), null,
operatorName, "开票申请已关闭");
}
return rows;
}
private void createInvoiceReviewTodos(OrderInvoiceRecord invoiceRecord) {
if (invoiceRecord.getId() == null || StringUtils.isBlank(invoiceRecord.getMerchantId())) {
log.warn("开票申请缺少主键或运营商无法创建待办invoiceId={}, merchantId={}",
invoiceRecord.getId(), invoiceRecord.getMerchantId());
return;
}
PileMerchantInfo merchantInfo;
try {
merchantInfo = pileMerchantInfoService.selectPileMerchantInfoById(Long.parseLong(invoiceRecord.getMerchantId()));
} catch (NumberFormatException exception) {
log.warn("开票申请运营商 ID 非法无法创建待办invoiceId={}, merchantId={}",
invoiceRecord.getId(), invoiceRecord.getMerchantId());
return;
}
if (merchantInfo == null || StringUtils.isBlank(merchantInfo.getDeptId())) {
log.warn("开票申请运营商未配置部门无法创建待办invoiceId={}, merchantId={}",
invoiceRecord.getId(), invoiceRecord.getMerchantId());
return;
}
Long merchantDeptId;
try {
merchantDeptId = Long.parseLong(merchantInfo.getDeptId());
} catch (NumberFormatException exception) {
log.warn("开票申请运营商部门 ID 非法无法创建待办invoiceId={}, deptId={}",
invoiceRecord.getId(), merchantInfo.getDeptId());
return;
}
List<Long> assigneeUserIds = todoTaskAssigneeService.findActiveUserIdsByDeptTree(merchantDeptId);
if (CollectionUtils.isEmpty(assigneeUserIds)) {
log.warn("开票申请运营商部门下没有正常用户无法创建待办invoiceId={}, deptId={}",
invoiceRecord.getId(), merchantInfo.getDeptId());
return;
}
for (Long assigneeUserId : assigneeUserIds) {
String idempotentKey = TODO_TASK_TYPE + ":" + TODO_BUSINESS_TYPE + ":"
+ invoiceRecord.getId() + ":" + assigneeUserId;
todoTaskService.createTask(TodoTaskCreateCommand.builder()
.taskType(TODO_TASK_TYPE)
.title("司机开票申请")
.summary("有新的司机开票申请需要处理,申请单号:" + invoiceRecord.getId())
.businessType(TODO_BUSINESS_TYPE)
.businessId(String.valueOf(invoiceRecord.getId()))
.routeName(TODO_ROUTE_NAME)
.routeParams("{\"params\":{\"id\":\"" + invoiceRecord.getId() + "\"}}")
.assigneeUserId(assigneeUserId)
.assigneeMerchantId(invoiceRecord.getMerchantId())
.priority(TodoTaskConstants.PRIORITY_IMPORTANT)
.idempotentKey(idempotentKey)
.createBy("invoice-system")
.build());
}
}
}