✨ 组织类型改业务字典,并完善金蝶部门代码与MK再提交

组织类型翻译切换为 organization_type;新增金蝶部门代码字段;流程已结束或已通过时强制新建MK表单实例。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-29 03:15:26 +08:00
parent 32cff235e0
commit 087f361a8b
7 changed files with 67 additions and 15 deletions
@@ -138,6 +138,12 @@ public class Dept extends TenantEntity {
@Schema(description = "部门编码") @Schema(description = "部门编码")
private String deptCode; private String deptCode;
/**
* 金蝶部门代码
*/
@Schema(description = "金蝶部门代码")
private String kingdeeDeptCode;
/** /**
* 组织简称 * 组织简称
*/ */
@@ -140,22 +140,23 @@ public class BusinessProcessServiceImpl extends ServiceImpl<BusinessProcessMappe
String bizType = param.getBizType(); String bizType = param.getBizType();
Long bizId = resolveBizIdFromSubmitParam(param); Long bizId = resolveBizIdFromSubmitParam(param);
boolean forceNew = Boolean.TRUE.equals(param.getForceNewFormInstance());
Long formInstanceId = mkFormBindService.resolveOrCreateFormInstanceId(bizType, bizId, forceNew);
String formInstanceIdText = String.valueOf(formInstanceId);
param.setFormInstanceId(formInstanceIdText);
BusinessProcess businessProcess = this.getOne(Wrappers.<BusinessProcess>lambdaQuery() BusinessProcess businessProcess = this.getOne(Wrappers.<BusinessProcess>lambdaQuery()
.eq(BusinessProcess::getBizId, bizId) .eq(BusinessProcess::getBizId, bizId)
.orderByDesc(BusinessProcess::getUpdateTime) .orderByDesc(BusinessProcess::getUpdateTime)
.last("limit 1") .last("limit 1")
); );
// 已有流程实例且 MK 仍能查到详情时,不再删除、不再重新创建提交(强制新建时跳过短路) boolean forceNew = Boolean.TRUE.equals(param.getForceNewFormInstance())
|| shouldForceNewFormInstance(businessProcess, loginName);
Long formInstanceId = mkFormBindService.resolveOrCreateFormInstanceId(bizType, bizId, forceNew);
String formInstanceIdText = String.valueOf(formInstanceId);
param.setFormInstanceId(formInstanceIdText);
// 已有流程实例且 MK 仍能查到详情时,不再删除、不再重新创建提交(强制新建或流程已结束时跳过短路)
if (!forceNew && businessProcess != null && StringUtil.isNotBlank(businessProcess.getProcessInstanceId()) if (!forceNew && businessProcess != null && StringUtil.isNotBlank(businessProcess.getProcessInstanceId())
&& Objects.equals(formInstanceId, businessProcess.getFormInstanceId())) { && Objects.equals(formInstanceId, businessProcess.getFormInstanceId())) {
String existingProcessInstanceId = businessProcess.getProcessInstanceId(); String existingProcessInstanceId = businessProcess.getProcessInstanceId();
Object existingProcessInfo = this.getProcessInfo(existingProcessInstanceId, loginName); Object existingProcessInfo = this.getProcessInfo(existingProcessInstanceId, loginName);
if (hasProcessInfoData(existingProcessInfo)) { if (hasProcessInfoData(existingProcessInfo) && !isMkProcessFinished(existingProcessInfo)) {
log.info("MK流程实例已存在,跳过创建并提交流程 bizId={} formInstanceId={} processInstanceId={}", log.info("MK流程实例已存在,跳过创建并提交流程 bizId={} formInstanceId={} processInstanceId={}",
bizId, formInstanceIdText, existingProcessInstanceId); bizId, formInstanceIdText, existingProcessInstanceId);
businessProcess.setApproveStatus(ApproveStatusEnum.APPROVING.getValue()); businessProcess.setApproveStatus(ApproveStatusEnum.APPROVING.getValue());
@@ -169,6 +170,11 @@ public class BusinessProcessServiceImpl extends ServiceImpl<BusinessProcessMappe
this.syncBizFromProcessInfo(bizType, String.valueOf(bizId), existingProcessInfo); this.syncBizFromProcessInfo(bizType, String.valueOf(bizId), existingProcessInfo);
return existingProcessInstanceId; return existingProcessInstanceId;
} }
// 已结束但仍能查到详情:继续走新建提交流程
forceNew = true;
formInstanceId = mkFormBindService.resolveOrCreateFormInstanceId(bizType, bizId, true);
formInstanceIdText = String.valueOf(formInstanceId);
param.setFormInstanceId(formInstanceIdText);
} }
MKProcessCreateDTO mkParam = new MKProcessCreateDTO(); MKProcessCreateDTO mkParam = new MKProcessCreateDTO();
@@ -231,6 +237,36 @@ public class BusinessProcessServiceImpl extends ServiceImpl<BusinessProcessMappe
} }
} }
/**
* 是否需要强制新建表单实例:本地已通过/已完结,或 MK 流程已结束
*/
private boolean shouldForceNewFormInstance(BusinessProcess businessProcess, String loginName) {
if (businessProcess == null) {
return false;
}
if (Objects.equals(ApproveStatusEnum.APPROVED.getValue(), businessProcess.getApproveStatus())) {
return true;
}
if (businessProcess.getIsCompleted() != null && businessProcess.getIsCompleted() == 1) {
return true;
}
if (StringUtil.isBlank(businessProcess.getProcessInstanceId())) {
return false;
}
String resolvedLoginName = loginName;
if (StringUtil.isBlank(resolvedLoginName)) {
resolvedLoginName = businessProcess.getPromoterLoginName();
}
if (StringUtil.isBlank(resolvedLoginName)) {
resolvedLoginName = resolveCurrentUserPhone();
}
if (StringUtil.isBlank(resolvedLoginName)) {
return false;
}
Object processInfo = this.getProcessInfo(businessProcess.getProcessInstanceId(), resolvedLoginName);
return isMkProcessFinished(processInfo);
}
@Override @Override
public boolean hasMkProcessInstance(String bizId) { public boolean hasMkProcessInstance(String bizId) {
AssertUtils.notBlank(bizId, "业务id不能为空"); AssertUtils.notBlank(bizId, "业务id不能为空");
@@ -44,11 +44,10 @@ import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R; import org.springblade.core.tool.api.R;
import org.springblade.core.tool.support.Kv; import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.Func;
import org.springblade.system.cache.DictCache; import org.springblade.system.cache.DictBizCache;
import org.springblade.system.cache.UserCache; import org.springblade.system.cache.UserCache;
import org.springblade.system.pojo.entity.Dept; import org.springblade.system.pojo.entity.Dept;
import org.springblade.system.pojo.entity.User; import org.springblade.system.pojo.entity.User;
import org.springblade.system.pojo.enums.DictEnum;
import org.springblade.system.pojo.vo.DeptVO; import org.springblade.system.pojo.vo.DeptVO;
import org.springblade.system.pojo.vo.OaOrgSyncPageVO; import org.springblade.system.pojo.vo.OaOrgSyncPageVO;
import org.springblade.system.pojo.vo.UserVO; import org.springblade.system.pojo.vo.UserVO;
@@ -156,7 +155,7 @@ public class DeptController extends BladeController {
CacheUtil.clear(SYS_CACHE, Boolean.FALSE); CacheUtil.clear(SYS_CACHE, Boolean.FALSE);
// 返回懒加载树更新节点所需字段 // 返回懒加载树更新节点所需字段
Kv kv = Kv.create().set("id", String.valueOf(dept.getId())).set("tenantId", dept.getTenantId()) Kv kv = Kv.create().set("id", String.valueOf(dept.getId())).set("tenantId", dept.getTenantId())
.set("deptCategoryName", DictCache.getValue(DictEnum.ORG_CATEGORY, dept.getDeptCategory())); .set("deptCategoryName", DictBizCache.getValue("organization_type", dept.getDeptCategory()));
return R.data(kv); return R.data(kv);
} }
return R.fail("操作失败"); return R.fail("操作失败");
@@ -12,6 +12,7 @@
<result column="leader_id" property="leaderId"/> <result column="leader_id" property="leaderId"/>
<result column="dept_category" property="deptCategory"/> <result column="dept_category" property="deptCategory"/>
<result column="dept_code" property="deptCode"/> <result column="dept_code" property="deptCode"/>
<result column="kingdee_dept_code" property="kingdeeDeptCode"/>
<result column="short_name" property="shortName"/> <result column="short_name" property="shortName"/>
<result column="pinyin_mnemonic" property="pinyinMnemonic"/> <result column="pinyin_mnemonic" property="pinyinMnemonic"/>
<result column="mnemonic_code" property="mnemonicCode"/> <result column="mnemonic_code" property="mnemonicCode"/>
@@ -32,6 +33,7 @@
<result column="leader_id" property="leaderId"/> <result column="leader_id" property="leaderId"/>
<result column="dept_category" property="deptCategory"/> <result column="dept_category" property="deptCategory"/>
<result column="dept_code" property="deptCode"/> <result column="dept_code" property="deptCode"/>
<result column="kingdee_dept_code" property="kingdeeDeptCode"/>
<result column="short_name" property="shortName"/> <result column="short_name" property="shortName"/>
<result column="pinyin_mnemonic" property="pinyinMnemonic"/> <result column="pinyin_mnemonic" property="pinyinMnemonic"/>
<result column="mnemonic_code" property="mnemonicCode"/> <result column="mnemonic_code" property="mnemonicCode"/>
@@ -30,10 +30,9 @@ import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.core.tool.node.ForestNodeMerger; import org.springblade.core.tool.node.ForestNodeMerger;
import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.Func;
import org.springblade.system.cache.DictCache; import org.springblade.system.cache.DictBizCache;
import org.springblade.system.cache.SysCache; import org.springblade.system.cache.SysCache;
import org.springblade.system.pojo.entity.Dept; import org.springblade.system.pojo.entity.Dept;
import org.springblade.system.pojo.enums.DictEnum;
import org.springblade.system.pojo.vo.DeptVO; import org.springblade.system.pojo.vo.DeptVO;
import java.util.List; import java.util.List;
@@ -47,6 +46,11 @@ import java.util.stream.Collectors;
*/ */
public class DeptWrapper extends BaseEntityWrapper<Dept, DeptVO> { public class DeptWrapper extends BaseEntityWrapper<Dept, DeptVO> {
/**
* 组织类型业务字典编码
*/
private static final String ORGANIZATION_TYPE_CODE = "organization_type";
public static DeptWrapper build() { public static DeptWrapper build() {
return new DeptWrapper(); return new DeptWrapper();
} }
@@ -60,7 +64,7 @@ public class DeptWrapper extends BaseEntityWrapper<Dept, DeptVO> {
Dept parent = SysCache.getDept(dept.getParentId()); Dept parent = SysCache.getDept(dept.getParentId());
deptVO.setParentName(parent.getDeptName()); deptVO.setParentName(parent.getDeptName());
} }
String category = DictCache.getValue(DictEnum.ORG_CATEGORY, dept.getDeptCategory()); String category = DictBizCache.getValue(ORGANIZATION_TYPE_CODE, dept.getDeptCategory());
deptVO.setDeptCategoryName(category); deptVO.setDeptCategoryName(category);
return deptVO; return deptVO;
} }
@@ -69,7 +73,7 @@ public class DeptWrapper extends BaseEntityWrapper<Dept, DeptVO> {
public List<DeptVO> listNodeVO(List<Dept> list) { public List<DeptVO> listNodeVO(List<Dept> list) {
List<DeptVO> collect = list.stream().map(dept -> { List<DeptVO> collect = list.stream().map(dept -> {
DeptVO deptVO = BeanUtil.copyProperties(dept, DeptVO.class); DeptVO deptVO = BeanUtil.copyProperties(dept, DeptVO.class);
String category = DictCache.getValue(DictEnum.ORG_CATEGORY, dept.getDeptCategory()); String category = DictBizCache.getValue(ORGANIZATION_TYPE_CODE, dept.getDeptCategory());
Objects.requireNonNull(deptVO).setDeptCategoryName(category); Objects.requireNonNull(deptVO).setDeptCategoryName(category);
return deptVO; return deptVO;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
@@ -78,7 +82,7 @@ public class DeptWrapper extends BaseEntityWrapper<Dept, DeptVO> {
public List<DeptVO> listNodeLazyVO(List<DeptVO> list) { public List<DeptVO> listNodeLazyVO(List<DeptVO> list) {
List<DeptVO> collect = list.stream().peek(dept -> { List<DeptVO> collect = list.stream().peek(dept -> {
String category = DictCache.getValue(DictEnum.ORG_CATEGORY, dept.getDeptCategory()); String category = DictBizCache.getValue(ORGANIZATION_TYPE_CODE, dept.getDeptCategory());
Objects.requireNonNull(dept).setDeptCategoryName(category); Objects.requireNonNull(dept).setDeptCategoryName(category);
}).collect(Collectors.toList()); }).collect(Collectors.toList());
return ForestNodeMerger.merge(collect); return ForestNodeMerger.merge(collect);
@@ -303,6 +303,7 @@ CREATE TABLE `blade_dept` (
`dept_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门名', `dept_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门名',
`full_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门全称', `full_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门全称',
`dept_code` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织编码', `dept_code` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织编码',
`kingdee_dept_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '金蝶部门代码',
`short_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织简称', `short_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织简称',
`pinyin_mnemonic` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '拼音助记码', `pinyin_mnemonic` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '拼音助记码',
`mnemonic_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '助记码', `mnemonic_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '助记码',
@@ -0,0 +1,4 @@
-- 机构表:新增「金蝶部门代码」字段,非必填
ALTER TABLE `blade_dept`
ADD COLUMN `kingdee_dept_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '金蝶部门代码' AFTER `dept_code`;