feat(oa): 实现业务单据后端自动生成编号功能

- 在出差申请服务中集成RemoteCodeRuleService远程服务
- 在售后管理服务中集成RemoteCodeRuleService远程服务
- 在工时填报服务中集成RemoteCodeRuleService远程服务
dev
Yangk 1 day ago
parent 3ce1754e32
commit 10aa754afc

@ -26,6 +26,7 @@ import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.seata.spring.annotation.GlobalTransactional;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.system.api.RemoteCodeRuleService;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.dromara.workflow.api.event.ProcessEvent;
@ -50,6 +51,9 @@ public class CrmBusinessTripApplyServiceImpl implements ICrmBusinessTripApplySer
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@DubboReference()
private RemoteCodeRuleService remoteCodeRuleService;
/**
*
*
@ -144,6 +148,11 @@ public class CrmBusinessTripApplyServiceImpl implements ICrmBusinessTripApplySer
public Boolean insertByBo(CrmBusinessTripApplyBo bo) {
CrmBusinessTripApply add = MapstructUtils.convert(bo, CrmBusinessTripApply.class);
validEntityBeforeSave(add);
// 自动生成申请单号
if (StringUtils.isBlank(add.getApplyCode())) {
String applyCode = remoteCodeRuleService.selectCodeRuleCode("1017");
add.setApplyCode(applyCode);
}
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setTripId(add.getTripId());

@ -106,7 +106,7 @@ public class ErpAfterSalesBo extends BaseEntity {
/**
* ID
*/
@NotBlank(message = "客户干系人ID关联客户联系人表不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "客户干系人ID关联客户联系人表不能为空", groups = { AddGroup.class, EditGroup.class })
private String stakeholderId;
/**

@ -37,7 +37,6 @@ public class ErpTimesheetInfoBo extends BaseEntity {
/**
*
*/
@NotBlank(message = "工时填报编号不能为空", groups = { AddGroup.class, EditGroup.class })
private String timesheetCode;
/**
@ -118,5 +117,4 @@ public class ErpTimesheetInfoBo extends BaseEntity {
*/
private RemoteFlowInstanceBizExt bizExt;
}

@ -9,9 +9,9 @@ import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -25,6 +25,7 @@ import org.dromara.oa.erp.domain.vo.ErpAfterSalesLaborCostsVo;
import org.dromara.oa.erp.domain.vo.ErpAfterSalesMaterialCostsVo;
import org.dromara.oa.erp.service.IErpAfterSalesLaborCostsService;
import org.dromara.oa.erp.service.IErpAfterSalesMaterialCostsService;
import org.dromara.system.api.RemoteCodeRuleService;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.springframework.stereotype.Service;
@ -38,8 +39,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.context.event.EventListener;
import org.dromara.workflow.api.event.ProcessEvent;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -61,6 +60,9 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@DubboReference()
private RemoteCodeRuleService remoteCodeRuleService;
private final IErpAfterSalesLaborCostsService laborCostsService;
private final IErpAfterSalesMaterialCostsService materialCostsService;
@ -71,41 +73,42 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
* @return
*/
@Override
public ErpAfterSalesVo queryById(Long afterSalesId){
public ErpAfterSalesVo queryById(Long afterSalesId) {
ErpAfterSalesVo vo = baseMapper.selectVoById(afterSalesId);
if (vo != null) {
List<ErpAfterSalesLaborCosts> laborEntities = laborCostsService.list(
new LambdaQueryWrapper<ErpAfterSalesLaborCosts>()
.eq(ErpAfterSalesLaborCosts::getAfterSalesId, afterSalesId)
);
List<ErpAfterSalesLaborCostsVo> laborVos = MapstructUtils.convert(laborEntities, ErpAfterSalesLaborCostsVo.class);
new LambdaQueryWrapper<ErpAfterSalesLaborCosts>()
.eq(ErpAfterSalesLaborCosts::getAfterSalesId, afterSalesId));
List<ErpAfterSalesLaborCostsVo> laborVos = MapstructUtils.convert(laborEntities,
ErpAfterSalesLaborCostsVo.class);
vo.setLaborCostsList(laborVos);
List<ErpAfterSalesMaterialCosts> materialEntities = materialCostsService.list(
new LambdaQueryWrapper<ErpAfterSalesMaterialCosts>()
.eq(ErpAfterSalesMaterialCosts::getAfterSalesId, afterSalesId)
);
List<ErpAfterSalesMaterialCostsVo> materialVos = MapstructUtils.convert(materialEntities, ErpAfterSalesMaterialCostsVo.class);
new LambdaQueryWrapper<ErpAfterSalesMaterialCosts>()
.eq(ErpAfterSalesMaterialCosts::getAfterSalesId, afterSalesId));
List<ErpAfterSalesMaterialCostsVo> materialVos = MapstructUtils.convert(materialEntities,
ErpAfterSalesMaterialCostsVo.class);
vo.setMaterialCostsList(materialVos);
}
return vo;
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpAfterSalesVo> queryPageList(ErpAfterSalesBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpAfterSales> lqw = buildQueryWrapper(bo);
// Page<ErpAfterSalesVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
Page<ErpAfterSalesVo> result = baseMapper.selectCustomVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpAfterSalesVo> queryPageList(ErpAfterSalesBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpAfterSales> lqw = buildQueryWrapper(bo);
// Page<ErpAfterSalesVo> result = baseMapper.selectVoPage(pageQuery.build(),
// lqw);
Page<ErpAfterSalesVo> result = baseMapper.selectCustomVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
@ -116,40 +119,48 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
@Override
public List<ErpAfterSalesVo> queryList(ErpAfterSalesBo bo) {
MPJLambdaWrapper<ErpAfterSales> lqw = buildQueryWrapper(bo);
// return baseMapper.selectVoList(lqw);
// return baseMapper.selectVoList(lqw);
return baseMapper.selectCustomVoList(lqw);
}
private MPJLambdaWrapper<ErpAfterSales> buildQueryWrapper(ErpAfterSalesBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpAfterSales> lqw = JoinWrappers.lambda(ErpAfterSales.class)
.selectAll(ErpAfterSales.class)
.eq(ErpAfterSales::getDelFlag, "0")
.eq(StringUtils.isNotBlank(bo.getAfterSalesCode()), ErpAfterSales::getAfterSalesCode, bo.getAfterSalesCode())
.eq(StringUtils.isNotBlank(bo.getAfterSalesSubject()), ErpAfterSales::getAfterSalesSubject, bo.getAfterSalesSubject())
.eq(bo.getProjectId() != null, ErpAfterSales::getProjectId, bo.getProjectId())
.eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpAfterSales::getProjectCode, bo.getProjectCode())
.like(StringUtils.isNotBlank(bo.getProjectName()), ErpAfterSales::getProjectName, bo.getProjectName())
.eq(bo.getCustomerId() != null, ErpAfterSales::getCustomerId, bo.getCustomerId())
.like(StringUtils.isNotBlank(bo.getCustomerName()), ErpAfterSales::getCustomerName, bo.getCustomerName())
.eq(StringUtils.isNotBlank(bo.getContactPerson()), ErpAfterSales::getContactPerson, bo.getContactPerson())
.eq(StringUtils.isNotBlank(bo.getContactPhone()), ErpAfterSales::getContactPhone, bo.getContactPhone())
.eq(bo.getAfterSalesDate() != null, ErpAfterSales::getAfterSalesDate, bo.getAfterSalesDate())
.eq(bo.getContractId() != null, ErpAfterSales::getContractId, bo.getContractId())
.eq(StringUtils.isNotBlank(bo.getContractCode()), ErpAfterSales::getContractCode, bo.getContractCode())
.eq(StringUtils.isNotBlank(bo.getAfterSalesType()), ErpAfterSales::getAfterSalesType, bo.getAfterSalesType())
.eq(StringUtils.isNotBlank(bo.getStakeholderId()), ErpAfterSales::getStakeholderId, bo.getStakeholderId())
.eq(StringUtils.isNotBlank(bo.getHandlerId()), ErpAfterSales::getHandlerId, bo.getHandlerId())
.eq(StringUtils.isNotBlank(bo.getProblemDescription()), ErpAfterSales::getProblemDescription, bo.getProblemDescription())
.eq(bo.getTotalWorkHours() != null, ErpAfterSales::getTotalWorkHours, bo.getTotalWorkHours())
.eq(bo.getTotalCost() != null, ErpAfterSales::getTotalCost, bo.getTotalCost())
.eq(StringUtils.isNotBlank(bo.getSolveStatus()), ErpAfterSales::getSolveStatus, bo.getSolveStatus())
.eq(bo.getCompletionDate() != null, ErpAfterSales::getCompletionDate, bo.getCompletionDate())
.eq(StringUtils.isNotBlank(bo.getProcessingResult()), ErpAfterSales::getProcessingResult, bo.getProcessingResult())
.eq(StringUtils.isNotBlank(bo.getAfterSalesStatus()), ErpAfterSales::getAfterSalesStatus, bo.getAfterSalesStatus())
.eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpAfterSales::getFlowStatus, bo.getFlowStatus())
.eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpAfterSales::getActiveFlag, bo.getActiveFlag())
;
.selectAll(ErpAfterSales.class)
.eq(ErpAfterSales::getDelFlag, "0")
.eq(StringUtils.isNotBlank(bo.getAfterSalesCode()), ErpAfterSales::getAfterSalesCode,
bo.getAfterSalesCode())
.eq(StringUtils.isNotBlank(bo.getAfterSalesSubject()), ErpAfterSales::getAfterSalesSubject,
bo.getAfterSalesSubject())
.eq(bo.getProjectId() != null, ErpAfterSales::getProjectId, bo.getProjectId())
.eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpAfterSales::getProjectCode, bo.getProjectCode())
.like(StringUtils.isNotBlank(bo.getProjectName()), ErpAfterSales::getProjectName, bo.getProjectName())
.eq(bo.getCustomerId() != null, ErpAfterSales::getCustomerId, bo.getCustomerId())
.like(StringUtils.isNotBlank(bo.getCustomerName()), ErpAfterSales::getCustomerName,
bo.getCustomerName())
.eq(StringUtils.isNotBlank(bo.getContactPerson()), ErpAfterSales::getContactPerson,
bo.getContactPerson())
.eq(StringUtils.isNotBlank(bo.getContactPhone()), ErpAfterSales::getContactPhone, bo.getContactPhone())
.eq(bo.getAfterSalesDate() != null, ErpAfterSales::getAfterSalesDate, bo.getAfterSalesDate())
.eq(bo.getContractId() != null, ErpAfterSales::getContractId, bo.getContractId())
.eq(StringUtils.isNotBlank(bo.getContractCode()), ErpAfterSales::getContractCode, bo.getContractCode())
.eq(StringUtils.isNotBlank(bo.getAfterSalesType()), ErpAfterSales::getAfterSalesType,
bo.getAfterSalesType())
.eq(StringUtils.isNotBlank(bo.getStakeholderId()), ErpAfterSales::getStakeholderId,
bo.getStakeholderId())
.eq(StringUtils.isNotBlank(bo.getHandlerId()), ErpAfterSales::getHandlerId, bo.getHandlerId())
.eq(StringUtils.isNotBlank(bo.getProblemDescription()), ErpAfterSales::getProblemDescription,
bo.getProblemDescription())
.eq(bo.getTotalWorkHours() != null, ErpAfterSales::getTotalWorkHours, bo.getTotalWorkHours())
.eq(bo.getTotalCost() != null, ErpAfterSales::getTotalCost, bo.getTotalCost())
.eq(StringUtils.isNotBlank(bo.getSolveStatus()), ErpAfterSales::getSolveStatus, bo.getSolveStatus())
.eq(bo.getCompletionDate() != null, ErpAfterSales::getCompletionDate, bo.getCompletionDate())
.eq(StringUtils.isNotBlank(bo.getProcessingResult()), ErpAfterSales::getProcessingResult,
bo.getProcessingResult())
.eq(StringUtils.isNotBlank(bo.getAfterSalesStatus()), ErpAfterSales::getAfterSalesStatus,
bo.getAfterSalesStatus())
.eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpAfterSales::getFlowStatus, bo.getFlowStatus())
.eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpAfterSales::getActiveFlag, bo.getActiveFlag());
return lqw;
}
@ -165,6 +176,11 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
ErpAfterSales add = MapstructUtils.convert(bo, ErpAfterSales.class);
validEntityBeforeSave(add);
// 自动生成售后编号
if (StringUtils.isBlank(add.getAfterSalesCode())) {
String afterSalesCode = remoteCodeRuleService.selectCodeRuleCode("1012");
add.setAfterSalesCode(afterSalesCode);
}
boolean flag = baseMapper.insert(add) > 0;
bo.setAfterSalesId(add.getAfterSalesId()); // 将生成的 ID 回填给 BO
@ -174,14 +190,16 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
List<ErpAfterSalesLaborCostsBo> laborBoList = bo.getLaborCostsList();
if (CollUtil.isNotEmpty(laborBoList)) {
List<ErpAfterSalesLaborCosts> laborList = MapstructUtils.convert(laborBoList, ErpAfterSalesLaborCosts.class);
List<ErpAfterSalesLaborCosts> laborList = MapstructUtils.convert(laborBoList,
ErpAfterSalesLaborCosts.class);
laborList.forEach(item -> item.setAfterSalesId(afterSalesId));
laborCostsService.saveBatch(laborList);
}
List<ErpAfterSalesMaterialCostsBo> materialBoList = bo.getMaterialCostsList();
if (CollUtil.isNotEmpty(materialBoList)) {
List<ErpAfterSalesMaterialCosts> materialList = MapstructUtils.convert(materialBoList, ErpAfterSalesMaterialCosts.class);
List<ErpAfterSalesMaterialCosts> materialList = MapstructUtils.convert(materialBoList,
ErpAfterSalesMaterialCosts.class);
materialList.forEach(item -> item.setAfterSalesId(afterSalesId));
materialCostsService.saveBatch(materialList);
}
@ -205,15 +223,16 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
if (row > 0) {
Long afterSalesId = bo.getAfterSalesId();
// ================== 处理人员费用 ==================
// ================== 处理人员费用 ==================
// 先删除旧的
laborCostsService.remove(new LambdaQueryWrapper<ErpAfterSalesLaborCosts>()
.eq(ErpAfterSalesLaborCosts::getAfterSalesId, afterSalesId));
.eq(ErpAfterSalesLaborCosts::getAfterSalesId, afterSalesId));
// 后新增新的
List<ErpAfterSalesLaborCostsBo> laborBoList = bo.getLaborCostsList();
if (CollUtil.isNotEmpty(laborBoList)) {
List<ErpAfterSalesLaborCosts> laborList = MapstructUtils.convert(laborBoList, ErpAfterSalesLaborCosts.class);
List<ErpAfterSalesLaborCosts> laborList = MapstructUtils.convert(laborBoList,
ErpAfterSalesLaborCosts.class);
// 遍历列表,清空 ID
laborList.forEach(item -> {
@ -224,13 +243,14 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
laborCostsService.saveBatch(laborList);
}
// ================== 处理材料费用 ==================
// ================== 处理材料费用 ==================
materialCostsService.remove(new LambdaQueryWrapper<ErpAfterSalesMaterialCosts>()
.eq(ErpAfterSalesMaterialCosts::getAfterSalesId, afterSalesId));
.eq(ErpAfterSalesMaterialCosts::getAfterSalesId, afterSalesId));
List<ErpAfterSalesMaterialCostsBo> materialBoList = bo.getMaterialCostsList();
if (CollUtil.isNotEmpty(materialBoList)) {
List<ErpAfterSalesMaterialCosts> materialList = MapstructUtils.convert(materialBoList, ErpAfterSalesMaterialCosts.class);
List<ErpAfterSalesMaterialCosts> materialList = MapstructUtils.convert(materialBoList,
ErpAfterSalesMaterialCosts.class);
materialList.forEach(item -> {
item.setMaterialCostsId(null);
@ -246,8 +266,8 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
/**
*
*/
private void validEntityBeforeSave(ErpAfterSales entity){
//TODO 做一些数据校验,如唯一约束
private void validEntityBeforeSave(ErpAfterSales entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
@ -259,8 +279,8 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
@ -324,7 +344,7 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
TenantHelper.dynamic(processEvent.getTenantId(), () -> {
log.info("【售后流程监听】开始处理: key={}, status={}", processEvent.getFlowCode(), processEvent.getStatus());
// 根据 BusinessId 查询出当前的售后单
// 根据 BusinessId 查询出当前的售后单
Long afterSalesId = Convert.toLong(processEvent.getBusinessId());
ErpAfterSales afterSales = baseMapper.selectById(afterSalesId);
@ -333,10 +353,10 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
return;
}
// 同步流程状态 (flow_status)
// 同步流程状态 (flow_status)
afterSales.setFlowStatus(processEvent.getStatus());
// 根据流程状态,更新业务状态 (after_sales_status)
// 根据流程状态,更新业务状态 (after_sales_status)
String status = processEvent.getStatus();
// A. 审批中
@ -349,12 +369,12 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
}
// C. 驳回 (Back) 或 撤销 (Cancel)
else if (BusinessStatusEnum.BACK.getStatus().equals(status)
|| BusinessStatusEnum.CANCEL.getStatus().equals(status)) {
|| BusinessStatusEnum.CANCEL.getStatus().equals(status)) {
afterSales.setAfterSalesStatus("0");
}
// D. 作废 (Invalid) 或 终止 (Termination)
else if (BusinessStatusEnum.INVALID.getStatus().equals(status)
|| BusinessStatusEnum.TERMINATION.getStatus().equals(status)) {
|| BusinessStatusEnum.TERMINATION.getStatus().equals(status)) {
afterSales.setAfterSalesStatus("0");
}
@ -363,5 +383,4 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService {
});
}
}

@ -72,7 +72,8 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService {
.selectAll(ErpContractMaterial.class)
.eq(contractId != null, ErpContractMaterial::getContractId, contractId)
.eq("t.del_flag", "0");
List<ErpContractMaterialVo> contractMaterialList = contractMaterialMapper.selectCustomErpContractMaterialVoList(lqw);
List<ErpContractMaterialVo> contractMaterialList = contractMaterialMapper
.selectCustomErpContractMaterialVoList(lqw);
contractInfoVo.setContractMaterialList(contractMaterialList);
return contractInfoVo;
}
@ -107,27 +108,38 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpContractInfo> lqw = JoinWrappers.lambda(ErpContractInfo.class)
.selectAll(ErpContractInfo.class)
.eq(StringUtils.isNotBlank(bo.getContractFlag()), ErpContractInfo::getContractFlag, bo.getContractFlag())
.eq(StringUtils.isNotBlank(bo.getContractCode()), ErpContractInfo::getContractCode, bo.getContractCode())
.eq(StringUtils.isNotBlank(bo.getCustomerContractCode()), ErpContractInfo::getCustomerContractCode, bo.getCustomerContractCode())
.like(StringUtils.isNotBlank(bo.getContractName()), ErpContractInfo::getContractName, bo.getContractName())
.eq(StringUtils.isNotBlank(bo.getContractCategory()), ErpContractInfo::getContractCategory, bo.getContractCategory())
.eq(StringUtils.isNotBlank(bo.getContractType()), ErpContractInfo::getContractType, bo.getContractType())
.eq(StringUtils.isNotBlank(bo.getBusinessDirection()), ErpContractInfo::getBusinessDirection, bo.getBusinessDirection())
.eq(StringUtils.isNotBlank(bo.getContractFlag()), ErpContractInfo::getContractFlag,
bo.getContractFlag())
.eq(StringUtils.isNotBlank(bo.getContractCode()), ErpContractInfo::getContractCode,
bo.getContractCode())
.eq(StringUtils.isNotBlank(bo.getCustomerContractCode()), ErpContractInfo::getCustomerContractCode,
bo.getCustomerContractCode())
.like(StringUtils.isNotBlank(bo.getContractName()), ErpContractInfo::getContractName,
bo.getContractName())
.eq(StringUtils.isNotBlank(bo.getContractCategory()), ErpContractInfo::getContractCategory,
bo.getContractCategory())
.eq(StringUtils.isNotBlank(bo.getContractType()), ErpContractInfo::getContractType,
bo.getContractType())
.eq(StringUtils.isNotBlank(bo.getBusinessDirection()), ErpContractInfo::getBusinessDirection,
bo.getBusinessDirection())
.eq(bo.getContractDeptId() != null, ErpContractInfo::getContractDeptId, bo.getContractDeptId())
.eq(bo.getContractDate() != null, ErpContractInfo::getContractDate, bo.getContractDate())
.eq(bo.getTotalPrice() != null, ErpContractInfo::getTotalPrice, bo.getTotalPrice())
.eq(StringUtils.isNotBlank(bo.getContractStatus()), ErpContractInfo::getContractStatus, bo.getContractStatus())
.eq(StringUtils.isNotBlank(bo.getContractStatus()), ErpContractInfo::getContractStatus,
bo.getContractStatus())
.eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpContractInfo::getFlowStatus, bo.getFlowStatus())
.eq(bo.getTemplateId() != null, ErpContractInfo::getTemplateId, bo.getTemplateId())
.eq(StringUtils.isNotBlank(bo.getOssId()), ErpContractInfo::getOssId, bo.getOssId())
.eq(StringUtils.isNotBlank(bo.getPaymentMethod()), ErpContractInfo::getPaymentMethod, bo.getPaymentMethod())
.eq(StringUtils.isNotBlank(bo.getPaymentMethod()), ErpContractInfo::getPaymentMethod,
bo.getPaymentMethod())
.eq(bo.getSignatureAppendix() != null, ErpContractInfo::getSignatureAppendix, bo.getSignatureAppendix())
.eq(bo.getTaxRate() != null, ErpContractInfo::getTaxRate, bo.getTaxRate())
.eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpContractInfo::getActiveFlag, bo.getActiveFlag())
.eq(bo.getContractManagerId() != null, ErpContractInfo::getContractManagerId, bo.getContractManagerId())
.eq(StringUtils.isNotBlank(bo.getCapitalizedAmount()), ErpContractInfo::getCapitalizedAmount, bo.getCapitalizedAmount())
.eq(StringUtils.isNotBlank(bo.getContractTemplateFlag()), ErpContractInfo::getContractTemplateFlag, bo.getContractTemplateFlag())
.eq(StringUtils.isNotBlank(bo.getCapitalizedAmount()), ErpContractInfo::getCapitalizedAmount,
bo.getCapitalizedAmount())
.eq(StringUtils.isNotBlank(bo.getContractTemplateFlag()), ErpContractInfo::getContractTemplateFlag,
bo.getContractTemplateFlag())
.eq("t.del_flag", "0")
.orderByDesc(ErpContractInfo::getCreateTime);
return lqw;
@ -207,7 +219,8 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService {
* @param customerId ID
*/
private void processRelationMaterial(ErpContractMaterial erpContractMaterial, Long customerId) {
if (erpContractMaterial.getMaterialId() != null && customerId != null && erpContractMaterial.getMaterialFlag().equals("1")) {
if (erpContractMaterial.getMaterialId() != null && customerId != null
&& erpContractMaterial.getMaterialFlag().equals("1")) {
Long relationMaterialId = erpContractMaterial.getRelationMaterialId();
// 如果relationMaterialId为空则查询是否存在关联物料信息
if (relationMaterialId == null) {
@ -238,10 +251,11 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService {
*/
private void validEntityBeforeSave(ErpContractInfo entity) {
// 物料列表的强制校验
// if (entity.getContractMaterialList() == null || entity.getContractMaterialList().isEmpty()) {
// throw new ServiceException("请填写合同物料!");
// if (entity.getContractMaterialList() == null ||
// entity.getContractMaterialList().isEmpty()) {
// throw new ServiceException("请填写合同物料!");
// }
//存储合同大写金额
// 存储合同大写金额
if (StringUtils.isNotNull(entity.getTotalPrice())) {
String capitalizedAmount = NumberChineseFormatter.format(entity.getTotalPrice().doubleValue(), true, true);
entity.setCapitalizedAmount(capitalizedAmount);
@ -258,7 +272,7 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService {
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}

@ -10,9 +10,9 @@ import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -26,6 +26,7 @@ import org.dromara.oa.erp.domain.vo.ErpTimesheetDeptVo;
import org.dromara.oa.erp.domain.vo.ErpTimesheetProjectVo;
import org.dromara.oa.erp.service.IErpTimesheetDeptService;
import org.dromara.oa.erp.service.IErpTimesheetProjectService;
import org.dromara.system.api.RemoteCodeRuleService;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.dromara.workflow.api.event.ProcessEvent;
@ -57,6 +58,9 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@DubboReference()
private RemoteCodeRuleService remoteCodeRuleService;
private final IErpTimesheetDeptService timesheetDeptService;
private final IErpTimesheetProjectService timesheetProjectService;
@ -72,33 +76,32 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
if (vo != null) {
// 回显部门工时
List<ErpTimesheetDept> deptList = timesheetDeptService.list(
new LambdaQueryWrapper<ErpTimesheetDept>().eq(ErpTimesheetDept::getTimesheetId, timesheetId)
);
new LambdaQueryWrapper<ErpTimesheetDept>().eq(ErpTimesheetDept::getTimesheetId, timesheetId));
vo.setTimesheetDeptList(MapstructUtils.convert(deptList, ErpTimesheetDeptVo.class));
// 回显项目工时
List<ErpTimesheetProject> projectList = timesheetProjectService.list(
new LambdaQueryWrapper<ErpTimesheetProject>().eq(ErpTimesheetProject::getTimesheetId, timesheetId)
);
new LambdaQueryWrapper<ErpTimesheetProject>().eq(ErpTimesheetProject::getTimesheetId, timesheetId));
vo.setTimesheetProjectList(MapstructUtils.convert(projectList, ErpTimesheetProjectVo.class));
}
return vo;
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpTimesheetInfoVo> queryPageList(ErpTimesheetInfoBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpTimesheetInfo> lqw = buildQueryWrapper(bo);
// Page<ErpTimesheetInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
Page<ErpTimesheetInfoVo> result = baseMapper.selectCustomVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpTimesheetInfoVo> queryPageList(ErpTimesheetInfoBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpTimesheetInfo> lqw = buildQueryWrapper(bo);
// Page<ErpTimesheetInfoVo> result = baseMapper.selectVoPage(pageQuery.build(),
// lqw);
Page<ErpTimesheetInfoVo> result = baseMapper.selectCustomVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
@ -109,7 +112,7 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
@Override
public List<ErpTimesheetInfoVo> queryList(ErpTimesheetInfoBo bo) {
MPJLambdaWrapper<ErpTimesheetInfo> lqw = buildQueryWrapper(bo);
// return baseMapper.selectVoList(lqw);
// return baseMapper.selectVoList(lqw);
return baseMapper.selectCustomVoList(lqw);
}
@ -117,19 +120,20 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
private MPJLambdaWrapper<ErpTimesheetInfo> buildQueryWrapper(ErpTimesheetInfoBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpTimesheetInfo> lqw = JoinWrappers.lambda(ErpTimesheetInfo.class)
.selectAll(ErpTimesheetInfo.class)
.eq(ErpTimesheetInfo::getDelFlag, "0")
.eq(StringUtils.isNotBlank(bo.getTimesheetCode()), ErpTimesheetInfo::getTimesheetCode, bo.getTimesheetCode())
.eq(bo.getUserId() != null, ErpTimesheetInfo::getUserId, bo.getUserId())
.eq(bo.getDeptId() != null, ErpTimesheetInfo::getDeptId, bo.getDeptId())
.eq(bo.getStartTime() != null, ErpTimesheetInfo::getStartTime, bo.getStartTime())
.eq(bo.getEndTime() != null, ErpTimesheetInfo::getEndTime, bo.getEndTime())
.eq(bo.getTotalHours() != null, ErpTimesheetInfo::getTotalHours, bo.getTotalHours())
.eq(bo.getDeptHours() != null, ErpTimesheetInfo::getDeptHours, bo.getDeptHours())
.eq(bo.getProjectHours() != null, ErpTimesheetInfo::getProjectHours, bo.getProjectHours())
.eq(StringUtils.isNotBlank(bo.getTimesheetStatus()), ErpTimesheetInfo::getTimesheetStatus, bo.getTimesheetStatus())
.eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpTimesheetInfo::getFlowStatus, bo.getFlowStatus())
;
.selectAll(ErpTimesheetInfo.class)
.eq(ErpTimesheetInfo::getDelFlag, "0")
.eq(StringUtils.isNotBlank(bo.getTimesheetCode()), ErpTimesheetInfo::getTimesheetCode,
bo.getTimesheetCode())
.eq(bo.getUserId() != null, ErpTimesheetInfo::getUserId, bo.getUserId())
.eq(bo.getDeptId() != null, ErpTimesheetInfo::getDeptId, bo.getDeptId())
.eq(bo.getStartTime() != null, ErpTimesheetInfo::getStartTime, bo.getStartTime())
.eq(bo.getEndTime() != null, ErpTimesheetInfo::getEndTime, bo.getEndTime())
.eq(bo.getTotalHours() != null, ErpTimesheetInfo::getTotalHours, bo.getTotalHours())
.eq(bo.getDeptHours() != null, ErpTimesheetInfo::getDeptHours, bo.getDeptHours())
.eq(bo.getProjectHours() != null, ErpTimesheetInfo::getProjectHours, bo.getProjectHours())
.eq(StringUtils.isNotBlank(bo.getTimesheetStatus()), ErpTimesheetInfo::getTimesheetStatus,
bo.getTimesheetStatus())
.eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpTimesheetInfo::getFlowStatus, bo.getFlowStatus());
return lqw;
}
@ -144,6 +148,11 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
public Boolean insertByBo(ErpTimesheetInfoBo bo) {
ErpTimesheetInfo add = MapstructUtils.convert(bo, ErpTimesheetInfo.class);
validEntityBeforeSave(add);
// 自动生成工时单号
if (StringUtils.isBlank(add.getTimesheetCode())) {
String timesheetCode = remoteCodeRuleService.selectCodeRuleCode("1015");
add.setTimesheetCode(timesheetCode);
}
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
@ -151,7 +160,7 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
bo.setTimesheetId(add.getTimesheetId());
Long timesheetId = add.getTimesheetId();
// 保存部门工时子表
// 保存部门工时子表
List<ErpTimesheetDeptBo> deptBoList = bo.getTimesheetDeptList();
if (CollUtil.isNotEmpty(deptBoList)) {
List<ErpTimesheetDept> list = MapstructUtils.convert(deptBoList, ErpTimesheetDept.class);
@ -159,7 +168,7 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
timesheetDeptService.saveBatch(list);
}
// 保存项目工时子表
// 保存项目工时子表
List<ErpTimesheetProjectBo> projectBoList = bo.getTimesheetProjectList();
if (CollUtil.isNotEmpty(projectBoList)) {
List<ErpTimesheetProject> list = MapstructUtils.convert(projectBoList, ErpTimesheetProject.class);
@ -186,9 +195,9 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
if (row > 0) {
Long timesheetId = bo.getTimesheetId();
// 更新部门工时 (先删后增)
// 更新部门工时 (先删后增)
timesheetDeptService.remove(new LambdaQueryWrapper<ErpTimesheetDept>()
.eq(ErpTimesheetDept::getTimesheetId, timesheetId));
.eq(ErpTimesheetDept::getTimesheetId, timesheetId));
List<ErpTimesheetDeptBo> deptBoList = bo.getTimesheetDeptList();
if (CollUtil.isNotEmpty(deptBoList)) {
@ -200,9 +209,9 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
timesheetDeptService.saveBatch(list);
}
// 更新项目工时 (先删后增)
// 更新项目工时 (先删后增)
timesheetProjectService.remove(new LambdaQueryWrapper<ErpTimesheetProject>()
.eq(ErpTimesheetProject::getTimesheetId, timesheetId));
.eq(ErpTimesheetProject::getTimesheetId, timesheetId));
List<ErpTimesheetProjectBo> projectBoList = bo.getTimesheetProjectList();
if (CollUtil.isNotEmpty(projectBoList)) {
@ -220,8 +229,8 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
/**
*
*/
private void validEntityBeforeSave(ErpTimesheetInfo entity){
//TODO 做一些数据校验,如唯一约束
private void validEntityBeforeSave(ErpTimesheetInfo entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
@ -233,8 +242,8 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
@ -264,35 +273,33 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
List<String> deptApprovers = new ArrayList<>();
if (CollUtil.isNotEmpty(deptList)) {
deptApprovers = deptList.stream()
.map(ErpTimesheetDeptBo::getApproverId)
.filter(Objects::nonNull)
.map(String::valueOf)
.distinct()
.collect(Collectors.toList());
.map(ErpTimesheetDeptBo::getApproverId)
.filter(Objects::nonNull)
.map(String::valueOf)
.distinct()
.collect(Collectors.toList());
}
// deptApprovers (审批人列表)
// deptApprovers (审批人列表)
variables.put("deptApprovers", deptApprovers);
// hasDeptWork (是否有部门工时) - true/false
// hasDeptWork (是否有部门工时) - true/false
variables.put("hasDeptWork", CollUtil.isNotEmpty(deptApprovers));
// --- 处理项目工时审批人 ---
List<ErpTimesheetProjectBo> projectList = bo.getTimesheetProjectList();
List<String> projectApprovers = new ArrayList<>();
if (CollUtil.isNotEmpty(projectList)) {
projectApprovers = projectList.stream()
.map(ErpTimesheetProjectBo::getApproverId)
.filter(Objects::nonNull)
.map(String::valueOf)
.distinct()
.collect(Collectors.toList());
.map(ErpTimesheetProjectBo::getApproverId)
.filter(Objects::nonNull)
.map(String::valueOf)
.distinct()
.collect(Collectors.toList());
}
variables.put("projectApprovers", projectApprovers);
variables.put("hasProjectWork", CollUtil.isNotEmpty(projectApprovers));
RemoteStartProcess startProcess = new RemoteStartProcess();
startProcess.setBusinessId(bo.getTimesheetId().toString());
startProcess.setFlowCode(bo.getFlowCode());
@ -341,12 +348,12 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService {
}
// C. 驳回/撤销
else if (BusinessStatusEnum.BACK.getStatus().equals(status)
|| BusinessStatusEnum.CANCEL.getStatus().equals(status)) {
|| BusinessStatusEnum.CANCEL.getStatus().equals(status)) {
timeSheetInfo.setTimesheetStatus("1");
}
// D. 作废/终止
else if (BusinessStatusEnum.INVALID.getStatus().equals(status)
|| BusinessStatusEnum.TERMINATION.getStatus().equals(status)) {
|| BusinessStatusEnum.TERMINATION.getStatus().equals(status)) {
timeSheetInfo.setTimesheetStatus("4");
}

Loading…
Cancel
Save