From 8a172a0e582c9ff76ed3ea1cb0533dcf74358b11 Mon Sep 17 00:00:00 2001 From: yang chen Date: Wed, 5 Nov 2025 18:46:07 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat(system):=20=E6=96=B0=E5=A2=9E=E4=B8=BB?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=94=A8=E6=88=B7=E5=90=8C=E6=AD=A5=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增用户同步接口 IUserSyncService 及其实现类 UserSyncServiceImpl- 新增用户同步相关 VO 类,包括请求参数和响应结果封装 - 新增用户同步控制器 UserSyncController 提供 RESTful 接口 - 实现从主数据系统同步用户信息至本地系统的完整流程 - 支持用户数据的新增与更新操作,并关联默认部门和角色 - 添加用户名解析逻辑,支持从邮箱或子用户信息中提取用户名 - 使用并行流处理提高大批量用户数据同步性能 - 增加事务管理确保数据一致性及异常回滚机制 --- .../system/controller/UserSyncController.java | 60 ++++++ .../vo/user/sync/MasterRespResult.java | 87 +++++++++ .../vo/user/sync/MasterSystemReqVO.java | 61 +++++++ .../vo/user/sync/MasterUserReqVO.java | 172 ++++++++++++++++++ .../vo/user/sync/MasterUserResultVO.java | 117 ++++++++++++ .../controller/vo/user/sync/SubUserReqVO.java | 73 ++++++++ .../system/service/IUserSyncService.java | 21 +++ .../service/impl/UserSyncServiceImpl.java | 142 +++++++++++++++ 8 files changed, 733 insertions(+) create mode 100644 jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/UserSyncController.java create mode 100644 jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterRespResult.java create mode 100644 jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterSystemReqVO.java create mode 100644 jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterUserReqVO.java create mode 100644 jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterUserResultVO.java create mode 100644 jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/SubUserReqVO.java create mode 100644 jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/service/IUserSyncService.java create mode 100644 jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/service/impl/UserSyncServiceImpl.java diff --git a/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/UserSyncController.java b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/UserSyncController.java new file mode 100644 index 0000000..b6af9f2 --- /dev/null +++ b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/UserSyncController.java @@ -0,0 +1,60 @@ +package com.jeelowcode.service.system.controller; + +import com.jeelowcode.service.system.controller.vo.user.sync.MasterRespResult; +import com.jeelowcode.service.system.controller.vo.user.sync.MasterSystemReqVO; +import com.jeelowcode.service.system.controller.vo.user.sync.MasterUserResultVO; +import com.jeelowcode.service.system.service.IUserSyncService; +import com.jeelowcode.tool.framework.tenant.core.util.TenantUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.stream.Collectors; + +/** + * 从主数据用户同步接口 + * + * @author yangchenjj + */ +@Validated +@RestController +@Tag(name = "从主数据用户同步接口") +@RequestMapping("/system/user-sync") +public class UserSyncController { + + /** + * 用户同步服务 + */ + @Resource + private IUserSyncService userSyncService; + + /** + * 从主数据同步用户 + * + * @param reqVO 请求参数 + * @return 响应结果 + */ + @PostMapping + @Operation(tags = "从主数据用户同步接口", summary = "同步用户") + public MasterRespResult syncUser(@Validated MasterSystemReqVO reqVO) { + try { + // 调用服务,返回数据消费成功结果 + Callable callable = () -> userSyncService.syncUser(reqVO); + // 在租户环境下执行 + return TenantUtils.execute(1L, callable); + } catch (Exception e) { + List mdMappings = reqVO.getMasterData() + .stream().map(md -> MasterUserResultVO.buildFail(md.getMdmCode(), reqVO.getMdType(), null)) + .collect(Collectors.toList()); + // 调用服务失败,返回数据消费失败结果 + return MasterRespResult.buildFail(e.getMessage(), mdMappings); + } + } + +} diff --git a/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterRespResult.java b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterRespResult.java new file mode 100644 index 0000000..65ea401 --- /dev/null +++ b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterRespResult.java @@ -0,0 +1,87 @@ +package com.jeelowcode.service.system.controller.vo.user.sync; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class MasterRespResult { + + // 默认成功消息 + private static final String DEFAULT_SUCCESS_MESSAGE = "消费系统消费这批数据成功!"; + // 默认失败消息 + private static final String DEFAULT_FAIL_MESSAGE = "消费系统消费这批数据失败!"; + + /** + * 是否成功 + */ + private Boolean success; + /** + * 消息 + */ + private String message; + /** + * 映射列表 + */ + private List mdMappings; + + /** + * 构建成功响应结果 + * + * @param mdMappings 映射列表 + * @return 响应结果 + */ + public static MasterRespResult buildSuccess(List mdMappings) { + return buildSuccess(DEFAULT_SUCCESS_MESSAGE, mdMappings); + } + + /** + * 构建成功响应结果 + * + * @param message 消息 + * @param mdMappings 映射列表 + * @return 响应结果 + */ + public static MasterRespResult buildSuccess(String message, List mdMappings) { + return buildMasterResult(true, message, mdMappings); + } + + /** + * 构建失败响应结果 + * + * @param mdMappings 映射列表 + * @return 响应结果 + */ + public static MasterRespResult buildFail(List mdMappings) { + return buildFail(DEFAULT_FAIL_MESSAGE, mdMappings); + } + + /** + * 构建失败响应结果 + * + * @param message 消息 + * @param mdMappings 映射列表 + * @return 响应结果 + */ + public static MasterRespResult buildFail(String message, List mdMappings) { + return buildMasterResult(false, message, mdMappings); + } + + /** + * 构建结果 + * + * @param success 是否成功 + * @param message 消息 + * @param mdMappings 映射列表 + * @return 结果 + */ + public static MasterRespResult buildMasterResult(Boolean success, String message, List mdMappings) { + return new MasterRespResult() + .setSuccess(success) + .setMessage(message) + .setMdMappings(mdMappings); + } + +} diff --git a/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterSystemReqVO.java b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterSystemReqVO.java new file mode 100644 index 0000000..ab96cb6 --- /dev/null +++ b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterSystemReqVO.java @@ -0,0 +1,61 @@ +package com.jeelowcode.service.system.controller.vo.user.sync; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +/** + * 从主数据同步用户请求参数 + * + * @author yangchenjj + */ +@Data +@Schema(description = "从主数据同步用户请求参数") +public class MasterSystemReqVO { + + /** + * 数据分发所触发的类型 + */ + @Schema(description = "数据分发所触发的类型", requiredMode = REQUIRED) + private String action; + + /** + * 数据审批状态 + */ + @Schema(description = "数据审批状态") + private Integer code; + + /** + * 审批拒绝时的详情信息 + */ + @Schema(description = "审批拒绝时的详情信息") + private String msg; + + /** + * 主数据模型的编码 + */ + @Schema(description = "主数据模型的编码", requiredMode = REQUIRED) + private String mdType; + + /** + * 集成系统的编码 + */ + @Schema(description = "集成系统的编码", requiredMode = REQUIRED) + private String systemCode; + + /** + * 消费系统中配置的分发令牌 + */ + @Schema(description = "消费系统中配置的分发令牌", requiredMode = REQUIRED) + private String distributeToken; + + /** + * 主数据同步用户列表 + */ + @Schema(description = "主数据同步用户列表") + private List masterData; + +} diff --git a/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterUserReqVO.java b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterUserReqVO.java new file mode 100644 index 0000000..9c4cc19 --- /dev/null +++ b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterUserReqVO.java @@ -0,0 +1,172 @@ +package com.jeelowcode.service.system.controller.vo.user.sync; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +import java.util.List; + +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +/** + * 主数据同步用户请求参数 + * + * @author yangchenjj + */ +@Data +@Schema(description = "主数据同步用户请求参数") +public class MasterUserReqVO { + + /** + * 数据在此集成系统的唯一值 + */ + @Schema(description = "数据在此集成系统的唯一值") + private String id; + + /** + * 数据在主数据模型唯一编码 + */ + @JsonProperty("mdm_code") + @NotEmpty(message = "数据在主数据模型唯一编码不能为空") + @Schema(description = "数据在主数据模型的唯一编码", requiredMode = REQUIRED) + private String mdmCode; + + /** + * 人员编码 + */ + @JsonProperty("emp_code") + @Schema(description = "人员编码") + private String empCode; + + /** + * 人员名称 + */ + @JsonProperty("emp_name") + @Schema(description = "人员名称") + private String empName; + + /** + * 显示名称 + */ + @JsonProperty("display_name") + @Schema(description = "显示名称") + private String displayName; + + /** + * 性别 + */ + @JsonProperty("sex") + @Schema(description = "性别") + private String sex; + + /** + * 证件类型 + */ + @Schema(description = "证件类型") + @JsonProperty("certificate_type") + private String certificateType; + + /** + * 证件号码 + */ + @JsonProperty("emp_idcard") + @Schema(description = "证件号码") + private String empIdCard; + + /** + * 姓 + */ + @Schema(description = "姓") + @JsonProperty("first_name") + private String firstName; + + /** + * 名 + */ + @Schema(description = "名") + @JsonProperty("last_name") + private String lastName; + + /** + * 出生日期 + */ + @JsonProperty("date_of_birth") + @Schema(description = "出生日期") + private String dateOfBirth; + + /** + * 人员类型 + */ + @JsonProperty("cunc_person_type") + @Schema(description = "人员类型") + private String cuncPersonType; + + /** + * 手机号码 + */ + @Schema(description = "手机号码") + private String mobile; + + /** + * 座机号码 + */ + @Schema(description = "座机号码") + @JsonProperty("phone_number") + private String phoneNumber; + + /** + * 国家或地区 + */ + @Schema(description = "国家或地区") + private String region; + + /** + * 办公地址 + */ + @Schema(description = "办公地址") + @JsonProperty("location_address") + private String locationAddress; + + /** + * 邮箱 + */ + @Schema(description = "邮箱") + private String email; + + /** + * 显示顺序 + */ + @JsonProperty("display_sort") + @Schema(description = "显示顺序") + private String displaySort; + + /** + * 备注 + */ + @Schema(description = "备注") + private String description; + + /** + * 启用状态(0:停用、1:正常、2:注销) + */ + @JsonProperty("usable_status") + @Schema(description = "启用状态(0:停用、1:正常、2:注销)") + private String usableStatus; + + /** + * 头像 + */ + @JsonProperty("emp_photo") + @Schema(description = "头像") + private String empPhoto; + + /** + * 子用户数据 + */ + @JsonProperty("sub_userinfo") + @Schema(description = "子用户数据") + private List subUserInfo; + +} diff --git a/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterUserResultVO.java b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterUserResultVO.java new file mode 100644 index 0000000..29095ed --- /dev/null +++ b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/MasterUserResultVO.java @@ -0,0 +1,117 @@ +package com.jeelowcode.service.system.controller.vo.user.sync; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 主数据同步用户返回结果 + * + * @author yangchenjj + */ +@Data +@Accessors(chain = true) +public class MasterUserResultVO { + + // 主数据在消费系统中的业务id + private static final String JSON_PROPERTY_BUSINESS_DATA_ID = "busidataid"; + // 默认成功消息 + private static final String DEFAULT_SUCCESS_MESSAGE = "该条主数据消费成功!"; + // 默认失败消息 + private static final String DEFAULT_ERROR_MESSAGE = "该条主数据消费失败!"; + + /** + * 主数据的编码 + */ + private String mdmCode; + /** + * 主数据模型的编码 + */ + private String entityCode; + /** + * 主数据在消费系统中的业务id + */ + @JsonProperty(JSON_PROPERTY_BUSINESS_DATA_ID) + private String businessDataId; + /** + * 消息 + */ + private String message; + /** + * 是否成功 + */ + private Boolean success; + + public static MasterUserResultVO buildSuccess(String mdmCode, + String entityCode, + String businessDataId) { + return buildSuccess(mdmCode, entityCode, businessDataId, DEFAULT_SUCCESS_MESSAGE); + } + + /** + * 构建成功响应结果 + * + * @param mdmCode 主数据的编码 + * @param entityCode 主数据模型的编码 + * @param businessDataId 主数据在消费系统中的业务id + * @param message 消息 + * @return MasterUserResult 响应结果 + */ + public static MasterUserResultVO buildSuccess(String mdmCode, + String entityCode, + String businessDataId, + String message) { + return buildMasterResult(mdmCode, entityCode, businessDataId, message, true); + } + + /** + * 构建失败响应结果 + * + * @param mdmCode 主数据的编码 + * @param entityCode 主数据模型的编码 + * @param businessDataId 主数据在消费系统中的业务id + * @return MasterUserResult 响应结果 + */ + public static MasterUserResultVO buildFail(String mdmCode, + String entityCode, + String businessDataId) { + return buildFail(mdmCode, entityCode, businessDataId, DEFAULT_ERROR_MESSAGE); + } + + /** + * 构建失败响应结果 + * + * @param mdmCode 主数据的编码 + * @param entityCode 主数据模型的编码 + * @param businessDataId 主数据在消费系统中的业务id + * @param message 消息 + * @return MasterUserResult 响应结果 + */ + public static MasterUserResultVO buildFail(String mdmCode, + String entityCode, + String businessDataId, + String message) { + return buildMasterResult(mdmCode, entityCode, businessDataId, message, false); + } + + /** + * 构建响应结果 + * + * @param mdmCode 主数据的编码 + * @param entityCode 主数据模型的编码 + * @param businessDataId 主数据在消费系统中的业务id + * @param message 消息 + * @param success 是否成功 + * @return MasterUserResult 响应结果 + */ + public static MasterUserResultVO buildMasterResult(String mdmCode, + String entityCode, + String businessDataId, + String message, Boolean success) { + return new MasterUserResultVO() + .setMdmCode(mdmCode).setEntityCode(entityCode) + .setBusinessDataId(businessDataId).setMessage(message) + .setSuccess(success); + } + +} diff --git a/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/SubUserReqVO.java b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/SubUserReqVO.java new file mode 100644 index 0000000..e277f92 --- /dev/null +++ b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/sync/SubUserReqVO.java @@ -0,0 +1,73 @@ +package com.jeelowcode.service.system.controller.vo.user.sync; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 从主数据同步用户请求参数 + * + * @author yangchenjj + */ +@Data +@Schema(description = "从主数据同步用户请求参数") +public class SubUserReqVO { + + /** + * 数据在此集成系统的唯一值 + */ + @Schema(description = "数据在此集成系统的唯一值") + private String id; + + /** + * 人员编码 + */ + @JsonProperty("emp_code") + @Schema(description = "人员编码") + private String empCode; + + /** + * 账号 + */ + @JsonProperty("user_id") + @Schema(description = "账号") + private String userId; + + /** + * 账号类型 + */ + @JsonProperty("account_type") + @Schema(description = "账号类型") + private String accountType; + + /** + * 账号状态 + */ + @JsonProperty("account_status") + @Schema(description = "账号状态") + private String accountStatus; + + /** + * 人员排序 + */ + @JsonProperty("emp_sort") + @Schema(description = "人员排序") + private String empSort; + + /** + * 启用状态(0:停用、1:正常、2:注销) + */ + @JsonProperty("usable_status") + @Schema(description = "启用状态(0:停用、1:正常、2:注销)") + private String usableStatus; + + /** + * 账号是否为空 + * + * @return true/false + */ + public boolean userIdIsNotEmpty() { + return userId != null && !userId.isEmpty(); + } + +} diff --git a/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/service/IUserSyncService.java b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/service/IUserSyncService.java new file mode 100644 index 0000000..5650b3c --- /dev/null +++ b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/service/IUserSyncService.java @@ -0,0 +1,21 @@ +package com.jeelowcode.service.system.service; + +import com.jeelowcode.service.system.controller.vo.user.sync.MasterRespResult; +import com.jeelowcode.service.system.controller.vo.user.sync.MasterSystemReqVO; + +/** + * 从主数据用户同步接口 + * + * @author yangchenjj + */ +public interface IUserSyncService { + + /** + * 从主数据用户同步接口 + * + * @param reqVO 请求参数 + * @return 响应结果 + */ + MasterRespResult syncUser(MasterSystemReqVO reqVO); + +} diff --git a/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/service/impl/UserSyncServiceImpl.java b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/service/impl/UserSyncServiceImpl.java new file mode 100644 index 0000000..74be6cd --- /dev/null +++ b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/service/impl/UserSyncServiceImpl.java @@ -0,0 +1,142 @@ +package com.jeelowcode.service.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.StrUtil; +import com.jeelowcode.service.system.controller.vo.dept.dept.DeptListReqVO; +import com.jeelowcode.service.system.controller.vo.permission.role.RolePageReqVO; +import com.jeelowcode.service.system.controller.vo.user.sync.*; +import com.jeelowcode.service.system.controller.vo.user.user.UserSaveReqVO; +import com.jeelowcode.service.system.entity.AdminUserDO; +import com.jeelowcode.service.system.entity.DeptDO; +import com.jeelowcode.service.system.entity.RoleDO; +import com.jeelowcode.service.system.service.IAdminUserService; +import com.jeelowcode.service.system.service.IDeptService; +import com.jeelowcode.service.system.service.IRoleService; +import com.jeelowcode.service.system.service.IUserSyncService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 主数据同步用户信息接口实现类 + * + * @author yangchenjj + */ +@Slf4j +@Service +public class UserSyncServiceImpl implements IUserSyncService { + + /** + * 用户服务,懒加载避免循环依赖 + */ + @Lazy + @Resource + private IAdminUserService userService; + /** + * 角色服务,懒加载避免循环依赖 + */ + @Lazy + @Resource + private IRoleService roleService; + /** + * 部门服务,懒加载避免循环依赖 + */ + @Lazy + @Resource + private IDeptService deptService; + + + /** + * 从主数据同步用户 + * + * @param reqVO 请求参数 + * @return 响应结果 + */ + @Override + @Transactional + public MasterRespResult syncUser(MasterSystemReqVO reqVO) { + // 0.1.先检查是否有数据 + if (CollUtil.isEmpty(reqVO.getMasterData())) return MasterRespResult.buildSuccess(Collections.emptyList()); + // 0.2.准备好新用户需要创建的部门信息和角色信息 + List deptList = deptService.getDeptList(new DeptListReqVO().setName("临时部门")); + List roleList = roleService.getRolePage(new RolePageReqVO().setCode("common")).getList(); + Set roleIds = roleList.stream().map(RoleDO::getId).collect(Collectors.toSet()); + List deptInfoList = deptList.stream().map(dept -> new UserSaveReqVO.DeptInfo() + .setDeptId(dept.getId()) + .setRoleIds(roleIds)) + .collect(Collectors.toList()); + // 1.将数据解析出来,这里采用并行处理,这样可以提升性能 + List mdMappings = reqVO.getMasterData().parallelStream().map(md -> { + String username = getUsername(md); + // 2.如果用户名为空,则返回数据消费失败结果 + if (StrUtil.isEmpty(username)) + return MasterUserResultVO.buildFail(md.getMdmCode(), reqVO.getMdType(), null); + AdminUserDO adminUser = userService.getUserByUsername(username); + if (Objects.isNull(adminUser)) { + // 这里需要做插入操作 + try { + UserSaveReqVO userSaveReqVO = new UserSaveReqVO() + .setUsername(username).setNickname(md.getEmpName()) + .setRemark(md.getDescription()).setEmail(md.getEmail()) + .setMobile(md.getMobile()).setPassword(username) + .setSex(Convert.toInt(md.getSex(), 0)) + .setTenantId(1L).setDeptInfoList(deptInfoList); + Long userId = userService.createUser(userSaveReqVO); + return MasterUserResultVO.buildSuccess(md.getMdmCode(), reqVO.getMdType(), String.valueOf(userId)); + } catch (Exception e) { + log.error("用户创建失败", e); + return MasterUserResultVO.buildFail(md.getMdmCode(), reqVO.getMdType(), null); + } + } else { + // 这里需要做更新操作 + try { + UserSaveReqVO userSaveReqVO = new UserSaveReqVO() + .setId(adminUser.getId()).setUsername(username) + .setNickname(md.getEmpName()).setRemark(md.getDescription()) + .setEmail(md.getEmail()).setMobile(md.getMobile()) + .setSex(Convert.toInt(md.getSex(), 0)) + .setTenantId(1L); + userService.updateUser(userSaveReqVO); + return MasterUserResultVO.buildSuccess(md.getMdmCode(), reqVO.getMdType(), String.valueOf(adminUser.getId())); + } catch (Exception e) { + log.error("用户更新失败", e); + return MasterUserResultVO.buildFail(md.getMdmCode(), reqVO.getMdType(), String.valueOf(adminUser.getId())); + } + } + }).collect(Collectors.toList()); + return MasterRespResult.buildSuccess(mdMappings); + } + + + /** + * 获取用户名 + * + * @param masterUser 主数据用户信息 + * @return 用户名 + */ + private String getUsername(MasterUserReqVO masterUser) { + // 首先获取邮箱,如果邮箱数据存在,则从邮箱中取 + String email = masterUser.getEmail(); + if (StrUtil.isNotEmpty(email) && Validator.isEmail(email)) return email.split("@")[0]; + // 如果邮箱中没有,则从用户信息中取得 + if (CollUtil.isNotEmpty(masterUser.getSubUserInfo())) { + String username = masterUser.getSubUserInfo().stream() + .filter(SubUserReqVO::userIdIsNotEmpty).findFirst() + .map(SubUserReqVO::getUserId).orElse(null); + if (StrUtil.isNotEmpty(username)) return username; + } + // 最后,实在找不到,则无法解析到用户名信息,返回null + return null; + } + +} From f4ea8f4e2847110144195adabed3ab16dddd038a Mon Sep 17 00:00:00 2001 From: yang chen Date: Thu, 6 Nov 2025 21:23:49 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat(user):=20=E8=B0=83=E6=95=B4=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=B4=A6=E5=8F=B7=E6=A0=A1=E9=AA=8C=E8=A7=84=E5=88=99?= =?UTF-8?q?-=20=E4=BF=AE=E6=94=B9=E7=94=A8=E6=88=B7=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E6=AD=A3=E5=88=99=E8=A1=A8=E8=BE=BE=E5=BC=8F=EF=BC=8C=E5=85=81?= =?UTF-8?q?=E8=AE=B8=E6=9C=80=E7=9F=AD1=E4=B8=AA=E5=AD=97=E7=AC=A6=20-=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=94=A8=E6=88=B7=E8=B4=A6=E5=8F=B7=E9=95=BF?= =?UTF-8?q?=E5=BA=A6=E9=99=90=E5=88=B6=E4=B8=BA1-30=E4=B8=AA=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=20-=20=E4=BF=9D=E6=8C=81=E5=8E=9F=E6=9C=89=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E3=80=81=E5=AD=97=E6=AF=8D=E3=80=81=E4=B8=8B=E5=88=92?= =?UTF-8?q?=E7=BA=BF=E7=BB=84=E6=88=90=E8=A7=84=E5=88=99=E4=B8=8D=E5=8F=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/system/controller/vo/user/user/UserSaveReqVO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/user/UserSaveReqVO.java b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/user/UserSaveReqVO.java index c0b175a..c656024 100644 --- a/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/user/UserSaveReqVO.java +++ b/jeelowcode-service/jeelowcode-service-system-biz/src/main/java/com/jeelowcode/service/system/controller/vo/user/user/UserSaveReqVO.java @@ -20,8 +20,8 @@ public class UserSaveReqVO { @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "jeelowcode") @NotBlank(message = "用户账号不能为空") - @Pattern(regexp = "^[a-zA-Z0-9_]{4,30}$", message = "用户账号由 数字、字母、下划线 组成") - @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") + @Pattern(regexp = "^[a-zA-Z0-9_]{1,30}$", message = "用户账号由 数字、字母、下划线 组成") + @Size(min = 1, max = 30, message = "用户账号长度为 1-30 个字符") private String username; @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") From bbe06850390d26826de377cbac1fa4188acec408 Mon Sep 17 00:00:00 2001 From: yang chen Date: Fri, 7 Nov 2025 13:57:50 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat(lowcode):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E5=9F=BA=E7=A1=80=E8=B5=84=E6=96=99=E8=A1=A8?= =?UTF-8?q?=E5=8D=95JS=E5=A2=9E=E5=BC=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新了表单JS增强中的请求参数传递方式,将data改为params - 调整了字典数据请求接口的调用结构 - 优化了表单初始化和提交前的数据处理逻辑 - 更新了表单设计器配置及国际化字段 -修正了资料分类关联逻辑和二级分类过滤规则 - 改进了前端样式和布局细节,提升用户体验 --- .../20251104/lc_basic_safety_information.sql | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/SQL/202511/20251104/lc_basic_safety_information.sql b/SQL/202511/20251104/lc_basic_safety_information.sql index 629594a..cb88181 100644 --- a/SQL/202511/20251104/lc_basic_safety_information.sql +++ b/SQL/202511/20251104/lc_basic_safety_information.sql @@ -1,6 +1,6 @@ -- 只更新表单和自定义表单的JS增强,不更新其他信息 DELETE FROM "LOWCODE_FRAME"."LOWCODE_DBFORM_ENHANCE_JS" WHERE DBFORM_ID IN (SELECT ID FROM "LOWCODE_FRAME"."LOWCODE_DBFORM" WHERE TABLE_NAME IN ('lc_basic_safety_information') AND IS_DELETED = 0); -insert into "LOWCODE_FRAME"."LOWCODE_DBFORM_ENHANCE_JS"("ID", "TENANT_ID", "CREATE_USER", "CREATE_TIME", "CREATE_DEPT", "UPDATE_USER", "UPDATE_TIME", "IS_DELETED", "DBFORM_ID", "JS_TYPE", "JS_JSON") values(1966513983428063233, 1, 1, '2025-09-12 22:47:24', 100, 1, '2025-10-23 11:33:12', 0, 1966386366515343361, 'js', 'function isNotEmptyArray(arr) { +insert into "LOWCODE_FRAME"."LOWCODE_DBFORM_ENHANCE_JS"("ID", "TENANT_ID", "CREATE_USER", "CREATE_TIME", "CREATE_DEPT", "UPDATE_USER", "UPDATE_TIME", "IS_DELETED", "DBFORM_ID", "JS_TYPE", "JS_JSON") values(1966513983428063233, 1, 1, '2025-09-12 22:47:24', 100, 1, '2025-11-07 13:29:31', 0, 1966386366515343361, 'js', 'function isNotEmptyArray(arr) { return Array.isArray(arr) && arr.length > 0; } @@ -26,8 +26,9 @@ function getFileName(url) { return { initOption() { //表格显示前执行 // 修改资料分类的名称(分别为搜索栏以及表格列) - useFun.requestApi(''get'', ''/system/dict-data/page?dictType=basic_safety_main_category'', { - data: { + useFun.requestApi(''get'', ''/system/dict-data/page'', { + params: { + "dictType": ''basic_safety_main_category'', "pageNo": 1, "pageSize": -1 } @@ -54,8 +55,9 @@ return { tableOption.value.column.department_id.label = ''部门'' // 处理一下二级分类的内容 - useFun.requestApi(''get'', ''/system/dict-data/page?dictType=basic_safety_sub_category'', { - data: { + useFun.requestApi(''get'', ''/system/dict-data/page'', { + params: { + "dictType": ''basic_safety_sub_category'', "pageNo": 1, "pageSize": -1 } @@ -113,4 +115,4 @@ return { }, }'); DELETE FROM "LOWCODE_FRAME"."LOWCODE_DESFORM" WHERE ID IN (SELECT DESFORM_WEB_ID FROM "LOWCODE_FRAME"."LOWCODE_DBFORM" WHERE TABLE_NAME IN ('lc_basic_safety_information') AND IS_DELETED = 0); -insert into "LOWCODE_FRAME"."LOWCODE_DESFORM"("ID", "TENANT_ID", "CREATE_USER", "CREATE_TIME", "CREATE_DEPT", "UPDATE_USER", "UPDATE_TIME", "IS_DELETED", "DESFORM_NAME", "DESFORM_JSON", "GROUP_DESFORM_ID", "IS_OPEN", "IS_TEMPLATE", "IS_HIDE", "I18N_DATA") values(1966404735134167042, 1, 1, '2025-09-12 15:33:18', 100, 1, '2025-11-04 09:36:17', 0, '安全基础资料表', '{"jsEnhance":"return {\n initData(formData) { //表单赋值前执行\n return new Promise(async (resolve, reject) => {\n let res = await useFun.requestApi(''get'', ''/system/dict-data/page?dictType=basic_safety_main_category'', {\n data: {\n \"pageNo\": 1,\n \"pageSize\": -1\n }\n })\n let dictData = res.list\n let dataMap = {};\n dictData.forEach(item => {\n dataMap[item.value] = item.label\n })\n let file_main_name = dataMap[formData.file_main_type]\n if (file_main_name != undefined) {\n useFun.setPropConfig(''file_sub_type'', { label: `${file_main_name}分类` })\n formData.$file_main_type = file_main_name\n } else {\n useFun.setPropConfig(''file_sub_type'', { label: ''资料分类'' })\n }\n\n // 二级分类与一级分类相关联\n useFun.requestApi(''get'', ''/system/dict-data/page?dictType=basic_safety_sub_category'', {\n data: {\n \"pageNo\": 1,\n \"pageSize\": -1\n }\n }).then(res => {\n let filtered = res.list.filter(item => item.value.startsWith(formData.file_main_type))\n let propConfig = useFun.getPropConfig(''file_sub_type'')\n useFun.setPropConfig(''file_sub_type'', { dicData: filtered })\n })\n resolve(formData)\n })\n },\n beforeSubmit(submitData) { //表单提交前执行\n // 将属性名配置正常\n submitData.department_name = formData.value.$department_id\n submitData.file_sub_type_name = formData.value.$file_sub_type\n submitData.file_main_type_name = formData.value.$file_main_type\n return new Promise((resolve, reject) => {\n resolve(submitData)\n })\n },\n}\n","scssEnhance":".low-form__1966404735134167042 {\n padding: 0 0 !important;\n\n .avue-form__group avue-form__group--flex {}\n\n .el-card__body {\n padding: unset !important;\n }\n\n .control-fields_2089442 {\n min-width: 341px !important;\n max-width: 341px !important;\n }\n\n .control-approveStatusName {\n min-width: 64%;\n }\n\n .el-col-md-3 {\n margin-left: 0 !important;\n }\n\n .control-fields_2642050 {\n left: 90px;\n min-width: 164px !important;\n max-width: 164px !important;\n }\n\n .control-fields_9126239 {\n left: 34px;\n min-width: 164px !important;\n max-width: 164px !important;\n }\n\n .control-create_time {\n left: -49px;\n top: 5px;\n\n p {\n margin: unset !important;\n }\n }\n\n .control-billNo {\n left: 2px;\n bottom: -5px;\n min-width: 234px !important;\n max-width: 234px !important;\n\n p {\n margin: unset !important;\n }\n }\n\n .avue-form.avue--detail {\n\n .head_title,\n .head_detail_label,\n .head_detail_label,\n .head_type_value,\n .head_number_label,\n .head_number_value,\n .head_created_time_label,\n .head_created_time_value,\n .head_status_label,\n .head_separator2,\n .head_separator1 {\n margin-top: unset !important;\n }\n\n .ce_class {\n top: 7px !important;\n }\n\n .control-create_time {\n left: -40px !important;\n top: -6px !important;\n }\n\n * {\n border: none !important;\n }\n\n .control-approveStatusName {\n margin-top: 0 !important;\n border: none !important;\n }\n\n .control-fields_9126239 {\n left: 34px !important;\n top: -11px;\n }\n\n .control-fields_2642050 {\n left: 89px !important;\n top: -11px;\n }\n\n .control-billNo {\n left: 40 !important;\n top: -5px !important;\n }\n\n .head_title {\n border: none !important;\n }\n }\n\n .bottom_class {\n position: relative;\n bottom: 31px;\n }\n\n .dash_class {\n border-bottom: 1px dashed #999 !important;\n }\n\n //样式请写在当前位置内\n // .el-collapse-content-873.avue-form__group {\n // border-bottom: 1px dashed #999;\n // }\n .avue-form__group {\n\n .control-fields_7103563.head_title,\n .control-fields_2247746.head_status_value {\n line-height: 20px !important;\n border: none !important;\n font-weight: 700 !important;\n color: #141414 !important;\n\n .avue-title p {\n font-size: 20px !important;\n }\n\n }\n\n .control-fields_2247746.head_status_value {\n // left: calc(16% + 25px);\n color: green !important;\n // color: #999;\n font-size: 14px !important;\n\n .avue-title p {\n font-size: 14px !important;\n }\n }\n\n .head_status_value {\n margin-top: 30px !important;\n }\n\n .head_title,\n .head_detail_label {\n margin-left: 90px !important;\n margin-top: 30px !important;\n }\n\n .head_detail_label,\n .head_type_value,\n .head_number_label,\n .head_number_value,\n .head_created_time_label,\n .head_created_time_value,\n .head_status_label,\n .head_separator2,\n .head_separator1 {\n border: none !important;\n color: #999 !important;\n margin-top: -30px !important;\n\n .avue-title p {\n font-size: 14px !important;\n font-weight: 400 !important;\n }\n }\n\n .control-fields_3957948.head_type_value {\n // left: calc(10% + 25px);\n }\n\n .head_separator1,\n .head_separator2,\n .head_separator3 {\n line-height: 20px !important;\n color: #C7C7C7 !important;\n }\n\n .control-fields_6000884.head_separator2 {\n // left: calc(30% + 25px);\n }\n\n // .control-fields_5375235.head_separator3 {\n // left: 45%;\n // }\n\n .control-fields_2642050.head_number_label {\n // left: calc(16% + 25px);\n }\n\n .control-fields_225062.head_number_value {\n // left: calc(22% + 25px);\n }\n\n .control-fields_9126239.head_created_time_label {\n // left: calc(31% + 25px);\n }\n\n .control-fields_4975109.head_created_time_value {\n // left: calc(37% + 25px);\n\n .avue-title p {\n // width: 200px;\n }\n }\n\n // .control-fields_7337553.head_status_label {\n // left: 43%;\n // }\n\n\n\n .ce_class {\n min-width: 65px !important;\n max-width: 65px !important;\n min-height: 65px !important;\n max-height: 65px !important;\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAAB6CAYAAABne9ctAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAGdYAABnWARjRyu0AAAVcSURBVHhe7d1LUxxVGIDht5kLDMMlYCQQLhK14i1aikZFLRdm4S6lG80iP4GdP8S1K6t04ULLbLyU942pMotYFkkKUhiIhigIBJARhhlm2sWBAg4Bp0Of5nz4PVUsOE1lQt6Z092neybBfCEMUWLV2QNKFg0onAYUTgMKpwGF04DCaUDhNKBwGlA4DSicBhROAwqnAYXTgMJpQOE0oHAaUDgNKJwGFE4DCqcBhdOAwmlA4TSgcBpQOA0onAYUTgMKpwGFC5J6d1JxDQolqFTtLZ4KoDkLuQwE9jaPOA9YqsDILFy6DXdWoOr00eLVmIFTHfBaP9R5WtF5wJFZ+GAYbtyBspRX3xb3N8L5p+DVPnuLH5zuA1fKJuCY0HgAM8vw2Zg96g+nAVcrZtoUs9/bxcS8PeIPpwHDUNY+bzdrHj8BnQZU7mlA4TSgcBpQOA0onAYUTgMKpwGF04DCaUDhnF6NmF+BT0bgi1/tLXtrz8FAJ3Tk472Ms1KGy1Nwc8He8t8uvGWP+MG7gB15ePtxeKYT6tP21v2phObv9O6l6BF9DejdFNqeg8EeaMuZC6pxfjVnobcFBrvtR5XLu4DVqrkM5VLR8Z+fJOcBo87Ptwvw+Risrtlb4nFtBr6MMKX7zrt94IaWeuhsivcgprAKk0v2aG183Qc6D/jxyOF4xvsa0PkUqtzSgMJpQOE0oHAaUDjnR6H3ehqRS0NrQ7zvSyiuwXzRHq2Nr0eh3gWsT8PTx+CVPnMuGGfAtSqMzsKno9Hv9dSANXqgFYZOw4Nt8Z7Eb1gqwXuX4eIte8vefA3o3T6wMQM9LW7iATRl4ESbPSqXdwELJfht0R6NTwhcnbZH5fJuCg0C6GuB1x8yl37ifCUuleDrcfhlKvp7NnydQp0H1LVQt7ybQlU0GlA4DSicBhROAwqnAYVzfhoR9TwwFcDxZnNfaFvO3np31RAWijA87W4R4I1H7JG9vdwLD7fbo/HzLuCxPJw7Bc91QVPW3np3YQiFMvw0aRaqpwr2TyRv6Hk402+Pxs/5FBr12dGegxe6a4/H+upNcxYeOwp9rfbWw815wKjKFVhatUdrU6qY9z/8nzgPGHUp84+CmXb/jHD/ZjWEyb/NOuf1OXvr4eZ8H3gva6GZOmhIQ6rGp1e4fkt+sWJewS68f9Ye2XTxFlwYhbmVzbGh03DmxNafcqPGf6JklavmysFCsbavxaL5eVfxAI407P7VmIn3qkkUXgZUtdOAwmlA4TSgcBpQOLcBg4M7OotbZY+TrUq4c8UpldDv7TRgev187jDYeo5nK5TMXd9b5SMsBe6H04D1KWitt0dl+mHCHjFmlmFiYecSXkd++/euOA2YqYOjjeYWeem+nYDvJrbfkj+7DF/dgCvT26fYriZob9j83iWnS2lgPo/lw2H4ecreIkuAeTKevA/6j5gPcr8+B+PzsGgtvr/5KJx7ArKp7eMuOA9YrsD3N+Gjqzt/UYlSdeadUyFQLO88uOltgXcGzWWtJI5jnE6hAJkUvNhj3m2Ucf5o7lWq5qDln9LOeE1Z88rrbk4mHkkEBHMgc/ak+QSmdCKPmLx8Bs4/CQNdyf6OzqfQrQolc8vDN+PmGZzYAzsUBNDTbP57noHOZOORdMAN12bgx9/hyl/mMlA1NPe1iBCY6TGbMkebzx6Hl3rMvTwH4UACbrW4CnPLO/cnvgowixPt6x/Gd9AOPKDan4RnbBU3DSicBhROAwqnAYXTgMJpQOE0oHAaUDgNKJwGFE4DCqcBhdOAwmlA4TSgcBpQOA0onAYUTgMKpwGF04DCaUDhNKBwGlA4DSicBhTuX6X4xrCOgSlsAAAAAElFTkSuQmCC\");\n background-size: cover !important;\n background-repeat: no-repeat !important;\n border-radius: 20% !important;\n position: absolute !important;\n top: 30px !important;\n margin-left: 20px !important;\n z-index: 1 !important;\n }\n\n .el-collapse-item__content {\n .avue-form__group {\n // justify-content: center !important;\n }\n }\n\n .el-form-item__content {\n border: none !important;\n padding: 0 !important;\n }\n\n\n }\n}","labelPosition":"right","labelSuffix":"","labelWidth":10,"gutter":0,"menuBtn":true,"submitBtn":true,"submitText":"提交","emptyBtn":true,"emptyText":"清空","externalTitle":"","menuPosition":"center","size":"default","isSubmitTable":true,"column":{},"tableDesignId":"1966386366515343361","group":[{"type":"layoutGroup","controlType":"layout","label":"基本信息","controlTip":"该布局只能放置在最底部","arrow":true,"collapse":true,"column":{"file_name":{"type":"input","controlType":"input","label":"资料名称","readonly":false,"clearable":true,"display":true,"span":22,"disabled":false,"required":true,"hideLabel":false,"i18nCode":"fields_867779","offset":1,"labelWidth":110,"verifyConfig":"[{\"label\":\"字符长度校验\",\"type\":\"leng\",\"controlType\":\"length\",\"leng_type\":\"all\",\"prop\":\"option_7505248\",\"display\":true,\"leng_max\":128}]"},"department_id":{"type":"deptSelect","controlType":"select","label":"所属部门","findType":"sub","display":true,"span":11,"disabled":false,"required":true,"hideLabel":false,"i18nCode":"fields_1781150","labelWidth":110,"textFormatter":"{dicText}({dicCode})","offset":1},"file_sub_type":{"type":"select","controlType":"select","label":"资料分类","clearable":true,"collapseTags":true,"maxCollapseTags":1,"dicType":"code","staticDicData":[{"label":"字典1","value":"dic_1"},{"label":"字典2","value":"dic_2"}],"display":true,"span":11,"disabled":false,"required":true,"hideLabel":false,"i18nCode":"fields_6672274","delDicValue":[],"offset":0,"labelWidth":110,"dicCode":"basic_safety_sub_category","codeDicData":[{"value":"0","label":"综合安全","colorType":"default","cssClass":""},{"value":"1","label":"专项安全","colorType":"default","cssClass":""},{"value":"2","label":"安全操作","colorType":"default","cssClass":""},{"value":"3","label":"层级化","colorType":"default","cssClass":""},{"value":"4","label":"配套支持","colorType":"default","cssClass":""}]},"visible_dept":{"type":"deptSelect","controlType":"select","label":"可见部门","findType":"all","display":true,"span":11,"disabled":false,"required":true,"hideLabel":false,"i18nCode":"fields_280965","textFormatter":"{dicText}({dicCode})","offset":1,"labelWidth":110,"multiple":true},"file_description":{"type":"textarea","controlType":"input","label":"资料内容描述","readonly":false,"minRows":3,"maxRows":5,"display":true,"span":22,"disabled":false,"required":false,"hideLabel":false,"i18nCode":"fields_3533958","labelWidth":110,"offset":1,"labelTip":"资料内容描述","verifyConfig":"[{\"label\":\"字符长度校验\",\"type\":\"leng\",\"controlType\":\"length\",\"leng_type\":\"all\",\"prop\":\"option_4419202\",\"display\":true,\"leng_max\":500}]"}},"display":true,"span":24,"hideLabel":false,"prop":"basic_info","i18nCode":"fields_5109620","className":"basic_info"},{"type":"layoutGroup","controlType":"layout","label":"上传资料","controlTip":"该布局只能放置在最底部","arrow":true,"collapse":true,"column":{"file_url":{"type":"file","controlType":"upload","label":"选择文件","showFileList":true,"display":true,"span":22,"disabled":false,"required":true,"hideLabel":false,"i18nCode":"fields_7792422","labelWidth":110,"offset":1,"accept":""},"fields_7274050":{"type":"title","controlType":"title","label":"文本","value":"上传指南","display":true,"span":22,"hideLabel":true,"styles":{},"i18nCode":"fields_7274050","offset":1},"fields_8886724":{"type":"title","controlType":"title","label":"文本","value":"请确保上传的资料符合公司保密规定,不包含敏感信息。","display":true,"span":22,"hideLabel":true,"styles":{},"i18nCode":"fields_8886724","offset":1,"stylesStr":"","className":"","moreOptionStr":""},"fields_7206180":{"type":"title","controlType":"title","label":"文本","value":"选择正确的制度分类有助于资料的组织和后续查找。","display":true,"span":22,"hideLabel":true,"styles":{},"i18nCode":"fields_7206180","offset":1},"fields_5409338":{"type":"title","controlType":"title","label":"文本","value":"资料名称应简洁明了,准确反映文件内容;描述应包含关键信息,便于他人快速了解资料用途。","display":true,"span":22,"hideLabel":true,"styles":{},"i18nCode":"fields_5409338","offset":1}},"display":true,"span":24,"hideLabel":false,"prop":"fields_4328084","i18nCode":"fields_4328084"}]}', 1814565091165110274, 'Y', 'N', 'N', '{"fields_867779":"return {\n //简体中文\n ''zh-CN'': ''资料名称'',\n //English\n ''en'': '''',\n}","fields_1781150":"return {\n //简体中文\n ''zh-CN'': ''所属部门'',\n //English\n ''en'': '''',\n}","fields_6672274":"return {\n //简体中文\n ''zh-CN'': ''资料分类'',\n //English\n ''en'': '''',\n}","fields_280965":"return {\n //简体中文\n ''zh-CN'': ''可见部门'',\n //English\n ''en'': '''',\n}","fields_3533958":"return {\n //简体中文\n ''zh-CN'': ''资料内容描述'',\n //English\n ''en'': '''',\n}","fields_5109620":"return {\n //简体中文\n ''zh-CN'': ''基本信息'',\n //English\n ''en'': '''',\n}","fields_7792422":"return {\n //简体中文\n ''zh-CN'': ''选择文件'',\n //English\n ''en'': '''',\n}","fields_4328084":"return {\n //简体中文\n ''zh-CN'': ''上传资料'',\n //English\n ''en'': '''',\n}","config_submitBtn":"return {\n //简体中文\n ''zh-CN'': ''提交'',\n //English\n ''en'': '''',\n}","config_emptyBtn":"return {\n //简体中文\n ''zh-CN'': ''清空'',\n //English\n ''en'': '''',\n}","config_externalTitle":"return {\n //简体中文\n ''zh-CN'': '''',\n //English\n ''en'': '''',\n}"}'); +insert into "LOWCODE_FRAME"."LOWCODE_DESFORM"("ID", "TENANT_ID", "CREATE_USER", "CREATE_TIME", "CREATE_DEPT", "UPDATE_USER", "UPDATE_TIME", "IS_DELETED", "DESFORM_NAME", "DESFORM_JSON", "GROUP_DESFORM_ID", "IS_OPEN", "IS_TEMPLATE", "IS_HIDE", "I18N_DATA") values(1966404735134167042, 1, 1, '2025-09-12 15:33:18', 100, 1, '2025-11-07 13:34:19', 0, '安全基础资料表', '{"jsEnhance":"return {\n initData(formData) { //表单赋值前执行\n return new Promise(async (resolve, reject) => {\n let res = await useFun.requestApi(''get'', ''/system/dict-data/page'', {\n params: {\n \"dictType\": ''basic_safety_main_category'',\n \"pageNo\": 1,\n \"pageSize\": -1\n }\n })\n let dictData = res.list\n let dataMap = {};\n dictData.forEach(item => {\n dataMap[item.value] = item.label\n })\n let file_main_name = dataMap[formData.file_main_type]\n if (file_main_name != undefined) {\n useFun.setPropConfig(''file_sub_type'', { label: `${file_main_name}分类` })\n formData.$file_main_type = file_main_name\n } else {\n useFun.setPropConfig(''file_sub_type'', { label: ''资料分类'' })\n }\n\n // 二级分类与一级分类相关联\n useFun.requestApi(''get'', ''/system/dict-data/page'', {\n params: {\n \"dictType\": ''basic_safety_sub_category'',\n \"pageNo\": 1,\n \"pageSize\": -1\n }\n }).then(res => {\n let filtered = res.list.filter(item => item.value.startsWith(formData.file_main_type))\n let propConfig = useFun.getPropConfig(''file_sub_type'')\n useFun.setPropConfig(''file_sub_type'', { dicData: filtered })\n })\n resolve(formData)\n })\n },\n beforeSubmit(submitData) { //表单提交前执行\n // 将属性名配置正常\n submitData.department_name = formData.value.$department_id\n submitData.file_sub_type_name = formData.value.$file_sub_type\n submitData.file_main_type_name = formData.value.$file_main_type\n return new Promise((resolve, reject) => {\n resolve(submitData)\n })\n },\n}\n","scssEnhance":".low-form__1966404735134167042 {\n padding: 0 0 !important;\n\n .avue-form__group avue-form__group--flex {}\n\n .el-card__body {\n padding: unset !important;\n }\n\n .control-fields_2089442 {\n min-width: 341px !important;\n max-width: 341px !important;\n }\n\n .control-approveStatusName {\n min-width: 64%;\n }\n\n .el-col-md-3 {\n margin-left: 0 !important;\n }\n\n .control-fields_2642050 {\n left: 90px;\n min-width: 164px !important;\n max-width: 164px !important;\n }\n\n .control-fields_9126239 {\n left: 34px;\n min-width: 164px !important;\n max-width: 164px !important;\n }\n\n .control-create_time {\n left: -49px;\n top: 5px;\n\n p {\n margin: unset !important;\n }\n }\n\n .control-billNo {\n left: 2px;\n bottom: -5px;\n min-width: 234px !important;\n max-width: 234px !important;\n\n p {\n margin: unset !important;\n }\n }\n\n .avue-form.avue--detail {\n\n .head_title,\n .head_detail_label,\n .head_detail_label,\n .head_type_value,\n .head_number_label,\n .head_number_value,\n .head_created_time_label,\n .head_created_time_value,\n .head_status_label,\n .head_separator2,\n .head_separator1 {\n margin-top: unset !important;\n }\n\n .ce_class {\n top: 7px !important;\n }\n\n .control-create_time {\n left: -40px !important;\n top: -6px !important;\n }\n\n * {\n border: none !important;\n }\n\n .control-approveStatusName {\n margin-top: 0 !important;\n border: none !important;\n }\n\n .control-fields_9126239 {\n left: 34px !important;\n top: -11px;\n }\n\n .control-fields_2642050 {\n left: 89px !important;\n top: -11px;\n }\n\n .control-billNo {\n left: 40 !important;\n top: -5px !important;\n }\n\n .head_title {\n border: none !important;\n }\n }\n\n .bottom_class {\n position: relative;\n bottom: 31px;\n }\n\n .dash_class {\n border-bottom: 1px dashed #999 !important;\n }\n\n //样式请写在当前位置内\n // .el-collapse-content-873.avue-form__group {\n // border-bottom: 1px dashed #999;\n // }\n .avue-form__group {\n\n .control-fields_7103563.head_title,\n .control-fields_2247746.head_status_value {\n line-height: 20px !important;\n border: none !important;\n font-weight: 700 !important;\n color: #141414 !important;\n\n .avue-title p {\n font-size: 20px !important;\n }\n\n }\n\n .control-fields_2247746.head_status_value {\n // left: calc(16% + 25px);\n color: green !important;\n // color: #999;\n font-size: 14px !important;\n\n .avue-title p {\n font-size: 14px !important;\n }\n }\n\n .head_status_value {\n margin-top: 30px !important;\n }\n\n .head_title,\n .head_detail_label {\n margin-left: 90px !important;\n margin-top: 30px !important;\n }\n\n .head_detail_label,\n .head_type_value,\n .head_number_label,\n .head_number_value,\n .head_created_time_label,\n .head_created_time_value,\n .head_status_label,\n .head_separator2,\n .head_separator1 {\n border: none !important;\n color: #999 !important;\n margin-top: -30px !important;\n\n .avue-title p {\n font-size: 14px !important;\n font-weight: 400 !important;\n }\n }\n\n .control-fields_3957948.head_type_value {\n // left: calc(10% + 25px);\n }\n\n .head_separator1,\n .head_separator2,\n .head_separator3 {\n line-height: 20px !important;\n color: #C7C7C7 !important;\n }\n\n .control-fields_6000884.head_separator2 {\n // left: calc(30% + 25px);\n }\n\n // .control-fields_5375235.head_separator3 {\n // left: 45%;\n // }\n\n .control-fields_2642050.head_number_label {\n // left: calc(16% + 25px);\n }\n\n .control-fields_225062.head_number_value {\n // left: calc(22% + 25px);\n }\n\n .control-fields_9126239.head_created_time_label {\n // left: calc(31% + 25px);\n }\n\n .control-fields_4975109.head_created_time_value {\n // left: calc(37% + 25px);\n\n .avue-title p {\n // width: 200px;\n }\n }\n\n // .control-fields_7337553.head_status_label {\n // left: 43%;\n // }\n\n\n\n .ce_class {\n min-width: 65px !important;\n max-width: 65px !important;\n min-height: 65px !important;\n max-height: 65px !important;\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAAB6CAYAAABne9ctAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAGdYAABnWARjRyu0AAAVcSURBVHhe7d1LUxxVGIDht5kLDMMlYCQQLhK14i1aikZFLRdm4S6lG80iP4GdP8S1K6t04ULLbLyU942pMotYFkkKUhiIhigIBJARhhlm2sWBAg4Bp0Of5nz4PVUsOE1lQt6Z092neybBfCEMUWLV2QNKFg0onAYUTgMKpwGF04DCaUDhNKBwGlA4DSicBhROAwqnAYXTgMJpQOE0oHAaUDgNKJwGFE4DCqcBhdOAwmlA4TSgcBpQOA0onAYUTgMKpwGFC5J6d1JxDQolqFTtLZ4KoDkLuQwE9jaPOA9YqsDILFy6DXdWoOr00eLVmIFTHfBaP9R5WtF5wJFZ+GAYbtyBspRX3xb3N8L5p+DVPnuLH5zuA1fKJuCY0HgAM8vw2Zg96g+nAVcrZtoUs9/bxcS8PeIPpwHDUNY+bzdrHj8BnQZU7mlA4TSgcBpQOA0onAYUTgMKpwGF04DCaUDhnF6NmF+BT0bgi1/tLXtrz8FAJ3Tk472Ms1KGy1Nwc8He8t8uvGWP+MG7gB15ePtxeKYT6tP21v2phObv9O6l6BF9DejdFNqeg8EeaMuZC6pxfjVnobcFBrvtR5XLu4DVqrkM5VLR8Z+fJOcBo87Ptwvw+Risrtlb4nFtBr6MMKX7zrt94IaWeuhsivcgprAKk0v2aG183Qc6D/jxyOF4xvsa0PkUqtzSgMJpQOE0oHAaUDjnR6H3ehqRS0NrQ7zvSyiuwXzRHq2Nr0eh3gWsT8PTx+CVPnMuGGfAtSqMzsKno9Hv9dSANXqgFYZOw4Nt8Z7Eb1gqwXuX4eIte8vefA3o3T6wMQM9LW7iATRl4ESbPSqXdwELJfht0R6NTwhcnbZH5fJuCg0C6GuB1x8yl37ifCUuleDrcfhlKvp7NnydQp0H1LVQt7ybQlU0GlA4DSicBhROAwqnAYVzfhoR9TwwFcDxZnNfaFvO3np31RAWijA87W4R4I1H7JG9vdwLD7fbo/HzLuCxPJw7Bc91QVPW3np3YQiFMvw0aRaqpwr2TyRv6Hk402+Pxs/5FBr12dGegxe6a4/H+upNcxYeOwp9rfbWw815wKjKFVhatUdrU6qY9z/8nzgPGHUp84+CmXb/jHD/ZjWEyb/NOuf1OXvr4eZ8H3gva6GZOmhIQ6rGp1e4fkt+sWJewS68f9Ye2XTxFlwYhbmVzbGh03DmxNafcqPGf6JklavmysFCsbavxaL5eVfxAI407P7VmIn3qkkUXgZUtdOAwmlA4TSgcBpQOLcBg4M7OotbZY+TrUq4c8UpldDv7TRgev187jDYeo5nK5TMXd9b5SMsBe6H04D1KWitt0dl+mHCHjFmlmFiYecSXkd++/euOA2YqYOjjeYWeem+nYDvJrbfkj+7DF/dgCvT26fYriZob9j83iWnS2lgPo/lw2H4ecreIkuAeTKevA/6j5gPcr8+B+PzsGgtvr/5KJx7ArKp7eMuOA9YrsD3N+Gjqzt/UYlSdeadUyFQLO88uOltgXcGzWWtJI5jnE6hAJkUvNhj3m2Ucf5o7lWq5qDln9LOeE1Z88rrbk4mHkkEBHMgc/ak+QSmdCKPmLx8Bs4/CQNdyf6OzqfQrQolc8vDN+PmGZzYAzsUBNDTbP57noHOZOORdMAN12bgx9/hyl/mMlA1NPe1iBCY6TGbMkebzx6Hl3rMvTwH4UACbrW4CnPLO/cnvgowixPt6x/Gd9AOPKDan4RnbBU3DSicBhROAwqnAYXTgMJpQOE0oHAaUDgNKJwGFE4DCqcBhdOAwmlA4TSgcBpQOA0onAYUTgMKpwGF04DCaUDhNKBwGlA4DSicBhTuX6X4xrCOgSlsAAAAAElFTkSuQmCC\");\n background-size: cover !important;\n background-repeat: no-repeat !important;\n border-radius: 20% !important;\n position: absolute !important;\n top: 30px !important;\n margin-left: 20px !important;\n z-index: 1 !important;\n }\n\n .el-collapse-item__content {\n .avue-form__group {\n // justify-content: center !important;\n }\n }\n\n .el-form-item__content {\n border: none !important;\n padding: 0 !important;\n }\n\n\n }\n}","labelPosition":"right","labelSuffix":"","labelWidth":10,"gutter":0,"menuBtn":true,"submitBtn":true,"submitText":"提交","emptyBtn":true,"emptyText":"清空","externalTitle":"","menuPosition":"center","size":"default","isSubmitTable":true,"column":{},"tableDesignId":"1966386366515343361","group":[{"type":"layoutGroup","controlType":"layout","label":"基本信息","controlTip":"该布局只能放置在最底部","arrow":true,"collapse":true,"column":{"file_name":{"type":"input","controlType":"input","label":"资料名称","readonly":false,"clearable":true,"display":true,"span":22,"disabled":false,"required":true,"hideLabel":false,"i18nCode":"fields_867779","offset":1,"labelWidth":110,"verifyConfig":"[{\"label\":\"字符长度校验\",\"type\":\"leng\",\"controlType\":\"length\",\"leng_type\":\"all\",\"prop\":\"option_7505248\",\"display\":true,\"leng_max\":128}]"},"department_id":{"type":"deptSelect","controlType":"select","label":"所属部门","findType":"sub","display":true,"span":11,"disabled":false,"required":true,"hideLabel":false,"i18nCode":"fields_1781150","labelWidth":110,"textFormatter":"{dicText}({dicCode})","offset":1},"file_sub_type":{"type":"select","controlType":"select","label":"资料分类","clearable":true,"collapseTags":true,"maxCollapseTags":1,"dicType":"code","staticDicData":[{"label":"字典1","value":"dic_1"},{"label":"字典2","value":"dic_2"}],"display":true,"span":11,"disabled":false,"required":true,"hideLabel":false,"i18nCode":"fields_6672274","delDicValue":[],"offset":0,"labelWidth":110,"dicCode":"basic_safety_sub_category","codeDicData":[{"value":"0","label":"综合安全","colorType":"default","cssClass":""},{"value":"1","label":"专项安全","colorType":"default","cssClass":""},{"value":"2","label":"安全操作","colorType":"default","cssClass":""},{"value":"3","label":"层级化","colorType":"default","cssClass":""},{"value":"4","label":"配套支持","colorType":"default","cssClass":""}]},"visible_dept":{"type":"deptSelect","controlType":"select","label":"可见部门","findType":"all","display":true,"span":11,"disabled":false,"required":true,"hideLabel":false,"i18nCode":"fields_280965","textFormatter":"{dicText}({dicCode})","offset":1,"labelWidth":110,"multiple":true},"file_description":{"type":"textarea","controlType":"input","label":"资料内容描述","readonly":false,"minRows":3,"maxRows":5,"display":true,"span":22,"disabled":false,"required":false,"hideLabel":false,"i18nCode":"fields_3533958","labelWidth":110,"offset":1,"labelTip":"资料内容描述","verifyConfig":"[{\"label\":\"字符长度校验\",\"type\":\"leng\",\"controlType\":\"length\",\"leng_type\":\"all\",\"prop\":\"option_4419202\",\"display\":true,\"leng_max\":500}]"}},"display":true,"span":24,"hideLabel":false,"prop":"basic_info","i18nCode":"fields_5109620","className":"basic_info"},{"type":"layoutGroup","controlType":"layout","label":"上传资料","controlTip":"该布局只能放置在最底部","arrow":true,"collapse":true,"column":{"file_url":{"type":"file","controlType":"upload","label":"选择文件","showFileList":true,"display":true,"span":22,"disabled":false,"required":true,"hideLabel":false,"i18nCode":"fields_7792422","labelWidth":110,"offset":1,"accept":""},"fields_7274050":{"type":"title","controlType":"title","label":"文本","value":"上传指南","display":true,"span":22,"hideLabel":true,"styles":{},"i18nCode":"fields_7274050","offset":1},"fields_8886724":{"type":"title","controlType":"title","label":"文本","value":"请确保上传的资料符合公司保密规定,不包含敏感信息。","display":true,"span":22,"hideLabel":true,"styles":{},"i18nCode":"fields_8886724","offset":1,"stylesStr":"","className":"","moreOptionStr":""},"fields_7206180":{"type":"title","controlType":"title","label":"文本","value":"选择正确的制度分类有助于资料的组织和后续查找。","display":true,"span":22,"hideLabel":true,"styles":{},"i18nCode":"fields_7206180","offset":1},"fields_5409338":{"type":"title","controlType":"title","label":"文本","value":"资料名称应简洁明了,准确反映文件内容;描述应包含关键信息,便于他人快速了解资料用途。","display":true,"span":22,"hideLabel":true,"styles":{},"i18nCode":"fields_5409338","offset":1}},"display":true,"span":24,"hideLabel":false,"prop":"fields_4328084","i18nCode":"fields_4328084"}]}', 1814565091165110274, 'Y', 'N', 'N', '{"fields_867779":"return {\n //简体中文\n ''zh-CN'': ''资料名称'',\n //English\n ''en'': '''',\n}","fields_1781150":"return {\n //简体中文\n ''zh-CN'': ''所属部门'',\n //English\n ''en'': '''',\n}","fields_6672274":"return {\n //简体中文\n ''zh-CN'': ''资料分类'',\n //English\n ''en'': '''',\n}","fields_280965":"return {\n //简体中文\n ''zh-CN'': ''可见部门'',\n //English\n ''en'': '''',\n}","fields_3533958":"return {\n //简体中文\n ''zh-CN'': ''资料内容描述'',\n //English\n ''en'': '''',\n}","fields_5109620":"return {\n //简体中文\n ''zh-CN'': ''基本信息'',\n //English\n ''en'': '''',\n}","fields_7792422":"return {\n //简体中文\n ''zh-CN'': ''选择文件'',\n //English\n ''en'': '''',\n}","fields_4328084":"return {\n //简体中文\n ''zh-CN'': ''上传资料'',\n //English\n ''en'': '''',\n}","config_submitBtn":"return {\n //简体中文\n ''zh-CN'': ''提交'',\n //English\n ''en'': '''',\n}","config_emptyBtn":"return {\n //简体中文\n ''zh-CN'': ''清空'',\n //English\n ''en'': '''',\n}","config_externalTitle":"return {\n //简体中文\n ''zh-CN'': '''',\n //English\n ''en'': '''',\n}"}'); \ No newline at end of file