1.项目周报界面完善:表单填写界面以及列表展示中的附件控件修改,新增界面增加开始日期、结束日期。

2.项目周报导出功能完善。
3.机票预订代码导入
dev
lh 2 months ago
parent 3fc03af7af
commit f4ad181d7d

@ -51,4 +51,5 @@ public interface RemoteDeptService {
*/
Map<Long, String> selectDeptNamesByIds(List<Long> deptIds);
Long selectDeptGeneralManagerById(Long deptId);
}

@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.oa.erp.domain.bo.ErpTimesheetInfoBo;
import org.dromara.oa.erp.domain.vo.ErpTimesheetInfoVo;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -107,10 +109,19 @@ public class CrmFlightBookingController extends BaseController {
/**
*
*/
@GetMapping("/getCrmFlightBookingList")
public R<List<CrmFlightBookingVo>> getCrmFlightBookingList(CrmFlightBookingBo bo) {
@GetMapping("/getCrmFlightBookingList") public R<List<CrmFlightBookingVo>> getCrmFlightBookingList(CrmFlightBookingBo bo) {
List<CrmFlightBookingVo> list = crmFlightBookingService.queryList(bo);
return R.ok(list);
}
/**
*
*/
@SaCheckPermission("oa/crm:flightBooking:add")
@Log(title = "机票预订", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/submitAndFlowStart")
public R<CrmFlightBookingVo> submitAndFlowStart(@Validated(AddGroup.class) @RequestBody CrmFlightBookingBo bo) {
return R.ok(crmFlightBookingService.submitAndFlowStart(bo));
}
}

@ -26,7 +26,7 @@ public class CrmFlightBooking extends TenantEntity {
/**
* ID
*/
@TableId(value = "booking_id", type = IdType.AUTO)
@TableId(value = "booking_id", type = IdType.ASSIGN_ID)
private Long bookingId;
/**

@ -104,6 +104,10 @@ public class CrmFlightBookingBo extends BaseEntity {
* ( )
*/
private String handler;
/**
*
*/
private String flowCode;
/**
* {'entity': {}}

@ -5,6 +5,7 @@ import org.dromara.oa.crm.domain.vo.CrmFlightBookingVo;
import org.dromara.oa.crm.domain.bo.CrmFlightBookingBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.oa.erp.domain.vo.ErpTimesheetInfoVo;
import java.util.Collection;
import java.util.List;
@ -66,4 +67,6 @@ public interface ICrmFlightBookingService {
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
CrmFlightBookingVo submitAndFlowStart(CrmFlightBookingBo bo);
}

@ -1,5 +1,13 @@
package org.dromara.oa.crm.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import lombok.extern.slf4j.Slf4j;
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.enums.OAStatusEnum;
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;
@ -9,6 +17,13 @@ import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.oa.erp.domain.ErpProjectPlan;
import org.dromara.oa.erp.domain.vo.ErpProjectPlanVo;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.dromara.workflow.api.event.ProcessEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import org.dromara.oa.crm.domain.bo.CrmFlightBookingBo;
import org.dromara.oa.crm.domain.vo.CrmFlightBookingVo;
@ -16,9 +31,7 @@ import org.dromara.oa.crm.domain.CrmFlightBooking;
import org.dromara.oa.crm.mapper.CrmFlightBookingMapper;
import org.dromara.oa.crm.service.ICrmFlightBookingService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.*;
/**
* Service
@ -28,10 +41,14 @@ import java.util.Collection;
*/
@RequiredArgsConstructor
@Service
@Slf4j
public class CrmFlightBookingServiceImpl implements ICrmFlightBookingService {
private final CrmFlightBookingMapper baseMapper;
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
/**
*
*
@ -140,4 +157,66 @@ public class CrmFlightBookingServiceImpl implements ICrmFlightBookingService {
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
*
*
*
*
*/
@Override
@GlobalTransactional(rollbackFor = Exception.class)
public CrmFlightBookingVo submitAndFlowStart(CrmFlightBookingBo bo) {
CrmFlightBooking add = MapstructUtils.convert(bo, CrmFlightBooking.class);
validEntityBeforeSave(add);
if (StringUtils.isNull(bo.getBookingId())) {
this.insertByBo(bo);
} else {
this.updateByBo(bo);
}
// 后端发起需要忽略权限
bo.getVariables().put("ignore", true);
RemoteStartProcess startProcess = new RemoteStartProcess();
startProcess.setBusinessId(bo.getBookingId().toString());
startProcess.setFlowCode(bo.getFlowCode());
startProcess.setVariables(bo.getVariables());
startProcess.setBizExt(bo.getBizExt());
bo.getBizExt().setBusinessId(startProcess.getBusinessId());
boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess);
if (!flagOne) {
throw new ServiceException("流程发起异常");
}
return MapstructUtils.convert(add, CrmFlightBookingVo.class);
}
/**
* (: 稿退)
*
* @param processEvent
*/
@EventListener(condition = "#processEvent.flowCode =='JPYD'")
public void processHandler(ProcessEvent processEvent) {
TenantHelper.dynamic(processEvent.getTenantId(), () -> {
log.info("当前任务执行了{}", processEvent.toString());
CrmFlightBooking crmFlightBooking = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId()));
crmFlightBooking.setFlowStatus(processEvent.getStatus());
Map<String, Object> params = processEvent.getParams();
if (MapUtil.isNotEmpty(params)) {
// 办理人
String handler = Convert.toStr(params.get("handler"));
}
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) {
crmFlightBooking.setBookingStatus(OAStatusEnum.APPROVING.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
crmFlightBooking.setBookingStatus(OAStatusEnum.COMPLETED.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
crmFlightBooking.setBookingStatus(OAStatusEnum.INVALID.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) {
// 流程驳回:业务状态还原为草稿,允许重新编辑和提交
crmFlightBooking.setBookingStatus(OAStatusEnum.DRAFT.getStatus());
}
baseMapper.updateById(crmFlightBooking);
});
}
}

@ -137,5 +137,13 @@ public class ErpProjectReportDetail extends TenantEntity {
@TableLogic
private String delFlag;
/**
*
*/
private Date beginDate;
/**
*
*/
private Date endDate;
}

@ -180,5 +180,13 @@ public class ErpProjectReportDetailBo extends BaseEntity {
return bizExt;
}
/**
*
*/
private Date beginDate;
/**
*
*/
private Date endDate;
}

@ -181,6 +181,18 @@ public class ErpProjectReportDetailVo extends BaseEntity implements Serializable
@ExcelDictFormat(readConverterExp = "1=是,0=否")
private String activeFlag;
/**
*
*/
@ExcelProperty(value = "开始日期")
@ColumnWidth(20) // 设置列宽为20个字符
private Date beginDate;
/**
*
*/
@ExcelProperty(value = "结束日期")
@ColumnWidth(20) // 设置列宽为20个字符
private Date endDate;
}

@ -16,6 +16,7 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.oa.erp.domain.ErpProjectReport;
import org.dromara.oa.erp.domain.ErpProjectReportDetail;
import org.dromara.oa.erp.domain.bo.ErpProjectReportBo;
import org.dromara.oa.erp.domain.bo.ErpProjectReportDetailBo;
@ -230,6 +231,8 @@ public class ErpProjectReportDetailServiceImpl implements IErpProjectReportDetai
log.info("当前任务执行了{}", processEvent.toString());
ErpProjectReportDetail projectReportDetail = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId()));
projectReportDetail.setFlowStatus(processEvent.getStatus());
ErpProjectReportBo projectReportBo = new ErpProjectReportBo();
projectReportBo.setReportId(projectReportDetail.getReportId());
Map<String, Object> params = processEvent.getParams();
if (MapUtil.isNotEmpty(params)) {
// 办理人
@ -237,16 +240,21 @@ public class ErpProjectReportDetailServiceImpl implements IErpProjectReportDetai
}
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) {
projectReportDetail.setProjectReportStatus(OAStatusEnum.APPROVING.getStatus());
projectReportBo.setStatus(OAStatusEnum.APPROVING.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
projectReportDetail.setProjectReportStatus(OAStatusEnum.COMPLETED.getStatus());
projectReportBo.setStatus((OAStatusEnum.COMPLETED.getStatus()));
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
projectReportDetail.setProjectReportStatus(OAStatusEnum.INVALID.getStatus());
projectReportBo.setStatus(OAStatusEnum.INVALID.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) {
projectReportDetail.setProjectReportStatus(OAStatusEnum.DRAFT.getStatus());
projectReportBo.setStatus(OAStatusEnum.DRAFT.getStatus());
}
baseMapper.updateById(projectReportDetail);
erpProjectReportService.updateByBo(projectReportBo);
});
}
/**

@ -98,5 +98,16 @@ public class RemoteDeptServiceImpl implements RemoteDeptService {
);
return StreamUtils.toMap(list, SysDept::getDeptId, SysDept::getDeptName);
}
/**
* ID
*
* @param deptId ID
* @return ID
*/
@Override
public Long selectDeptGeneralManagerById(Long deptId) {
SysDeptVo vo = deptService.getTopDeptFirstChild(deptId);
return vo.getLeader();
}
}

@ -146,4 +146,6 @@ public interface ISysDeptService {
List<SysDeptVo> selectAllListDept(SysDeptBo dept);
SysDeptVo getTopDeptFirstChild(Long deptId);
}

@ -387,4 +387,54 @@ public class SysDeptServiceImpl implements ISysDeptService {
return baseMapper.selectVoList(lqw);
}
/**
* ID
*
* @param deptId ID
* @return Vo
*/
@Override
public SysDeptVo getTopDeptFirstChild(Long deptId) {
SysDeptVo dept = baseMapper.selectVoById(deptId);
if (ObjectUtil.isNull(dept)) {
return null;
}
// 2. 解析 ancestors 字段
String ancestors = dept.getAncestors();
if (StringUtils.isEmpty(ancestors)) {
// 无祖级列表,自身可视为顶级,返回自身
return dept;
}
// 3. 分割祖先路径为ID数组
// 注意:确认分隔符是逗号(根据您的代码 StringUtils.SEPARATOR 推断)
String[] ancestorIdArray = ancestors.split(StringUtils.SEPARATOR);
// 4. 核心逻辑判断
if (ancestorIdArray.length == 0) {
return dept;
} else if (ancestorIdArray.length == 1) {
// 情况Aancestors只有一个ID即自身ID
// 检查这个ID是否等于parentId。如果相等说明它就是顶级部门root
Long ancestorId = Convert.toLong(ancestorIdArray[0]);
if (ObjectUtil.notEqual(ancestorId, dept.getParentId())) {
// 实际上对于根部门parentId通常为0或nullancestors应为空或仅自身。
// 此分支为逻辑兜底。
}
// 根据需求:本身就是顶级部门,返回自身
return dept;
} else {
// 情况Bancestors有多个ID例如100,101,102
// 第一个ID (ancestorIdArray[0]) 是顶级部门root
// 我们需要的是第二个ID它是顶级部门的直接下属也是当前部门所在分支的“一级子部门”。
String firstChildIdStr = ancestorIdArray[1]; // 索引 1 是第二个元素
if (StringUtils.isNotBlank(firstChildIdStr)) {
Long id = Convert.toLong(firstChildIdStr);
SysDeptVo firstChildDept = baseMapper.selectVoById(id);
return firstChildDept;
} else {
return dept;
}
}
}
}

@ -87,5 +87,15 @@ public class SpelRuleComponent {
return BUSINESS_DIRECTION_TO_USERNAME.get(businessDirection);
}
/**
* id
*/
public Long selectDeptGeneralManagerById(Long initiatorDeptId) {
Long generalManagerId = deptService.selectDeptGeneralManagerById(initiatorDeptId);
if (ObjectUtil.isNull(generalManagerId)) {
throw new ServiceException("当前部门未设置总经理,请联系管理员操作。");
}
return generalManagerId;
}
}

Loading…
Cancel
Save