Răsfoiți Sursa

feat:工具类整理

Tzz 1 lună în urmă
părinte
comite
855fedf7df
21 a modificat fișierele cu 2770 adăugiri și 35 ștergeri
  1. 339 0
      base/nckd-base-common/src/main/java/nckd/base/common/constant/BosUserConstant.java
  2. 237 0
      base/nckd-base-common/src/main/java/nckd/base/common/constant/GenMetaConstantPlugin.java
  3. 38 0
      base/nckd-base-common/src/main/java/nckd/base/common/constant/OperationKeyConst.java
  4. 1 1
      base/nckd-base-common/src/main/java/nckd/base/common/model/BaseDataModel.java
  5. 1 1
      base/nckd-base-common/src/main/java/nckd/base/common/model/BaseModel.java
  6. 46 0
      base/nckd-base-common/src/main/java/nckd/base/common/model/BasePageModel.java
  7. 1 1
      base/nckd-base-common/src/main/java/nckd/base/common/model/BdAttachmentModel.java
  8. 3 3
      base/nckd-base-common/src/main/java/nckd/base/common/utils/BdAttachmentUtils.java
  9. 3 3
      base/nckd-base-common/src/main/java/nckd/base/common/utils/DoMoConvertUtils.java
  10. 271 0
      base/nckd-base-common/src/main/java/nckd/base/common/utils/GenConstantUtils.java
  11. 449 0
      base/nckd-base-common/src/main/java/nckd/base/common/utils/WebApiUtils.java
  12. 0 26
      build.gradle
  13. 175 0
      nckd-fi/src/main/java/nckd/fi/er/common/constant/ErPayeerConstant.java
  14. 371 0
      nckd-fi/src/main/java/nckd/fi/er/common/constant/ErReimburseSettingConstant.java
  15. 203 0
      nckd-fi/src/main/java/nckd/fi/er/webapi/cutomer/UserQueryWebApiPlugin.java
  16. 33 0
      nckd-fi/src/main/java/nckd/fi/er/webapi/model/BosUserContactEtModel.java
  17. 66 0
      nckd-fi/src/main/java/nckd/fi/er/webapi/model/BosUserEntityModel.java
  18. 287 0
      nckd-fi/src/main/java/nckd/fi/er/webapi/model/BosUserModel.java
  19. 112 0
      nckd-fi/src/main/java/nckd/fi/er/webapi/model/PayeeBankModel.java
  20. 94 0
      nckd-fi/src/main/java/nckd/fi/er/webapi/model/ReimburseSetModel.java
  21. 40 0
      nckd-fi/src/main/java/nckd/fi/er/webapi/model/UserTypeModel.java

+ 339 - 0
base/nckd-base-common/src/main/java/nckd/base/common/constant/BosUserConstant.java

@@ -0,0 +1,339 @@
+package nckd.base.common.constant;
+
+/**
+ * 人员常量类
+ *
+ * @author 章涛
+ * @version 1.0
+ * @date 2025-12-05 17:28:58
+ */
+public class BosUserConstant {
+    /**
+     * 实体标识
+     **/
+    public static final String FORMBILLID = "bos_user";
+    /**
+     * 缺省id字段
+     **/
+    public static final String ID = "ID";
+    /**
+     * 工号
+     **/
+    public static final String NUMBER = "NUMBER";
+    /**
+     * 姓名
+     **/
+    public static final String NAME = "NAME";
+    /**
+     * 数据状态
+     **/
+    public static final String STATUS = "STATUS";
+    /**
+     * 创建人
+     **/
+    public static final String CREATOR = "CREATOR";
+    /**
+     * 修改人
+     **/
+    public static final String MODIFIER = "MODIFIER";
+    /**
+     * 使用状态
+     **/
+    public static final String ENABLE = "ENABLE";
+    /**
+     * 创建时间
+     **/
+    public static final String CREATETIME = "CREATETIME";
+    /**
+     * 修改时间
+     **/
+    public static final String MODIFYTIME = "MODIFYTIME";
+    /**
+     * 主数据内码
+     **/
+    public static final String MASTERID = "MASTERID";
+    /**
+     * 禁用人
+     **/
+    public static final String DISABLER = "DISABLER";
+    /**
+     * 禁用时间
+     **/
+    public static final String DISABLEDATE = "DISABLEDATE";
+    /**
+     * 性别
+     **/
+    public static final String GENDER = "GENDER";
+    /**
+     * 部门分录
+     **/
+    public static final String ENTRYENTITY = "ENTRYENTITY";
+    /**
+     * 分录行号
+     **/
+    public static final String SEQ = "SEQ";
+    /**
+     * 部门
+     **/
+    public static final String DPT = "DPT";
+    /**
+     * 负责人
+     **/
+    public static final String ISINCHARGE = "ISINCHARGE";
+    /**
+     * 兼职
+     **/
+    public static final String ISPARTJOB = "ISPARTJOB";
+    /**
+     * 职位
+     **/
+    public static final String POSITION = "POSITION";
+    /**
+     * 直接上级
+     **/
+    public static final String SUPERIOR = "SUPERIOR";
+    /**
+     * 组织结构
+     **/
+    public static final String ORGSTRUCTURE = "ORGSTRUCTURE";
+    /**
+     * 岗位
+     **/
+    public static final String POST = "POST";
+    /**
+     * 用户云之家OpenID
+     **/
+    public static final String USEROPENID = "USEROPENID";
+    /**
+     * 人员头像
+     **/
+    public static final String PICTUREFIELD = "PICTUREFIELD";
+    /**
+     * 生日
+     **/
+    public static final String BIRTHDAY = "BIRTHDAY";
+    /**
+     * 证件号码
+     **/
+    public static final String IDCARD = "IDCARD";
+    /**
+     * 姓名全拼
+     **/
+    public static final String FULLPINYIN = "FULLPINYIN";
+    /**
+     * 姓名简拼
+     **/
+    public static final String SIMPLEPINYIN = "SIMPLEPINYIN";
+    /**
+     * 类型(过时)
+     **/
+    public static final String USERTYPE = "USERTYPE";
+    /**
+     * 用户类型
+     **/
+    public static final String TYPE = "TYPE";
+    /**
+     * 授权状态
+     **/
+    public static final String AUTHORSTATUS = "AUTHORSTATUS";
+    /**
+     * 用户禁用
+     **/
+    public static final String ISFORBIDDEN = "ISFORBIDDEN";
+    /**
+     * 是否锁定
+     **/
+    public static final String ISLOCKED = "ISLOCKED";
+    /**
+     * 密码
+     **/
+    public static final String PASSWORD = "PASSWORD";
+    /**
+     * 开始日期
+     **/
+    public static final String STARTDATE = "STARTDATE";
+    /**
+     * 结束日期
+     **/
+    public static final String ENDDATE = "ENDDATE";
+    /**
+     * 人员头像
+     **/
+    public static final String HEADSCULPTURE = "HEADSCULPTURE";
+    /**
+     * 激活状态
+     **/
+    public static final String ISACTIVED = "ISACTIVED";
+    /**
+     * 注册状态
+     **/
+    public static final String ISREGISTED = "ISREGISTED";
+    /**
+     * 历史密码
+     **/
+    public static final String PSWHISSTR = "PSWHISSTR";
+    /**
+     * 密码策略
+     **/
+    public static final String PSWSTRATEGY = "PSWSTRATEGY";
+    /**
+     * 密码生效日期
+     **/
+    public static final String PSWEFFECTIVEDATE = "PSWEFFECTIVEDATE";
+    /**
+     * 用户名
+     **/
+    public static final String USERNAME = "USERNAME";
+    /**
+     * 数据来源
+     **/
+    public static final String SOURCE = "SOURCE";
+    /**
+     * 工作圈eid
+     **/
+    public static final String EID = "EID";
+    /**
+     * 团队ID
+     **/
+    public static final String TID = "TID";
+    /**
+     * 云之家账号内码
+     **/
+    public static final String FUID = "FUID";
+    /**
+     * 锁定日期
+     **/
+    public static final String LOCKEDTIME = "LOCKEDTIME";
+    /**
+     * 密码错误次数
+     **/
+    public static final String ERRCOUNT = "ERRCOUNT";
+    /**
+     * 类型(废弃)
+     **/
+    public static final String USERTYPENEW = "USERTYPENEW";
+    /**
+     * 是否可编辑
+     **/
+    public static final String EDITABLE = "EDITABLE";
+    /**
+     * 邮箱
+     **/
+    public static final String EMAIL = "EMAIL";
+    /**
+     * 联系方式分录
+     **/
+    public static final String CONTACTENTITY = "CONTACTENTITY";
+    /**
+     * 类型
+     **/
+    public static final String CONTACTTYPE = "CONTACTTYPE";
+    /**
+     * 联系方式
+     **/
+    public static final String CONTACT = "CONTACT";
+    /**
+     * 默认
+     **/
+    public static final String ISDEFAULT = "ISDEFAULT";
+    /**
+     * 外部ID
+     **/
+    public static final String EXTERNALUUID = "EXTERNALUUID";
+    /**
+     * 类型
+     **/
+    public static final String USERTYPES = "USERTYPES";
+    /**
+     * 国家/地区
+     **/
+    public static final String COUNTRY = "COUNTRY";
+    /**
+     * 用户禁用人
+     **/
+    public static final String USERDISABLERID = "USERDISABLERID";
+    /**
+     * 用户禁用时间
+     **/
+    public static final String USERDISABLETIME = "USERDISABLETIME";
+    /**
+     * 使用系统结束日期
+     **/
+    public static final String USEENDDATE = "USEENDDATE";
+    /**
+     * 排序码
+     **/
+    public static final String SORTNUMBER = "SORTNUMBER";
+    /**
+     * 证件类型
+     **/
+    public static final String IDTYPE = "IDTYPE";
+    /**
+     * 手机
+     **/
+    public static final String PHONE = "PHONE";
+    /**
+     * 上次登录时间
+     **/
+    public static final String LASTLOGINTIME = "LASTLOGINTIME";
+    /**
+     * 上次登录ip
+     **/
+    public static final String LASTLOGINIP = "LASTLOGINIP";
+    /**
+     * 国家或地区
+     **/
+    public static final String NS_COUNTRY = "NS_COUNTRY";
+    /**
+     * 姓名格式
+     **/
+    public static final String NS_NAMESTYLE = "NS_NAMESTYLE";
+    /**
+     * First Name
+     **/
+    public static final String NS_FIRSTNAME = "NS_FIRSTNAME";
+    /**
+     * Middle Name
+     **/
+    public static final String NS_MIDDLENAME = "NS_MIDDLENAME";
+    /**
+     * Last Name
+     **/
+    public static final String NS_LASTNAME = "NS_LASTNAME";
+    /**
+     * Title
+     **/
+    public static final String NS_TITLE = "NS_TITLE";
+    /**
+     * 缩写
+     **/
+    public static final String NS_ABBR = "NS_ABBR";
+    /**
+     * Nick Name
+     **/
+    public static final String NS_NICKNAME = "NS_NICKNAME";
+    /**
+     * 职称
+     **/
+    public static final String NS_POSTTITLE = "NS_POSTTITLE";
+    /**
+     * Second Name
+     **/
+    public static final String NS_CUSTOMFIELD1 = "NS_CUSTOMFIELD1";
+    /**
+     * Initials
+     **/
+    public static final String NS_CUSTOMFIELD2 = "NS_CUSTOMFIELD2";
+    /**
+     * Suffix
+     **/
+    public static final String NS_CUSTOMFIELD3 = "NS_CUSTOMFIELD3";
+    /**
+     * 自定义字段4
+     **/
+    public static final String NS_CUSTOMFIELD4 = "NS_CUSTOMFIELD4";
+
+    /**所有字段**/
+    public static final String ALLFIELD = "id,number,name,status,creator,modifier,enable,createtime,modifytime,masterid,disabler,disabledate,gender,entryentity,entryentity.seq,entryentity.dpt,entryentity.isincharge,entryentity.ispartjob,entryentity.position,entryentity.superior,entryentity.orgstructure,entryentity.post,useropenid,picturefield,birthday,idcard,fullpinyin,simplepinyin,usertype,type,authorstatus,isforbidden,islocked,password,startdate,enddate,headsculpture,isactived,isregisted,pswhisstr,pswstrategy,psweffectivedate,username,source,eid,tid,fuid,lockedtime,errcount,usertypenew,editable,email,contactentity,contactentity.contacttype,contactentity.contact,contactentity.isdefault,externaluuid,usertypes,country,userdisablerid,userdisabletime,useenddate,sortnumber,idtype,phone,lastlogintime,lastloginip,ns_country,ns_namestyle,ns_firstname,ns_middlename,ns_lastname,ns_title,ns_abbr,ns_nickname,ns_posttitle,ns_customfield1,ns_customfield2,ns_customfield3,ns_customfield4";
+
+}

+ 237 - 0
base/nckd-base-common/src/main/java/nckd/base/common/constant/GenMetaConstantPlugin.java

@@ -0,0 +1,237 @@
+package nckd.base.common.constant;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.EntryType;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.property.EntryProp;
+import kd.bos.entity.property.SubEntryProp;
+import kd.bos.form.control.CodeEdit;
+import kd.bos.form.control.Control;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import nckd.base.common.utils.GenConstantUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.EventObject;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author:liul
+ * @date:2022/11/7
+ * @time: 9:53
+ * Description:(常量类生成工具)
+ */
+public class GenMetaConstantPlugin extends AbstractFormPlugin {
+    /**
+     * 生成按钮标识
+     */
+    protected final String CREATEJAVA = "nckd_createjava";
+    /**
+     * 元数据对象字段标识
+     */
+    protected final String ENTITYOBJECT = "nckd_entityobject";
+    /**
+     * 包路径字段标识
+     */
+    protected final String PACKAGENAME = "nckd_packagename";
+    /**
+     * 生成类型字段标识
+     */
+    protected final String nckd_TYPE = "nckd_type";
+    /**
+     * 代码编辑器控件标识
+     */
+    private static final String CODE = "nckd_code";
+    /**
+     * 开发商标识字段标识
+     */
+    private static final String nckd_DEVISVID = "nckd_devisvid";
+    protected SimpleDateFormat formatter;
+    protected Map<String, String> codeLineMap;
+
+    public GenMetaConstantPlugin()
+    {
+        this.codeLineMap = new HashMap();
+        this.formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    }
+
+    @Override
+    public void registerListener(EventObject evt) {
+        this.addClickListeners(CREATEJAVA);
+    }
+
+    @Override
+    public void click(EventObject evt) {
+        Control control = (Control) evt.getSource();
+        String key = control.getKey();
+        if (CREATEJAVA.equals(key)) {
+            afterDoCreateJava();
+        }
+    }
+
+    protected void afterDoCreateJava()
+    {
+        DynamicObject dataEntity = getModel().getDataEntity();
+
+        DynamicObject entityObject = dataEntity.getDynamicObject(ENTITYOBJECT);
+        if (entityObject == null) {
+            getView().showTipNotification("请选择【主实体对象】");
+            return;
+        }
+
+        String entityNumber = entityObject.getString("number");
+        String entityName = entityObject.getString("name");
+
+        String javaName = new StringBuilder().append(entityNumber).append("Constant").toString();
+        javaName = rename(javaName);
+
+        StringBuilder content = new StringBuilder();
+        StringBuilder allFieldContent = new StringBuilder("    /**所有字段**/\r\n    public static final String ALLFIELD = \"");
+
+        MainEntityType mainEntityType = EntityMetadataCache.getDataEntityType(entityNumber);
+        DataEntityPropertyCollection mainEntityProperties = mainEntityType.getProperties();
+
+        createPrefixCode(content, javaName, entityName);
+
+        for (IDataEntityProperty property : mainEntityProperties) {
+            createProperteyCode(content, property, allFieldContent);
+
+            if (property instanceof EntryProp) {
+                handleEntryProp((EntryProp)property, content, allFieldContent);
+            }
+        }
+
+        allFieldContent.append("\";\r\n\r\n").replace(allFieldContent.indexOf(",", 1), allFieldContent.indexOf(",", 1) + 1, "");
+
+        createSuffixCode(content.append(allFieldContent));
+        outPutJava(content);
+        getView().showSuccessNotification("生成成功。");
+    }
+
+    private void handleEntryProp(EntryProp entryProp, StringBuilder content, StringBuilder allFieldContent)
+    {
+        DynamicObjectType entryPropType = entryProp.getDynamicCollectionItemPropertyType();
+
+        for (IDataEntityProperty entryPropProperty : entryPropType.getProperties()) {
+            createProperteyCode(content, entryPropProperty, allFieldContent);
+
+            if (entryPropProperty instanceof SubEntryProp)
+                handleSubEntryProp((SubEntryProp)entryPropProperty, content, allFieldContent);
+        }
+    }
+
+    private void handleSubEntryProp(SubEntryProp subEntryProp, StringBuilder content, StringBuilder allFieldContent)
+    {
+        DynamicObjectType subEntryPropType = subEntryProp.getDynamicCollectionItemPropertyType();
+
+        for (IDataEntityProperty subEntryPropProperty : subEntryPropType.getProperties())
+            createProperteyCode(content, subEntryPropProperty, allFieldContent);
+    }
+
+    protected String rename(String javaName)
+    {
+        String splitStr = "_";
+        String result = "";
+        if (javaName.contains(splitStr)) {
+            String[] splitArray = javaName.split(splitStr);
+
+            for (int i = 0; i < splitArray.length; ++i)
+                result = new StringBuilder().append(result).append(toUpperFirstChar(splitArray[i])).toString();
+        }
+        else {
+            result = toUpperFirstChar(javaName);
+        }
+
+        return result;
+    }
+
+    protected String toUpperFirstChar(String string) {
+        char[] chars = string.toCharArray();
+        if ((chars[0] >= 'a') && (chars[0] <= 'z')) {
+            chars[0] = (char)(chars[0] - ' ');
+            return String.valueOf(chars);
+        }
+        return string;
+    }
+
+    protected void createSuffixCode(StringBuilder content)
+    {
+        content.append("}\r\n");
+    }
+
+    protected void createPrefixCode(StringBuilder content, String javaName, String entityName) {
+        String packageName = "kd.constant";
+        Object packageNameValue = getModel().getValue(PACKAGENAME);
+        if ((packageNameValue != null) && (!(packageNameValue.toString().isEmpty()))) {
+            packageName = packageNameValue.toString();
+        }
+
+        String rdNumber = RequestContext.get().getUserName();
+
+        String dateStr = this.formatter.format(new Date());
+        String prefixCode = new StringBuilder().append("package ").append(packageName).append(";").append("\r\n").append("\r\n").append("/**").append("\r\n").append(" * ").append(entityName).append("常量类").append("\r\n").append(" *").append("\r\n").append(" * @author ").append(rdNumber).append("\r\n").append(" * @version 1.0").append("\r\n").append(" * @date ").append(dateStr).append("\r\n").append(" */").append("\r\n").append("public class ").append(javaName).append(" {").append("\r\n").toString();
+
+        content.append(prefixCode);
+    }
+
+    private void extracted() {
+        // 获取数据实体对象
+        DynamicObject dataEntity = this.getModel().getDataEntity();
+
+        // 检查是否选择了主实体对象
+        DynamicObject entityObject = dataEntity.getDynamicObject(ENTITYOBJECT);
+        if (entityObject == null) {
+            this.getView().showTipNotification("请选择【主实体对象】");
+            return;
+        }
+        String devISVId = dataEntity.getString(nckd_DEVISVID);
+        GenConstantUtils genConstantUtils = new GenConstantUtils(entityObject.getString("id"), dataEntity.getString(PACKAGENAME), devISVId);
+        String type = dataEntity.getString(nckd_TYPE);
+        if ("A".equals(type)) {
+            genConstantUtils.createEntityInfoJava();
+        } else {
+            genConstantUtils.createFormJava();
+        }
+        this.outPutJava(genConstantUtils.getContent());
+        this.getView().showSuccessNotification("生成成功。");
+    }
+
+    protected void createProperteyCode(StringBuilder content, IDataEntityProperty iDataEntityProperty, StringBuilder allFieldContent) {
+        String propertyName = iDataEntityProperty.getName();
+        if (this.codeLineMap.get(propertyName) == null) {
+            LocaleString displayNameObj = iDataEntityProperty.getDisplayName();
+
+            if ((displayNameObj == null) && (!("id".equals(propertyName)))) {
+                return;
+            }
+
+            String disPlayName = "缺省id字段";
+
+            if (displayNameObj != null) {
+                disPlayName = displayNameObj.getLocaleValue_zh_CN();
+            }
+
+            this.codeLineMap.put(propertyName, disPlayName);
+            String uppercasePropertyName = propertyName.toUpperCase();
+            String annotation = new StringBuilder().append("    /**").append(disPlayName).append("**/").append("\r\n").toString();
+            String code = new StringBuilder().append("    public static final String ").append(uppercasePropertyName).append(" = \"").append(propertyName).append("\";").append("\r\n").toString();
+            content.append(new StringBuilder().append(annotation).append(code).toString());
+            if (iDataEntityProperty.getParent() instanceof EntryType)
+                allFieldContent.append(new StringBuilder().append(",").append(iDataEntityProperty.getParent().getName()).append(".").append(propertyName).toString());
+            else
+                allFieldContent.append(new StringBuilder().append(",").append(propertyName).toString());
+        }
+    }
+
+    protected void outPutJava(StringBuilder content) {
+        CodeEdit codeshow = this.getView().getControl(CODE);
+        codeshow.setText(content.toString());
+    }
+}

+ 38 - 0
base/nckd-base-common/src/main/java/nckd/base/common/constant/OperationKeyConst.java

@@ -0,0 +1,38 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by FernFlower decompiler)
+//
+
+package nckd.base.common.constant;
+
+public class OperationKeyConst {
+    public static final String NEW = "new";
+    public static final String COPY = "copy";
+    public static final String MODIFY = "modify";
+    public static final String SAVE = "save";
+    public static final String DELETE = "delete";
+    public static final String SUBMIT = "submit";
+    public static final String AUDIT = "audit";
+    public static final String UN_AUDIT = "unaudit";
+    public static final String CLOSE = "close";
+    public static final String UN_SUBMIT = "unsubmit";
+    public static final String ENABLE = "enable";
+    public static final String UN_ENABLE = "disable";
+    public static final String DISABLE = "disable";
+    public static final String PUSH = "push";
+    public static final String DRAW = "draw";
+    public static final String NEW_ENTRY = "newentry";
+    public static final String SUBMIT_AND_NEW = "submitandnew";
+    public static final String DO_NOTHING = "donothing";
+    public static final String REFRESH = "refresh";
+    public static final String OCR = "ocr";
+    public static final String ROW_STATUS_CONVERT = "rowstatusconvert";
+    public static final String BTN_CANCEL = "btncancel";
+    public static final String BTN_OK = "btnok";
+    public static final String SAVE_SUBMIT_AUDIT = "save_submit_audit";
+    public static final String SUBMIT_AUDIT = "submit_audit";
+    public static final String IMPORT_ENTRY = "importentry";
+
+    public OperationKeyConst() {
+    }
+}

+ 1 - 1
nckd-fi/src/main/java/nckd/fi/er/webapi/model/BaseDataModel.java → base/nckd-base-common/src/main/java/nckd/base/common/model/BaseDataModel.java

@@ -1,4 +1,4 @@
-package nckd.fi.er.webapi.model;
+package nckd.base.common.model;
 
 import java.io.Serializable;
 import kd.bos.openapi.common.custom.annotation.ApiModel;

+ 1 - 1
nckd-fi/src/main/java/nckd/fi/er/webapi/model/BaseModel.java → base/nckd-base-common/src/main/java/nckd/base/common/model/BaseModel.java

@@ -1,4 +1,4 @@
-package nckd.fi.er.webapi.model;
+package nckd.base.common.model;
 
 import kd.bos.openapi.common.custom.annotation.ApiModel;
 

+ 46 - 0
base/nckd-base-common/src/main/java/nckd/base/common/model/BasePageModel.java

@@ -0,0 +1,46 @@
+package nckd.base.common.model;
+
+import java.io.Serializable;
+import java.util.List;
+import kd.bos.openapi.common.custom.annotation.ApiModel;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+
+@ApiModel
+public class BasePageModel extends BaseModel implements Serializable {
+    private @ApiParam("页码") Integer pageSize;
+    private @ApiParam("当前页") Integer pageNo;
+    private @ApiParam("数据") List<Object> rows;
+
+    public Integer getPageSize() {
+        return this.pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public Integer getPageNo() {
+        return this.pageNo;
+    }
+
+    public void setPageNo(Integer pageNo) {
+        this.pageNo = pageNo;
+    }
+
+    public List<Object> getRows() {
+        return this.rows;
+    }
+
+    public void setRows(List<Object> rows) {
+        this.rows = rows;
+    }
+
+    public BasePageModel() {
+    }
+
+    public BasePageModel(Integer pageNo, Integer pageSize, List<Object> rows) {
+        this.pageNo = pageNo;
+        this.pageSize = pageSize;
+        this.rows = rows;
+    }
+}

+ 1 - 1
nckd-fi/src/main/java/nckd/fi/er/webapi/model/BdAttachmentModel.java → base/nckd-base-common/src/main/java/nckd/base/common/model/BdAttachmentModel.java

@@ -1,4 +1,4 @@
-package nckd.fi.er.webapi.model;
+package nckd.base.common.model;
 
 import java.io.Serializable;
 import java.util.Date;

+ 3 - 3
nckd-fi/src/main/java/nckd/fi/er/webapi/utils/BdAttachmentUtils.java → base/nckd-base-common/src/main/java/nckd/base/common/utils/BdAttachmentUtils.java

@@ -3,7 +3,7 @@
 // (powered by FernFlower decompiler)
 //
 
-package nckd.fi.er.webapi.utils;
+package nckd.base.common.utils;
 
 import java.security.SecureRandom;
 import java.util.ArrayList;
@@ -23,8 +23,8 @@ import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.attachment.AttachmentFieldServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 import nckd.base.common.enums.BillStatusEnum;
-import nckd.fi.er.webapi.model.BaseDataModel;
-import nckd.fi.er.webapi.model.BdAttachmentModel;
+import nckd.base.common.model.BaseDataModel;
+import nckd.base.common.model.BdAttachmentModel;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;

+ 3 - 3
nckd-fi/src/main/java/nckd/fi/er/webapi/utils/DoMoConvertUtils.java → base/nckd-base-common/src/main/java/nckd/base/common/utils/DoMoConvertUtils.java

@@ -1,4 +1,4 @@
-package nckd.fi.er.webapi.utils;
+package nckd.base.common.utils;
 
 import cn.hutool.core.util.StrUtil;
 import kd.bos.dataentity.entity.DynamicObject;
@@ -14,8 +14,8 @@ import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import nckd.base.common.constant.BaseFieldConst;
-import nckd.fi.er.webapi.model.BaseModel;
-import nckd.fi.er.webapi.model.BdAttachmentModel;
+import nckd.base.common.model.BaseModel;
+import nckd.base.common.model.BdAttachmentModel;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.ObjectUtils;

+ 271 - 0
base/nckd-base-common/src/main/java/nckd/base/common/utils/GenConstantUtils.java

@@ -0,0 +1,271 @@
+package nckd.base.common.utils;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
+import kd.bos.dataentity.utils.StringUtils;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.property.EntryProp;
+import kd.bos.entity.property.SubEntryProp;
+import kd.bos.metadata.dao.MetaCategory;
+import kd.bos.metadata.dao.MetadataDao;
+import kd.bos.metadata.form.ControlAp;
+import kd.bos.metadata.form.FormMetadata;
+import kd.bos.metadata.form.control.FieldAp;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author:liul
+ * @date:2024/11/8
+ * @time: 15:36
+ * Description:()
+ */
+public class GenConstantUtils {
+    /**
+     * 包路径
+     */
+    private String packagePath;
+    /**
+     * 实体标识
+     */
+    private String entityId;
+    /**
+     * 内容构造器
+     */
+    private StringBuilder content;
+    /**
+     * 开发商标识
+     */
+    private String devISVId;
+    protected Map<String, String> codeLineMap;
+    /**
+     * 换行标识符
+     */
+    protected final String LINEFEED = "\r\n";
+    protected SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * @param entityId    表单元数据number
+     * @param packagePath 要生成的类的包路径
+     */
+    public GenConstantUtils(String entityId, String packagePath, String devISVId) {
+        this.entityId = entityId;
+        this.packagePath = packagePath;
+        this.devISVId = devISVId;
+        content = new StringBuilder();
+        codeLineMap = new HashMap<>();
+    }
+
+    public StringBuilder getContent() {
+        return content;
+    }
+
+    /**
+     * 生成实体常量类
+     */
+    public void createEntityInfoJava() {
+        // 生成常量类名
+        String javaName = this.rename(entityId + "Constant");
+        // 获取主实体类型及其属性集合
+        MainEntityType mainEntityType = EntityMetadataCache.getDataEntityType(entityId);
+        DataEntityPropertyCollection mainEntityProperties = mainEntityType.getProperties();
+        // 创建前缀代码
+        this.createPrefixCode(content, javaName, mainEntityType.getDisplayName().getLocaleValue());
+        // 遍历主实体属性,处理所有类型的属性
+        for (IDataEntityProperty property : mainEntityProperties) {
+            this.createProperteyCode(content, property);
+            // 如果当前属性是 EntryProp 类型,进一步处理其子属性
+            if (property instanceof EntryProp) {
+                handleEntryProp((EntryProp) property, content);
+            }
+        }
+        // 创建后缀代码并输出生成的 Java 代码
+        this.createSuffixCode(content);
+    }
+
+    /**
+     * 生成页面元数据常量标识
+     */
+    public void createFormJava() {
+        // 生成常量类名
+        String javaName = this.rename(entityId + "Constant");
+        // 根据表单编码获取表单id
+        String id = MetadataDao.getIdByNumber(this.entityId, MetaCategory.Form);
+        // 获取表单元数据
+        FormMetadata formMeta = (FormMetadata) MetadataDao.readRuntimeMeta(id, MetaCategory.Form);
+        // 创建前缀代码
+        this.createPrefixCode(content, javaName, formMeta.getName().getLocaleValue());
+        List<ControlAp<?>> items = formMeta.getItems();
+        for (ControlAp<?> item : items) {
+            if (item instanceof FieldAp) {
+                continue;
+            }
+            String className = item.getClass().getName();
+            String[] parts = className.split("\\.");
+            className = parts[parts.length - 1];
+            String annotation = String.format("Type:%s,Name:%s", className, item.getName().getLocaleValue());
+            this.setContentCode(content, item.getKey(), annotation);
+        }
+        // 创建后缀代码并输出生成的 Java 代码
+        this.createSuffixCode(content);
+    }
+
+    private void createPrefixCode(StringBuilder content, String javaName, String entityName) {
+        String packageName = "kd.constant";
+        if (StringUtils.isNotBlank(packagePath)) {
+            packageName = packagePath;
+        }
+        String rdNumber = RequestContext.get().getUserName();
+        String dateStr = this.formatter.format(new Date());
+        String prefixCode = "package " + packageName + ";" + LINEFEED + LINEFEED + "/**" + LINEFEED + " * "
+                + entityName + "常量类" + LINEFEED + " *" + LINEFEED + " * @author " + rdNumber + LINEFEED + " * @version 1.0"
+                + LINEFEED + " * @date " + dateStr + LINEFEED + " */" + LINEFEED + "public class " + javaName + " {" + LINEFEED;
+        content.append(prefixCode);
+        codeLineMap.put(this.entityId, "实体标识");
+        // 设置实体标识
+        String annotation = "    /**" + LINEFEED;
+        annotation += "    * 实体标识" + LINEFEED;
+        annotation += "     **/" + LINEFEED;
+        String code = "    public static final String " + "FORMBILLID" + " = \"" + this.entityId + "\";" + LINEFEED;
+        content.append(annotation).append(code);
+    }
+
+    private void createProperteyCode(StringBuilder content, IDataEntityProperty iDataEntityProperty) {
+        String propertyName = iDataEntityProperty.getName();
+        LocaleString displayNameObj = iDataEntityProperty.getDisplayName();
+        if (displayNameObj == null && !"id".equals(propertyName)) {
+            return;
+        }
+        String disPlayName = "缺省id字段";
+        if (displayNameObj != null) {
+            disPlayName = displayNameObj.getLocaleValue_zh_CN();
+        }
+        this.setContentCode(content, propertyName, disPlayName);
+    }
+
+    private void setContentCode(StringBuilder content, String propertyName, String disPlayName) {
+        // 判断去除isv开发商标识前缀
+        propertyName = this.deleteISVMark(propertyName);
+        if (this.codeLineMap.get(propertyName) == null) {
+            this.codeLineMap.put(propertyName, disPlayName);
+            String uppercasePropertyName = propertyName.toUpperCase();
+            String annotation = "    /**" + LINEFEED;
+            annotation += "    * " + disPlayName + LINEFEED;
+            annotation += "     **/" + LINEFEED;
+            String code = "    public static final String " + uppercasePropertyName + " = \"" + propertyName + "\";" + LINEFEED;
+            content.append(annotation).append(code);
+        }
+    }
+
+    // 提取处理 EntryProp 子属性的逻辑
+    private void handleEntryProp(EntryProp entryProp, StringBuilder content) {
+        DynamicObjectType entryPropType = entryProp.getDynamicCollectionItemPropertyType();
+        // 遍历 EntryProp 的属性
+        for (IDataEntityProperty entryPropProperty : entryPropType.getProperties()) {
+            this.createProperteyCode(content, entryPropProperty);
+            // 如果当前属性是 SubEntryProp 类型,进一步处理其子属性
+            if (entryPropProperty instanceof SubEntryProp) {
+                handleSubEntryProp((SubEntryProp) entryPropProperty, content);
+            }
+        }
+    }
+
+    // 提取处理 SubEntryProp 子属性的逻辑
+    private void handleSubEntryProp(SubEntryProp subEntryProp, StringBuilder content) {
+        DynamicObjectType subEntryPropType = subEntryProp.getDynamicCollectionItemPropertyType();
+        // 遍历 SubEntryProp 的属性,并生成对应的代码
+        for (IDataEntityProperty subEntryPropProperty : subEntryPropType.getProperties()) {
+            this.createProperteyCode(content, subEntryPropProperty);
+        }
+    }
+
+    private void createSuffixCode(StringBuilder content) {
+        content.append("}" + LINEFEED);
+    }
+
+    private String rename(String javaName) {
+        String splitStr = "_";
+        String result = "";
+        if (javaName.contains(splitStr)) {
+            String[] splitArray = javaName.split(splitStr);
+
+            for (int i = 0; i < splitArray.length; ++i) {
+                result = result + this.toUpperFirstChar(splitArray[i]);
+            }
+        } else {
+            result = this.toUpperFirstChar(javaName);
+        }
+
+        return result;
+    }
+
+    private String toUpperFirstChar(String string) {
+        char[] chars = string.toCharArray();
+        if (chars[0] >= 'a' && chars[0] <= 'z') {
+            chars[0] = (char) (chars[0] - 32);
+            return String.valueOf(chars);
+        } else {
+            return string;
+        }
+    }
+
+    /**
+     * 按当前环境来截取ISV开发商标识
+     *
+     * @param str
+     * @return
+     */
+    public String deleteISVMark(String str) {
+        if (StringUtils.isEmpty(str)) {
+            return "";
+        }
+        if (StringUtils.isEmpty(this.getDevISVId())) {
+            return str.toUpperCase();
+        }
+        String devISVId = this.getDevISVId();
+        for (String key : devISVId.split(",")) {
+            key += "_";
+            if (str.indexOf(key) == 0) {// 找到了,则截取
+                str = str.substring(key.length());
+                break;
+            }
+        }
+        return str.toUpperCase();
+    }
+
+    public String getPackagePath() {
+        return packagePath;
+    }
+
+    public void setPackagePath(String packagePath) {
+        this.packagePath = packagePath;
+    }
+
+    public String getEntityId() {
+        return entityId;
+    }
+
+    public void setEntityId(String entityId) {
+        this.entityId = entityId;
+    }
+
+    public void setContent(StringBuilder content) {
+        this.content = content;
+    }
+
+    public String getDevISVId() {
+        return devISVId;
+    }
+
+    public void setDevISVId(String devISVId) {
+        this.devISVId = devISVId;
+    }
+}

+ 449 - 0
base/nckd-base-common/src/main/java/nckd/base/common/utils/WebApiUtils.java

@@ -0,0 +1,449 @@
+package nckd.base.common.utils;
+
+import kd.bos.cache.CacheFactory;
+import kd.bos.cache.DistributeSessionlessCache;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.operate.OperateOptionConst;
+import kd.bos.entity.operate.interaction.InteractionContext;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.operate.MutexHelper;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.mutex.impl.MutexLockInfo;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.workflow.WorkflowServiceHelper;
+import nckd.base.common.constant.BaseFieldConst;
+import nckd.base.common.constant.OperationKeyConst;
+import nckd.base.common.model.BaseModel;
+import nckd.base.common.model.BasePageModel;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.ObjectUtils;
+
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author 许永财-金蝶
+ * @module 销售管理平台
+ * @description
+ * @since 2025/3/5
+ */
+public final class WebApiUtils {
+	private WebApiUtils() {
+	}
+	/**log定义**/
+	private static final Log log = LogFactory.getLog(WebApiUtils.class);
+	/**缓存**/
+	static DistributeSessionlessCache cache = CacheFactory.getCommonCacheFactory().getDistributeSessionlessCache();
+	/**数字定义**/
+	private static final int NUM = 43007523;
+	/**
+	 * 列表查询
+	 *
+	 * @param queryBill        queryBill
+	 * @param qFilter          qFilter
+	 * @param selectProperties selectProperties
+	 * @param pageNo           pageNo
+	 * @param pageSize         pageSize
+	 * @param orderBy          orderBy
+	 * @param baseModel        baseModel
+	 * @return BasePageModel
+	 */
+	public static BasePageModel queryList(String queryBill, QFilter qFilter, String selectProperties, Integer pageNo, Integer pageSize, String orderBy, BaseModel baseModel) {
+
+		DynamicObject[] doArr = BusinessDataServiceHelper.load(queryBill, selectProperties, qFilter.toArray(), orderBy, null == pageNo ? 0 : pageNo - 1, null == pageSize ? 10 : pageSize);
+
+		if (null == doArr || doArr.length == 0) {
+			return new BasePageModel();
+		}
+		List<Object> listModel = DoMoConvertUtils.toListModel(doArr, baseModel);
+		return new BasePageModel(pageNo, pageSize, listModel);
+	}
+
+	public static <T> T queryDetail(String queryBill, QFilter qFilter, String selectProperties, T t) {
+
+		DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(queryBill, selectProperties, qFilter.toArray());
+		if (null == dynamicObject) {
+			return null;
+		}
+		return DoMoConvertUtils.toModel(dynamicObject, t);
+
+	}
+
+	/**
+	 * 保存操作
+	 */
+	public static OperationResult saveOperate(DynamicObject[] dynamicObjects) {
+		long startTime = System.currentTimeMillis();
+		if (dynamicObjects == null || dynamicObjects.length == 0) {
+			OperationResult operationResult = new OperationResult();
+			operationResult.setSuccess(false);
+			operationResult.setMessage("操作对象不能为空。");
+			return operationResult;
+		}
+		//设置单据生成渠道
+		setBillChannel(dynamicObjects);
+		// 设置保存参数,调用目标单保存服务,保存目标单(保存时自动反写源单)
+		OperateOption saveOption = OperateOption.create();
+		checkJxdOption(saveOption);
+		// 不执行警告级别校验器
+		saveOption.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(true));
+		// 不显示交互提示,自动执行到底
+		saveOption.setVariableValue(OperateOptionConst.IGNOREINTERACTION, String.valueOf(true));
+		// 全部校验通过才保存
+		saveOption.setVariableValue(OperateOptionConst.STRICTVALIDATION, String.valueOf(true));
+		long endTime = System.currentTimeMillis();
+		OperationResult operationResult = OperationServiceHelper.executeOperate("save", dynamicObjects[0].getDataEntityType().getName(), dynamicObjects, saveOption);
+		log.info("saveOperate cost time:" + (endTime - startTime) + "ms");
+		return operationResult;
+	}
+
+	/**
+	 * 根据用户登录channel 设置单据生成channel
+	 *
+	 * @param dynamicObjects dynamicObjects
+	 */
+	private static void setBillChannel(DynamicObject[] dynamicObjects) {
+		String channel = cache.get(getLoginChannelCacheKey(RequestContext.get().getCurrUserId()));
+		if (StringUtils.isBlank(channel)) {
+			log.error("未获取用户登录的channel");
+			return;
+		}
+		for (DynamicObject dynamicObject : dynamicObjects) {
+			if (dynamicObject.containsProperty("channel")) {
+				dynamicObject.set("channel", channel);
+			}
+		}
+	}
+
+	private static String getLoginChannelCacheKey(Long userId) {
+		return "lsist.loginchannel_" + userId;
+	}
+
+	/**
+	 * 提交审核合成一步(前提是要保存)
+	 *
+	 * @param bill
+	 * @param isSubmitIgnoreWf
+	 * @return
+	 */
+	public static OperationResult submitAndAuditOperate(DynamicObject bill, boolean isSubmitIgnoreWf) {
+		List<Object> saveSuccessPkIds = Collections.singletonList(bill.getPkValue());
+
+		OperationResult submitResult = null;
+		try {
+			long startTime = System.currentTimeMillis();
+			OperateOption operateOption = OperateOption.create();
+			if (isSubmitIgnoreWf) {
+				//只要有WF标识,就不会触发工作流
+				operateOption.setVariableValue("WF", "TRUE");
+			}
+			// 不执行警告级别校验器
+			operateOption.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(true));
+			long startSub = System.currentTimeMillis();
+			submitResult = OperationServiceHelper.executeOperate(OperationKeyConst.SUBMIT, bill.getDataEntityType().getName(), saveSuccessPkIds.toArray(), operateOption);
+			long endsub = System.currentTimeMillis();
+			log.info("endsub-startSub={}", endsub - startSub);
+			if (!submitResult.isSuccess()) {
+				OperationServiceHelper.executeOperate(OperationKeyConst.UN_SUBMIT, bill.getDataEntityType().getName(), saveSuccessPkIds.toArray(), OperateOption.create());
+				long endTime = System.currentTimeMillis();
+				log.info("submit fail cost : ", endTime - startTime + "ms");
+				return submitResult;
+			}
+		} catch (Exception e) {
+			OperationServiceHelper.executeOperate(OperationKeyConst.UN_SUBMIT, bill.getDataEntityType().getName(), saveSuccessPkIds.toArray(), OperateOption.create());
+			throw e;
+		}
+
+
+		if (!isSubmitIgnoreWf) {
+			/**
+			 * 如果进入审批流就直接返回给前端,无需走审核操作
+			 */
+			long startTime = System.currentTimeMillis();
+			Boolean existProc = WorkflowServiceHelper.existProcDefByEntityNumber(bill.getDataEntityType().getName());
+			if (existProc) {
+				boolean inProcess = false;
+				int waitTime = 0;
+				int times = 1;
+				while (!inProcess) {
+					log.info("wait wf result:{}", times);
+					try {
+						waitTime += 200;
+						times++;
+						if (waitTime > 5000) {
+							break;
+						}
+						log.info("等待工作流返回");
+						Thread.sleep(200);
+					} catch (InterruptedException e) {
+						log.error("提交审核合成一步(前提是要保存)报错:{}", e);
+					}
+					Long processInstanceIdByBusinessKey = WorkflowServiceHelper.getProcessInstanceIdByBusinessKey(saveSuccessPkIds.get(0).toString());
+					if (processInstanceIdByBusinessKey != null) {
+						inProcess = true;
+					}
+				}
+				long endTime = System.currentTimeMillis();
+				log.info("query wf result cost:" + (endTime - startTime) + "ms");
+				if (inProcess) {
+					return submitResult;
+				}
+			}
+		}
+
+
+		long startTime = System.currentTimeMillis();
+		try {
+			OperateOption operateOption = OperateOption.create();
+			// 不执行警告级别校验器
+			operateOption.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(true));
+			OperationResult auditResult = OperationServiceHelper.executeOperate(OperationKeyConst.AUDIT, bill.getDataEntityType().getName(), saveSuccessPkIds.toArray(), operateOption);
+			if (!auditResult.isSuccess()) {
+				OperationServiceHelper.executeOperate(OperationKeyConst.UN_AUDIT, bill.getDataEntityType().getName(), saveSuccessPkIds.toArray(), OperateOption.create());
+				OperationServiceHelper.executeOperate(OperationKeyConst.UN_SUBMIT, bill.getDataEntityType().getName(), saveSuccessPkIds.toArray(), OperateOption.create());
+			}
+			long endTime = System.currentTimeMillis();
+			log.info("audit  cost:" + (endTime - startTime) + "ms");
+			return auditResult;
+		} catch (Exception e) {
+			OperationServiceHelper.executeOperate(OperationKeyConst.UN_AUDIT, bill.getDataEntityType().getName(), saveSuccessPkIds.toArray(), OperateOption.create());
+			OperationServiceHelper.executeOperate(OperationKeyConst.UN_SUBMIT, bill.getDataEntityType().getName(), saveSuccessPkIds.toArray(), OperateOption.create());
+			throw e;
+		}
+	}
+
+	/**
+	 * 保存提交合成一步
+	 *
+	 * @param bill             bill
+	 * @param isSubmitIgnoreWf 提交时是否跳过校验工作流
+	 * @return OperationResult
+	 */
+	public static OperationResult saveAndSubmitOperate(DynamicObject bill, boolean isSubmitIgnoreWf) {
+		return saveAndAuditOperate(bill, isSubmitIgnoreWf, false);
+	}
+
+	/**
+	 * 保存提交审核合成一步
+	 *
+	 * @param bill             bill
+	 * @param isSubmitIgnoreWf 提交时是否跳过校验工作流
+	 * @return OperationResult
+	 */
+	public static OperationResult saveAndAuditOperate(DynamicObject bill, boolean isSubmitIgnoreWf) {
+		return saveAndAuditOperate(bill, isSubmitIgnoreWf, true);
+	}
+
+	/**
+	 * 保存提交审核合成一步
+	 *
+	 * @param bill             bill
+	 * @param isSubmitIgnoreWf 提交时是否跳过校验工作流
+	 * @param isAudit          是否审核
+	 * @return OperationResult
+	 */
+	public static OperationResult saveAndAuditOperate(DynamicObject bill, boolean isSubmitIgnoreWf, boolean isAudit) {
+
+		Object pkValue = bill.getPkValue();
+		boolean deleteFlag = pkValue == null || Long.parseLong(pkValue.toString()) == 0;
+
+		/**
+		 * 调用保存操作
+		 */
+		OperationResult saveResult = WebApiUtils.saveOperate(ArrayUtils.toArray(bill));
+		if (!saveResult.isSuccess()) {
+			return saveResult;
+		}
+		List<Object> saveSuccessPkIds = saveResult.getSuccessPkIds();
+		StringBuilder stringBuilder = new StringBuilder();
+		/**
+		 * 调用提交操作
+		 */
+		if (!saveSuccessPkIds.isEmpty()) {
+			String entityKey = bill.getDataEntityType().getName();
+			String pkId = saveSuccessPkIds.get(0).toString();
+			MutexLockInfo lockInfo = new MutexLockInfo(String.valueOf(pkId), null, null, entityKey, OperationKeyConst.MODIFY, true, null);
+
+			OperateOption operateOption = OperateOption.create();
+			checkJxdOption(operateOption);
+			// 保存成功后干掉互斥锁  这里因为不太清楚锁的扭转状态 所以直接干掉
+			MutexHelper.release(entityKey, OperationKeyConst.MODIFY, pkId);
+			OperationResult submitResult = null;
+			try {
+				long startTime = System.currentTimeMillis();
+				if (isSubmitIgnoreWf) {
+					//只要有WF标识,就不会触发工作流
+					operateOption.setVariableValue("WF", "TRUE");
+				}
+				// 不执行警告级别校验器
+				operateOption.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(true));
+				submitResult = OperationServiceHelper.executeOperate(OperationKeyConst.SUBMIT, entityKey, saveSuccessPkIds.toArray(), operateOption);
+				if (!submitResult.isSuccess()) {
+					OperationServiceHelper.executeOperate(OperationKeyConst.UN_SUBMIT, entityKey, saveSuccessPkIds.toArray(), operateOption);
+					if (deleteFlag) {
+						OperationServiceHelper.executeOperate(OperationKeyConst.DELETE, entityKey, saveSuccessPkIds.toArray(), operateOption);
+					} else {
+						MutexHelper.require(lockInfo, stringBuilder);
+					}
+					long endTime = System.currentTimeMillis();
+					log.info("submit fail cost : ", endTime - startTime + "ms");
+					return submitResult;
+				}
+			} catch (Exception e) {
+				OperationServiceHelper.executeOperate(OperationKeyConst.UN_SUBMIT, entityKey, saveSuccessPkIds.toArray(), operateOption);
+				if (deleteFlag) {
+					OperationServiceHelper.executeOperate(OperationKeyConst.DELETE, entityKey, saveSuccessPkIds.toArray(), operateOption);
+				} else {
+					// 若提交失败 则重新锁上
+					MutexHelper.require(lockInfo, stringBuilder);
+				}
+				throw e;
+			}
+
+
+			if (!isSubmitIgnoreWf) {
+				/**
+				 * 如果进入审批流就直接返回给前端,无需走审核操作
+				 */
+				long startTime = System.currentTimeMillis();
+				Boolean existProc = WorkflowServiceHelper.existProcDefByEntityNumber(entityKey);
+				if (existProc) {
+					boolean inProcess = false;
+					int waitTime = 0;
+					int times = 1;
+					while (!inProcess) {
+						log.info("wait wf result:{}", times);
+						try {
+							waitTime += 200;
+							times++;
+							if (waitTime > 5000) {
+								break;
+							}
+							Thread.sleep(200);
+						} catch (InterruptedException e) {
+							log.error("保存提交审核合成一步报错:{}", e);
+						}
+						Long processInstanceIdByBusinessKey = WorkflowServiceHelper.getProcessInstanceIdByBusinessKey(pkId);
+						if (processInstanceIdByBusinessKey != null) {
+							inProcess = true;
+						}
+					}
+					long endTime = System.currentTimeMillis();
+					log.info("query wf result cost:" + (endTime - startTime) + "ms");
+					if (inProcess) {
+						return submitResult;
+					}
+				}
+			}
+
+
+			if (isAudit) {
+				long startTime = System.currentTimeMillis();
+				try {
+					OperationResult auditResult = OperationServiceHelper.executeOperate(OperationKeyConst.AUDIT, entityKey, saveSuccessPkIds.toArray(), operateOption);
+					long auditEndTime = System.currentTimeMillis();
+					log.info("audit operate cost:" + (auditEndTime - startTime) + "ms");
+					if (!auditResult.isSuccess()) {
+						OperationServiceHelper.executeOperate(OperationKeyConst.UN_AUDIT, entityKey, saveSuccessPkIds.toArray(), operateOption);
+						OperationServiceHelper.executeOperate(OperationKeyConst.UN_SUBMIT, entityKey, saveSuccessPkIds.toArray(), operateOption);
+						if (deleteFlag) {
+							OperationServiceHelper.executeOperate(OperationKeyConst.DELETE, entityKey, saveSuccessPkIds.toArray(), operateOption);
+						} else {
+							MutexHelper.require(lockInfo, stringBuilder);
+						}
+						long unAuditEnd = System.currentTimeMillis();
+						log.info("audit operate cost:" + (unAuditEnd - startTime) + "ms");
+						return auditResult;
+					}
+				} catch (Exception e) {
+					OperationServiceHelper.executeOperate(OperationKeyConst.UN_AUDIT, entityKey, saveSuccessPkIds.toArray(), operateOption);
+					OperationServiceHelper.executeOperate(OperationKeyConst.UN_SUBMIT, entityKey, saveSuccessPkIds.toArray(), operateOption);
+					if (deleteFlag) {
+						OperationServiceHelper.executeOperate(OperationKeyConst.DELETE, entityKey, saveSuccessPkIds.toArray(), operateOption);
+					} else {
+						// 若审核失败 则重新锁上
+						MutexHelper.require(lockInfo, stringBuilder);
+					}
+					throw e;
+				}
+				long endTime = System.currentTimeMillis();
+				log.info("audit  cost:" + (endTime - startTime) + "ms");
+			}
+		}
+		return saveResult;
+	}
+
+	/**
+	 * 获取组织id
+	 *
+	 * @param org org
+	 * @return {@link Long}
+	 */
+	public static Long getOrg(String org) {
+		return StringUtils.isBlank(org) ? RequestContext.get().getOrgId() : Long.parseLong(org);
+	}
+
+
+	/**
+	 * 审核
+	 *
+	 * @param bill
+	 * @return
+	 */
+	public static OperationResult auditOperate(DynamicObject bill) {
+		long id = bill.getLong(BaseFieldConst.ID);
+		Long[] ids = {id};
+		OperateOption operateOption = OperateOption.create();
+		// 不执行警告级别校验器
+		operateOption.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(true));
+		OperationResult auditResult = OperationServiceHelper.executeOperate(OperationKeyConst.AUDIT, bill.getDataEntityType().getName(), ids, OperateOption.create());
+		return auditResult;
+	}
+
+
+	/**
+	 * 整合operation操作错误信息进行返回
+	 *
+	 * @param opResult
+	 * @return
+	 */
+	public static String getErrMsg(OperationResult opResult) {
+		String message = opResult.getMessage();
+		StringBuilder detailMessage = new StringBuilder();
+		if (!StringUtils.isEmpty(message)) {
+			detailMessage.append(message);
+		}
+		for (IOperateInfo errInfo : opResult.getAllErrorOrValidateInfo()) {
+			detailMessage.append(errInfo.getMessage());
+		}
+		InteractionContext context = opResult.getInteractionContext();
+		if (!ObjectUtils.isEmpty(context)) {
+			detailMessage.append(context.getSimpleMessage());
+		}
+		return detailMessage.toString();
+	}
+
+	private static void checkJxdOption(OperateOption option) {
+		if (RequestContext.get().getCurrUserId() != NUM) {
+			return;
+		}
+		// 不执行警告级别校验器
+		option.setVariableValue(OperateOptionConst.MUTEX_IGNORE_VALIDATION, String.valueOf(true));
+		// 不显示交互提示,自动执行到底
+		option.setVariableValue(OperateOptionConst.IGNOREINTERACTION, String.valueOf(true));
+		// 全部校验通过才保存
+		option.setVariableValue(OperateOptionConst.STRICTVALIDATION, String.valueOf(true));
+		// 跳过权限校验
+		option.setVariableValue("skipCheckDataPermission", "true");
+		option.setVariableValue("skipCheckSpecialDataPermission", "true");
+		option.setVariableValue(OperateOptionConst.ISHASRIGHT, "true");
+	}
+}

+ 0 - 26
build.gradle

@@ -146,31 +146,5 @@ subprojects {
 	 
 	test.ignoreFailures true
 
-	task generate {
-		doLast {
-			def buildFile = project.buildscript.sourceFile.toString()
-			println("buildFile:" + buildFile)
-			def fileSrc = buildFile.replace("build.gradle", "").concat("sbt-nm-webapi/src/main/java/").concat("sbt/nm/webapi/model")
-			println("fileSrc:" + fileSrc)
-
-			// 应用编码、页面编码、定义类名称、数据中心ID、租户ID
-			def appName = 'sbt_nm_launch'
-			def entityId = 'sbt_nm_launchappraisal'
-			def className = 'launchappraisal'
-			def datacenterId = '1905905108789493760'
-			def tenantCode = 'sbt-test-tenant'
-
-			// 处理类请求地址
-			def req = new URL('http://127.0.0.1:8080/ierp/xn/auth/develop/modelclass/generate.do?appId=' + appName + '&entityId='
-					+ entityId + '&className=' + className + "&fileSrc=" + fileSrc + "&datacenterId=" + datacenterId+ "&tenantCode=" + tenantCode).openConnection()
-			println("URL:" + req)
-			req.setRequestMethod("GET")
-			req.setRequestProperty("Content-Type", "application/json; charset=UTF-8")
-			req.setDoOutput(true)
-			def text = req.getInputStream().getText()
-			println("Response:" + text)
-		}
-	}
-	
 }
 

+ 175 - 0
nckd-fi/src/main/java/nckd/fi/er/common/constant/ErPayeerConstant.java

@@ -0,0 +1,175 @@
+package nckd.fi.er.common.constant;
+
+/**
+ * 收款信息常量类
+ *
+ * @author 章涛
+ * @version 1.0
+ * @date 2025-12-08 10:01:23
+ */
+public class ErPayeerConstant {
+    /**
+     * 实体标识
+     **/
+    public static final String FORMBILLID = "er_payeer";
+    /**
+     * 缺省id字段
+     **/
+    public static final String ID = "ID";
+    /**
+     * 编码
+     **/
+    public static final String NUMBER = "NUMBER";
+    /**
+     * 名称
+     **/
+    public static final String NAME = "NAME";
+    /**
+     * 数据状态
+     **/
+    public static final String STATUS = "STATUS";
+    /**
+     * 创建人
+     **/
+    public static final String CREATOR = "CREATOR";
+    /**
+     * 修改人
+     **/
+    public static final String MODIFIER = "MODIFIER";
+    /**
+     * 使用状态
+     **/
+    public static final String ENABLE = "ENABLE";
+    /**
+     * 创建时间
+     **/
+    public static final String CREATETIME = "CREATETIME";
+    /**
+     * 修改时间
+     **/
+    public static final String MODIFYTIME = "MODIFYTIME";
+    /**
+     * 主数据内码
+     **/
+    public static final String MASTERID = "MASTERID";
+    /**
+     * 创建组织
+     **/
+    public static final String CREATEORG = "CREATEORG";
+    /**
+     * 组织
+     **/
+    public static final String ORG = "ORG";
+    /**
+     * 业务组织
+     **/
+    public static final String USEORG = "USEORG";
+    /**
+     * 控制策略
+     **/
+    public static final String CTRLSTRATEGY = "CTRLSTRATEGY";
+    /**
+     * 原资料id
+     **/
+    public static final String SOURCEDATA = "SOURCEDATA";
+    /**
+     * 位图
+     **/
+    public static final String BITINDEX = "BITINDEX";
+    /**
+     * 原资料位图
+     **/
+    public static final String SRCINDEX = "SRCINDEX";
+    /**
+     * 原创建组织
+     **/
+    public static final String SRCCREATEORG = "SRCCREATEORG";
+    /**
+     * 禁用人
+     **/
+    public static final String DISABLER = "DISABLER";
+    /**
+     * 禁用时间
+     **/
+    public static final String DISABLEDATE = "DISABLEDATE";
+    /**
+     * 收款银行
+     **/
+    public static final String PAYERBANK = "PAYERBANK";
+    /**
+     * 银行账号
+     **/
+    public static final String PAYERACCOUNT = "PAYERACCOUNT";
+    /**
+     * 默认收款信息
+     **/
+    public static final String ISDEFAULT = "ISDEFAULT";
+    /**
+     * 银行卡背景图片
+     **/
+    public static final String BACKGROUNDIMG = "BACKGROUNDIMG";
+    /**
+     * 银行logo图片
+     **/
+    public static final String BANKLOGO1 = "BANKLOGO1";
+    /**
+     * 银行账号前后四位
+     **/
+    public static final String PAYERACCOUNT02 = "PAYERACCOUNT02";
+    /**
+     * 银行账号4位
+     **/
+    public static final String PAYERACCOUNT01 = "PAYERACCOUNT01";
+    /**
+     * 银行logo图标
+     **/
+    public static final String BANKLOGO = "BANKLOGO";
+    /**
+     * 币种
+     **/
+    public static final String CURRENCY = "CURRENCY";
+    /**
+     * 职员
+     **/
+    public static final String ISEMPLOYEE = "ISEMPLOYEE";
+    /**
+     * 收款人
+     **/
+    public static final String OUTPAYER = "OUTPAYER";
+    /**
+     * 收款人F7
+     **/
+    public static final String PAYERF7 = "PAYERF7";
+    /**
+     * 收款人
+     **/
+    public static final String PAYER = "PAYER";
+    /**
+     * 对公账号
+     **/
+    public static final String ISTOPUBLIC = "ISTOPUBLIC";
+    /**
+     * 授权使用
+     **/
+    public static final String ISSHARE = "ISSHARE";
+    /**
+     * 使用人
+     **/
+    public static final String USERID = "USERID";
+    /**
+     * 全员应用
+     **/
+    public static final String FULLAPP = "FULLAPP";
+    /**
+     * 账户名称
+     **/
+    public static final String PAYERACCOUNTNAME = "PAYERACCOUNTNAME";
+    /**
+     * 开户省
+     **/
+    public static final String NCKD_KHS = "NCKD_KHS";
+    /**
+     * 开户市(地区)
+     **/
+    public static final String NCKD_KHSQ = "NCKD_KHSQ";
+}

+ 371 - 0
nckd-fi/src/main/java/nckd/fi/er/common/constant/ErReimburseSettingConstant.java

@@ -0,0 +1,371 @@
+package nckd.fi.er.common.constant;
+
+/**
+ * 报销级别设置常量类
+ *
+ * @author 章涛
+ * @version 1.0
+ * @date 2025-12-08 09:30:18
+ */
+public class ErReimburseSettingConstant {
+    /**
+     * 实体标识
+     **/
+    public static final String FORMBILLID = "er_reimbursesetting";
+    /**
+     * 缺省id字段
+     **/
+    public static final String ID = "ID";
+    /**
+     * 职员编码
+     **/
+    public static final String NUMBER = "NUMBER";
+    /**
+     * 职员名称
+     **/
+    public static final String NAME = "NAME";
+    /**
+     * 数据状态
+     **/
+    public static final String STATUS = "STATUS";
+    /**
+     * 创建人
+     **/
+    public static final String CREATOR = "CREATOR";
+    /**
+     * 修改人
+     **/
+    public static final String MODIFIER = "MODIFIER";
+    /**
+     * 使用状态
+     **/
+    public static final String ENABLE = "ENABLE";
+    /**
+     * 创建时间
+     **/
+    public static final String CREATETIME = "CREATETIME";
+    /**
+     * 修改时间
+     **/
+    public static final String MODIFYTIME = "MODIFYTIME";
+    /**
+     * 主数据内码
+     **/
+    public static final String MASTERID = "MASTERID";
+    /**
+     * 禁用人
+     **/
+    public static final String DISABLER = "DISABLER";
+    /**
+     * 禁用时间
+     **/
+    public static final String DISABLEDATE = "DISABLEDATE";
+    /**
+     * 性别
+     **/
+    public static final String GENDER = "GENDER";
+    /**
+     * 部门分录
+     **/
+    public static final String ENTRYENTITY = "ENTRYENTITY";
+    /**
+     * 分录行号
+     **/
+    public static final String SEQ = "SEQ";
+    /**
+     * 部门
+     **/
+    public static final String DPT = "DPT";
+    /**
+     * 负责人
+     **/
+    public static final String ISINCHARGE = "ISINCHARGE";
+    /**
+     * 兼职
+     **/
+    public static final String ISPARTJOB = "ISPARTJOB";
+    /**
+     * 职位
+     **/
+    public static final String POSITION = "POSITION";
+    /**
+     * 直接上级
+     **/
+    public static final String SUPERIOR = "SUPERIOR";
+    /**
+     * 组织结构
+     **/
+    public static final String ORGSTRUCTURE = "ORGSTRUCTURE";
+    /**
+     * 岗位
+     **/
+    public static final String POST = "POST";
+    /**
+     * 公司(列表动态加载)
+     **/
+    public static final String COMPANYTMP = "COMPANYTMP";
+    /**
+     * 报销级别(列表动态加载)
+     **/
+    public static final String REIMBURSELEVELTMP = "REIMBURSELEVELTMP";
+    /**
+     * 用户云之家OpenID
+     **/
+    public static final String USEROPENID = "USEROPENID";
+    /**
+     * 人员头像
+     **/
+    public static final String PICTUREFIELD = "PICTUREFIELD";
+    /**
+     * 生日
+     **/
+    public static final String BIRTHDAY = "BIRTHDAY";
+    /**
+     * 证件号码
+     **/
+    public static final String IDCARD = "IDCARD";
+    /**
+     * 姓名全拼
+     **/
+    public static final String FULLPINYIN = "FULLPINYIN";
+    /**
+     * 姓名简拼
+     **/
+    public static final String SIMPLEPINYIN = "SIMPLEPINYIN";
+    /**
+     * 类型(过时)
+     **/
+    public static final String USERTYPE = "USERTYPE";
+    /**
+     * 用户类型
+     **/
+    public static final String TYPE = "TYPE";
+    /**
+     * 授权状态
+     **/
+    public static final String AUTHORSTATUS = "AUTHORSTATUS";
+    /**
+     * 用户禁用
+     **/
+    public static final String ISFORBIDDEN = "ISFORBIDDEN";
+    /**
+     * 是否锁定
+     **/
+    public static final String ISLOCKED = "ISLOCKED";
+    /**
+     * 密码
+     **/
+    public static final String PASSWORD = "PASSWORD";
+    /**
+     * 开始日期
+     **/
+    public static final String STARTDATE = "STARTDATE";
+    /**
+     * 结束日期
+     **/
+    public static final String ENDDATE = "ENDDATE";
+    /**
+     * 人员头像
+     **/
+    public static final String HEADSCULPTURE = "HEADSCULPTURE";
+    /**
+     * 激活状态
+     **/
+    public static final String ISACTIVED = "ISACTIVED";
+    /**
+     * 注册状态
+     **/
+    public static final String ISREGISTED = "ISREGISTED";
+    /**
+     * 历史密码
+     **/
+    public static final String PSWHISSTR = "PSWHISSTR";
+    /**
+     * 密码策略
+     **/
+    public static final String PSWSTRATEGY = "PSWSTRATEGY";
+    /**
+     * 密码生效日期
+     **/
+    public static final String PSWEFFECTIVEDATE = "PSWEFFECTIVEDATE";
+    /**
+     * 用户名
+     **/
+    public static final String USERNAME = "USERNAME";
+    /**
+     * 数据来源
+     **/
+    public static final String SOURCE = "SOURCE";
+    /**
+     * 工作圈eid
+     **/
+    public static final String EID = "EID";
+    /**
+     * 团队ID
+     **/
+    public static final String TID = "TID";
+    /**
+     * 云之家账号内码
+     **/
+    public static final String FUID = "FUID";
+    /**
+     * 锁定日期
+     **/
+    public static final String LOCKEDTIME = "LOCKEDTIME";
+    /**
+     * 密码错误次数
+     **/
+    public static final String ERRCOUNT = "ERRCOUNT";
+    /**
+     * 类型(废弃)
+     **/
+    public static final String USERTYPENEW = "USERTYPENEW";
+    /**
+     * 是否可编辑
+     **/
+    public static final String EDITABLE = "EDITABLE";
+    /**
+     * 邮箱
+     **/
+    public static final String EMAIL = "EMAIL";
+    /**
+     * 联系方式分录
+     **/
+    public static final String CONTACTENTITY = "CONTACTENTITY";
+    /**
+     * 类型
+     **/
+    public static final String CONTACTTYPE = "CONTACTTYPE";
+    /**
+     * 联系方式
+     **/
+    public static final String CONTACT = "CONTACT";
+    /**
+     * 默认
+     **/
+    public static final String ISDEFAULT = "ISDEFAULT";
+    /**
+     * 外部ID
+     **/
+    public static final String EXTERNALUUID = "EXTERNALUUID";
+    /**
+     * 类型
+     **/
+    public static final String USERTYPES = "USERTYPES";
+    /**
+     * 国家/地区
+     **/
+    public static final String COUNTRY = "COUNTRY";
+    /**
+     * 用户禁用人
+     **/
+    public static final String USERDISABLERID = "USERDISABLERID";
+    /**
+     * 用户禁用时间
+     **/
+    public static final String USERDISABLETIME = "USERDISABLETIME";
+    /**
+     * 使用系统结束日期
+     **/
+    public static final String USEENDDATE = "USEENDDATE";
+    /**
+     * 排序码
+     **/
+    public static final String SORTNUMBER = "SORTNUMBER";
+    /**
+     * 证件类型
+     **/
+    public static final String IDTYPE = "IDTYPE";
+    /**
+     * 手机
+     **/
+    public static final String PHONE = "PHONE";
+    /**
+     * 上次登录时间
+     **/
+    public static final String LASTLOGINTIME = "LASTLOGINTIME";
+    /**
+     * 上次登录ip
+     **/
+    public static final String LASTLOGINIP = "LASTLOGINIP";
+    /**
+     * 国家或地区
+     **/
+    public static final String NS_COUNTRY = "NS_COUNTRY";
+    /**
+     * 姓名格式
+     **/
+    public static final String NS_NAMESTYLE = "NS_NAMESTYLE";
+    /**
+     * First Name
+     **/
+    public static final String NS_FIRSTNAME = "NS_FIRSTNAME";
+    /**
+     * Middle Name
+     **/
+    public static final String NS_MIDDLENAME = "NS_MIDDLENAME";
+    /**
+     * Last Name
+     **/
+    public static final String NS_LASTNAME = "NS_LASTNAME";
+    /**
+     * Title
+     **/
+    public static final String NS_TITLE = "NS_TITLE";
+    /**
+     * 缩写
+     **/
+    public static final String NS_ABBR = "NS_ABBR";
+    /**
+     * Nick Name
+     **/
+    public static final String NS_NICKNAME = "NS_NICKNAME";
+    /**
+     * 职称
+     **/
+    public static final String NS_POSTTITLE = "NS_POSTTITLE";
+    /**
+     * Second Name
+     **/
+    public static final String NS_CUSTOMFIELD1 = "NS_CUSTOMFIELD1";
+    /**
+     * Initials
+     **/
+    public static final String NS_CUSTOMFIELD2 = "NS_CUSTOMFIELD2";
+    /**
+     * Suffix
+     **/
+    public static final String NS_CUSTOMFIELD3 = "NS_CUSTOMFIELD3";
+    /**
+     * 自定义字段4
+     **/
+    public static final String NS_CUSTOMFIELD4 = "NS_CUSTOMFIELD4";
+    /**
+     * 报销级别(废弃)
+     **/
+    public static final String REIMBURSELEVEL = "REIMBURSELEVEL";
+    /**
+     * 状态
+     **/
+    public static final String AUDITSTATUS = "AUDITSTATUS";
+    /**
+     * 使用组织
+     **/
+    public static final String USEORG = "USEORG";
+    /**
+     * 报销级别
+     **/
+    public static final String REIMLEVELENTRY = "REIMLEVELENTRY";
+    /**
+     * 公司
+     **/
+    public static final String COMPANY = "COMPANY";
+    /**
+     * 兼职
+     **/
+    public static final String PARTJOB = "PARTJOB";
+    /**
+     * 报销级别
+     **/
+    public static final String ENTRYREIMBURSELEVEL = "ENTRYREIMBURSELEVEL";
+}

+ 203 - 0
nckd-fi/src/main/java/nckd/fi/er/webapi/cutomer/UserQueryWebApiPlugin.java

@@ -0,0 +1,203 @@
+package nckd.fi.er.webapi.cutomer;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.openapi.common.custom.annotation.ApiController;
+import kd.bos.openapi.common.custom.annotation.ApiMapping;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
+import kd.bos.openapi.common.result.CustomApiResult;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import nckd.base.common.constant.BaseFieldConst;
+import nckd.base.common.constant.BosUserConstant;
+import nckd.base.common.enums.BillStatusEnum;
+import nckd.base.common.model.BasePageModel;
+import nckd.base.common.utils.QFilterUtils;
+import nckd.fi.er.common.constant.ErPayeerConstant;
+import nckd.fi.er.common.constant.ErReimburseSettingConstant;
+import nckd.fi.er.webapi.model.BosUserModel;
+import nckd.fi.er.webapi.model.PayeeBankModel;
+import nckd.fi.er.webapi.model.ReimburseSetModel;
+import nckd.base.common.utils.DoMoConvertUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author:Zt
+ * @Date:2025/12/5
+ **/
+@ApiController(value = "UserQueryWebApiPlugin", desc = "人员查询接口(商旅)")
+@ApiMapping(value = "/user")
+public class UserQueryWebApiPlugin implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiPostMapping(desc = "查询人员数据", value = "/queryUserList")
+    public CustomApiResult<List<BosUserModel>> queryUserList(
+            @ApiParam("员工姓名") String username,
+            @ApiParam("员工id") String userid,
+            @ApiParam("员工编码") String userno,
+            @ApiParam("修改时间") Date updatetime,
+            @ApiParam(example = "10", value = "页码") Integer pageSize,
+            @ApiParam(example = "1", value = "当前页") Integer pageNo) {
+        QFilter qFilter = new QFilter(BosUserConstant.ENABLE, QCP.equals,"1");
+
+        if(StringUtils.isNotEmpty(username)){
+            qFilter.and(BosUserConstant.NAME, QCP.equals,username);
+        }
+        if(StringUtils.isNotEmpty(userid)){
+            qFilter.and(BosUserConstant.ID, QCP.equals,userid);
+        }
+        if(StringUtils.isNotEmpty(userno)){
+            qFilter.and(BosUserConstant.NUMBER, QCP.equals,userno);
+        }
+        if(ObjectUtils.isNotEmpty(updatetime)){
+            qFilter.and(BosUserConstant.MODIFYTIME, QCP.large_equals,updatetime);
+        }
+        //user对象
+        DynamicObject[] userMap;
+        if(null == pageSize || null == pageNo){
+            userMap = BusinessDataServiceHelper.load(BosUserConstant.FORMBILLID, BosUserConstant.ALLFIELD, qFilter.toArray());
+        }else {
+            userMap = BusinessDataServiceHelper.load(BosUserConstant.FORMBILLID, BosUserConstant.ALLFIELD, qFilter.toArray(), null, pageNo, pageSize);
+        }
+        List<BosUserModel> userModelList = DoMoConvertUtils.toListModel(userMap, new BosUserModel());
+        //user对象,编码-ID
+        Map<String, String> userDataMap = userModelList.stream()
+                .filter(e->ObjectUtils.isNotEmpty(e.getNumber())).collect(Collectors.toMap(
+                BosUserModel::getNumber,
+                BosUserModel::getId
+        ));
+
+        //Map -->  key = 人员id,value = Map<组织id,报销级别对象>
+        Map<String, List<DynamicObject>> reimburseLevelMap = getReimburseLevel(new ArrayList<>(userDataMap.values()));
+        //报销级别
+        QFilter userQf = new QFilter(ErReimburseSettingConstant.AUDITSTATUS,QCP.equals, BillStatusEnum.AUDIT.getValue());
+        userQf.and(ErReimburseSettingConstant.NUMBER, QCP.in, new ArrayList<>(userDataMap.keySet()));
+        DynamicObjectCollection erRebQuery = QueryServiceHelper.query(ErReimburseSettingConstant.FORMBILLID,
+                getErReimburseFields(), userQf.toArray());
+
+        //Map--> key = 人员编码,value = 报销级别对象
+        Map<String, List<ReimburseSetModel>> reimburMap = erRebQuery.stream()
+                .collect(Collectors.toMap(
+                        erReb -> erReb.getString(ErReimburseSettingConstant.NUMBER),
+                        erReb -> {
+                            List<ReimburseSetModel> reModelList = new ArrayList<>();
+                            List<DynamicObject> mapList = reimburseLevelMap.get(erReb.getString(ErReimburseSettingConstant.NUMBER));
+                            for (DynamicObject reimburseLevel : mapList) {
+                                ReimburseSetModel reModel = toReModel(reimburseLevel);
+                                reModelList.add(reModel);
+                            }
+                            return reModelList;
+                        }));
+
+
+        //个人银行信息
+        QFilter payeeQf = QFilterUtils.getBaseDataQFilter();
+        payeeQf.and(new QFilter(ErPayeerConstant.ISEMPLOYEE,QCP.equals,"1"));
+        payeeQf.and(new QFilter(ErPayeerConstant.PAYER+ BaseFieldConst.PID, QCP.in, new ArrayList<>(userDataMap.values())));
+        DynamicObjectCollection payeeQuery = QueryServiceHelper.query(ErPayeerConstant.FORMBILLID,getPayeeFields(), payeeQf.toArray());
+
+        //Map--> key = 人员编码,value = 银行信息对象
+        Map<String, List<PayeeBankModel>> payeeMap = payeeQuery.stream()
+                .collect(Collectors.groupingBy(
+                                payee -> payee.getString(ErPayeerConstant.PAYER + BaseFieldConst.PNUMBER),
+                                Collectors.mapping(this::toPayeeModel
+                                        , Collectors.toList())
+                        )
+                );
+
+        //合并信息
+        for(BosUserModel user : userModelList) {
+            String userNum = user.getNumber();
+            if(payeeMap.get(userNum) != null) {
+                user.setBankentityentry(payeeMap.get(userNum));
+            }
+            if(reimburMap.get(userNum) != null) {
+                user.setReimeburentry(reimburMap.get(userNum));
+            }
+        }
+
+        BasePageModel basePageModel = new BasePageModel(pageNo, pageSize, Collections.singletonList(userModelList));
+        return CustomApiResult.success(userModelList);
+    }
+
+
+    public static Map<String, List<DynamicObject>> getReimburseLevel(List<Object> users) {
+        Map<String, List<DynamicObject>> reimburseLevelMap = new HashMap<>(16);
+        QFilter q1 = new QFilter("user", "in", users);
+        Map<Object, DynamicObject> result = BusinessDataServiceHelper.loadFromCache("er_reimbursesetting_rel", "user,reimburselevel,company", new QFilter[]{q1});
+
+        for(Map.Entry<Object, DynamicObject> entry : result.entrySet()) {
+            DynamicObject relation = entry.getValue();
+            List<DynamicObject> innerList = reimburseLevelMap.get(relation.getString("user.number"));
+            if (innerList == null || innerList.isEmpty()) {
+                innerList = new ArrayList<>();
+            }
+            innerList.add(relation);
+            reimburseLevelMap.put(relation.getString("user.number"), innerList);
+        }
+        return reimburseLevelMap;
+    }
+
+    private PayeeBankModel toPayeeModel(DynamicObject payee) {
+        PayeeBankModel model = new PayeeBankModel();
+        model.setCreateorg_id(payee.getString(ErPayeerConstant.CREATEORG));
+        model.setCreateorg_name(payee.getString(ErPayeerConstant.CREATEORG+ BaseFieldConst.PNAME));
+        model.setCreateorg_number(payee.getString(ErPayeerConstant.CREATEORG + BaseFieldConst.PNUMBER));
+        model.setPayerbank_id(payee.getString(ErPayeerConstant.PAYERBANK));
+        model.setPayerbank_name(payee.getString(ErPayeerConstant.PAYERBANK + BaseFieldConst.PNAME));
+        model.setPayerbank_number(payee.getString(ErPayeerConstant.PAYERBANK + BaseFieldConst.PNUMBER));
+        model.setUsernumber(payee.getString(ErPayeerConstant.PAYER + BaseFieldConst.PNUMBER));
+        model.setIsdefault(payee.getBoolean(ErPayeerConstant.ISDEFAULT));
+        model.setPayeraccount(payee.getString(ErPayeerConstant.PAYERACCOUNT));
+        model.setPayeraccountname(payee.getString(ErPayeerConstant.PAYERACCOUNTNAME));
+        return model;
+    }
+
+    private ReimburseSetModel toReModel(DynamicObject erReb) {
+        ReimburseSetModel model = new ReimburseSetModel();
+        model.setCompany_id(String.valueOf(erReb.getLong(ErReimburseSettingConstant.COMPANY+BaseFieldConst.PID)));
+        model.setCompany_name(erReb.getString(ErReimburseSettingConstant.COMPANY+BaseFieldConst.PNAME));
+        model.setCompany_number(erReb.getString(ErReimburseSettingConstant.COMPANY+BaseFieldConst.PNUMBER));
+        model.setEntryreimburselevel_id(erReb.getString("reimburselevel.id"));
+        model.setEntryreimburselevel_name(erReb.getString("reimburselevel.name"));
+        model.setEntryreimburselevel_number(erReb.getString("reimburselevel.number"));
+        return model;
+    }
+
+    private static String getPayeeFields() {
+        return String.join(",", ErPayeerConstant.PAYER + BaseFieldConst.PNUMBER,
+                ErPayeerConstant.PAYERBANK,
+                ErPayeerConstant.PAYERBANK + BaseFieldConst.PNUMBER,
+                ErPayeerConstant.PAYERBANK + BaseFieldConst.PNAME,
+                ErPayeerConstant.PAYERACCOUNT,
+                ErPayeerConstant.PAYERACCOUNTNAME,
+                ErPayeerConstant.CREATEORG,
+                ErPayeerConstant.CREATEORG + BaseFieldConst.PNAME,
+                ErPayeerConstant.CREATEORG + BaseFieldConst.PNUMBER,
+                ErPayeerConstant.ISDEFAULT
+        );
+    }
+
+    private static String getErReimburseFields() {
+        return String.join(",",
+                ErReimburseSettingConstant.NUMBER
+//                ErReimburseSettingConstant.REIMLEVELENTRY
+//                ErReimburseSettingConstant.REIMLEVELENTRY + StrUtil.DOT + ErReimburseSettingConstant.PARTJOB
+//                ErReimburseSettingConstant.REIMLEVELENTRY + StrUtil.DOT + ErReimburseSettingConstant.COMPANY,
+//                ErReimburseSettingConstant.REIMLEVELENTRY + StrUtil.DOT + ErReimburseSettingConstant.COMPANY + BaseFieldConst.PNAME,
+//                ErReimburseSettingConstant.REIMLEVELENTRY + StrUtil.DOT + ErReimburseSettingConstant.COMPANY + BaseFieldConst.PNUMBER,
+//                ErReimburseSettingConstant.REIMLEVELENTRY + StrUtil.DOT + ErReimburseSettingConstant.ENTRYREIMBURSELEVEL,
+//                ErReimburseSettingConstant.REIMLEVELENTRY + StrUtil.DOT + ErReimburseSettingConstant.ENTRYREIMBURSELEVEL + BaseFieldConst.PNAME,
+//                ErReimburseSettingConstant.REIMLEVELENTRY + StrUtil.DOT + ErReimburseSettingConstant.ENTRYREIMBURSELEVEL + BaseFieldConst.PNUMBER
+                );
+    }
+
+}

+ 33 - 0
nckd-fi/src/main/java/nckd/fi/er/webapi/model/BosUserContactEtModel.java

@@ -1,6 +1,7 @@
 package nckd.fi.er.webapi.model;
 
 import kd.bos.openapi.common.custom.annotation.ApiParam;
+import nckd.base.common.model.BaseModel;
 
 import java.io.Serializable;
 
@@ -18,4 +19,36 @@ public class BosUserContactEtModel extends BaseModel implements Serializable {
     private String contact ;
     @ApiParam(value = "联系方式分录.默认")
     private boolean isdefault ;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public int getSeq() {
+        return seq;
+    }
+
+    public void setSeq(int seq) {
+        this.seq = seq;
+    }
+
+    public String getContact() {
+        return contact;
+    }
+
+    public void setContact(String contact) {
+        this.contact = contact;
+    }
+
+    public boolean isIsdefault() {
+        return isdefault;
+    }
+
+    public void setIsdefault(boolean isdefault) {
+        this.isdefault = isdefault;
+    }
 }

+ 66 - 0
nckd-fi/src/main/java/nckd/fi/er/webapi/model/BosUserEntityModel.java

@@ -1,6 +1,8 @@
 package nckd.fi.er.webapi.model;
 
 import kd.bos.openapi.common.custom.annotation.ApiParam;
+import nckd.base.common.model.BaseDataModel;
+import nckd.base.common.model.BaseModel;
 
 import java.io.Serializable;
 
@@ -26,4 +28,68 @@ public class BosUserEntityModel extends BaseModel implements Serializable {
     private BaseDataModel dpt;
     @ApiParam(value = "直接上级")
     private BaseDataModel superior;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public int getSeq() {
+        return seq;
+    }
+
+    public void setSeq(int seq) {
+        this.seq = seq;
+    }
+
+    public boolean isIsincharge() {
+        return isincharge;
+    }
+
+    public void setIsincharge(boolean isincharge) {
+        this.isincharge = isincharge;
+    }
+
+    public Boolean getIspartjob() {
+        return ispartjob;
+    }
+
+    public void setIspartjob(Boolean ispartjob) {
+        this.ispartjob = ispartjob;
+    }
+
+    public String getPosition() {
+        return position;
+    }
+
+    public void setPosition(String position) {
+        this.position = position;
+    }
+
+    public BaseDataModel getPost() {
+        return post;
+    }
+
+    public void setPost(BaseDataModel post) {
+        this.post = post;
+    }
+
+    public BaseDataModel getDpt() {
+        return dpt;
+    }
+
+    public void setDpt(BaseDataModel dpt) {
+        this.dpt = dpt;
+    }
+
+    public BaseDataModel getSuperior() {
+        return superior;
+    }
+
+    public void setSuperior(BaseDataModel superior) {
+        this.superior = superior;
+    }
 }

+ 287 - 0
nckd-fi/src/main/java/nckd/fi/er/webapi/model/BosUserModel.java

@@ -2,6 +2,7 @@ package nckd.fi.er.webapi.model;
 
 import kd.bos.openapi.common.custom.annotation.ApiModel;
 import kd.bos.openapi.common.custom.annotation.ApiParam;
+import nckd.base.common.model.BaseModel;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -13,6 +14,7 @@ import java.util.List;
  **/
 @ApiModel
 public class BosUserModel extends BaseModel implements Serializable {
+    private static final long serialVersionUID = 1L;
     @ApiParam(value = "id")
     private String id ;
     @ApiParam(value = "姓名")
@@ -83,5 +85,290 @@ public class BosUserModel extends BaseModel implements Serializable {
     @ApiParam(value = "类型")
     private List<UserTypeModel> usertypes ;
 
+    @ApiParam(value = "人员报销级别设置")
+    private List<ReimburseSetModel> reimeburentry ;
 
+    @ApiParam(value = "人员银行信息")
+    private List<PayeeBankModel> bankentityentry ;
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getEnable() {
+        return enable;
+    }
+
+    public void setEnable(String enable) {
+        this.enable = enable;
+    }
+
+    public Date getCreatetime() {
+        return createtime;
+    }
+
+    public void setCreatetime(Date createtime) {
+        this.createtime = createtime;
+    }
+
+    public Date getModifytime() {
+        return modifytime;
+    }
+
+    public void setModifytime(Date modifytime) {
+        this.modifytime = modifytime;
+    }
+
+    public String getMasterid() {
+        return masterid;
+    }
+
+    public void setMasterid(String masterid) {
+        this.masterid = masterid;
+    }
+
+    public Date getDisabledate() {
+        return disabledate;
+    }
+
+    public void setDisabledate(Date disabledate) {
+        this.disabledate = disabledate;
+    }
+
+    public String getGender() {
+        return gender;
+    }
+
+    public void setGender(String gender) {
+        this.gender = gender;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public String getIdcard() {
+        return idcard;
+    }
+
+    public void setIdcard(String idcard) {
+        this.idcard = idcard;
+    }
+
+    public String getFullpinyin() {
+        return fullpinyin;
+    }
+
+    public void setFullpinyin(String fullpinyin) {
+        this.fullpinyin = fullpinyin;
+    }
+
+    public String getSimplepinyin() {
+        return simplepinyin;
+    }
+
+    public void setSimplepinyin(String simplepinyin) {
+        this.simplepinyin = simplepinyin;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getAuthorstatus() {
+        return authorstatus;
+    }
+
+    public void setAuthorstatus(String authorstatus) {
+        this.authorstatus = authorstatus;
+    }
+
+    public boolean isIsforbidden() {
+        return isforbidden;
+    }
+
+    public void setIsforbidden(boolean isforbidden) {
+        this.isforbidden = isforbidden;
+    }
+
+    public boolean isIslocked() {
+        return islocked;
+    }
+
+    public void setIslocked(boolean islocked) {
+        this.islocked = islocked;
+    }
+
+    public Date getStartdate() {
+        return startdate;
+    }
+
+    public void setStartdate(Date startdate) {
+        this.startdate = startdate;
+    }
+
+    public Date getEnddate() {
+        return enddate;
+    }
+
+    public void setEnddate(Date enddate) {
+        this.enddate = enddate;
+    }
+
+    public boolean isIsactived() {
+        return isactived;
+    }
+
+    public void setIsactived(boolean isactived) {
+        this.isactived = isactived;
+    }
+
+    public boolean isIsregisted() {
+        return isregisted;
+    }
+
+    public void setIsregisted(boolean isregisted) {
+        this.isregisted = isregisted;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public String getLockedtime() {
+        return lockedtime;
+    }
+
+    public void setLockedtime(String lockedtime) {
+        this.lockedtime = lockedtime;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public Date getUserdisabletime() {
+        return userdisabletime;
+    }
+
+    public void setUserdisabletime(Date userdisabletime) {
+        this.userdisabletime = userdisabletime;
+    }
+
+    public Date getUseenddate() {
+        return useenddate;
+    }
+
+    public void setUseenddate(Date useenddate) {
+        this.useenddate = useenddate;
+    }
+
+    public String getSortnumber() {
+        return sortnumber;
+    }
+
+    public void setSortnumber(String sortnumber) {
+        this.sortnumber = sortnumber;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public List<BosUserEntityModel> getEntityentry() {
+        return entityentry;
+    }
+
+    public void setEntityentry(List<BosUserEntityModel> entityentry) {
+        this.entityentry = entityentry;
+    }
+
+    public List<BosUserContactEtModel> getContactentity() {
+        return contactentity;
+    }
+
+    public void setContactentity(List<BosUserContactEtModel> contactentity) {
+        this.contactentity = contactentity;
+    }
+
+    public List<UserTypeModel> getUsertypes() {
+        return usertypes;
+    }
+
+    public void setUsertypes(List<UserTypeModel> usertypes) {
+        this.usertypes = usertypes;
+    }
+
+    public List<ReimburseSetModel> getReimeburentry() {
+        return reimeburentry;
+    }
+
+    public void setReimeburentry(List<ReimburseSetModel> reimeburentry) {
+        this.reimeburentry = reimeburentry;
+    }
+
+    public List<PayeeBankModel> getBankentityentry() {
+        return bankentityentry;
+    }
+
+    public void setBankentityentry(List<PayeeBankModel> bankentityentry) {
+        this.bankentityentry = bankentityentry;
+    }
 }

+ 112 - 0
nckd-fi/src/main/java/nckd/fi/er/webapi/model/PayeeBankModel.java

@@ -0,0 +1,112 @@
+package nckd.fi.er.webapi.model;
+
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import nckd.base.common.model.BaseModel;
+
+/**
+ * @Author:Zt
+ * @Date:2025/12/8
+ **/
+public class PayeeBankModel extends BaseModel {
+
+    @ApiParam(value = "人员编码")
+    private String usernumber ;
+    @ApiParam(value = "收款银行id")
+    private String payerbank_id ;
+    @ApiParam(value = "收款银行编码")
+    private String payerbank_number ;
+    @ApiParam(value = "收款银行名称")
+    private String payerbank_name ;
+    @ApiParam(value = "创建组织id")
+    private String createorg_id;
+    @ApiParam(value = "创建组织编码")
+    private String createorg_number;
+    @ApiParam(value = "创建组织名称")
+    private String createorg_name;
+    @ApiParam(value = "银行账户")
+    private String payeraccount;
+    @ApiParam(value = "银行账户名称")
+    private String payeraccountname;
+    @ApiParam(value = "是否默认")
+    private boolean isdefault ;
+
+    public String getUsernumber() {
+        return usernumber;
+    }
+
+    public void setUsernumber(String usernumber) {
+        this.usernumber = usernumber;
+    }
+
+    public String getPayerbank_id() {
+        return payerbank_id;
+    }
+
+    public void setPayerbank_id(String payerbank_id) {
+        this.payerbank_id = payerbank_id;
+    }
+
+    public String getPayerbank_number() {
+        return payerbank_number;
+    }
+
+    public void setPayerbank_number(String payerbank_number) {
+        this.payerbank_number = payerbank_number;
+    }
+
+    public String getPayerbank_name() {
+        return payerbank_name;
+    }
+
+    public void setPayerbank_name(String payerbank_name) {
+        this.payerbank_name = payerbank_name;
+    }
+
+    public String getCreateorg_id() {
+        return createorg_id;
+    }
+
+    public void setCreateorg_id(String createorg_id) {
+        this.createorg_id = createorg_id;
+    }
+
+    public String getCreateorg_number() {
+        return createorg_number;
+    }
+
+    public void setCreateorg_number(String createorg_number) {
+        this.createorg_number = createorg_number;
+    }
+
+    public String getCreateorg_name() {
+        return createorg_name;
+    }
+
+    public void setCreateorg_name(String createorg_name) {
+        this.createorg_name = createorg_name;
+    }
+
+    public String getPayeraccount() {
+        return payeraccount;
+    }
+
+    public void setPayeraccount(String payeraccount) {
+        this.payeraccount = payeraccount;
+    }
+
+    public String getPayeraccountname() {
+        return payeraccountname;
+    }
+
+    public void setPayeraccountname(String payeraccountname) {
+        this.payeraccountname = payeraccountname;
+    }
+
+    public boolean isIsdefault() {
+        return isdefault;
+    }
+
+    public void setIsdefault(boolean isdefault) {
+        this.isdefault = isdefault;
+    }
+}

+ 94 - 0
nckd-fi/src/main/java/nckd/fi/er/webapi/model/ReimburseSetModel.java

@@ -0,0 +1,94 @@
+package nckd.fi.er.webapi.model;
+
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import nckd.base.common.model.BaseModel;
+
+/**
+ * @Author:Zt
+ * @Date:2025/12/8
+ **/
+public class ReimburseSetModel extends BaseModel {
+
+    @ApiParam(value = "人员编码")
+    private String number ;
+
+    @ApiParam(value = "公司id")
+    private String company_id ;
+    @ApiParam(value = "公司编码")
+    private String company_number ;
+    @ApiParam(value = "公司名称")
+    private String company_name ;
+
+    @ApiParam(value = "报销级别id")
+    private String entryreimburselevel_id;
+    @ApiParam(value = "报销级别编码")
+    private String entryreimburselevel_number;
+    @ApiParam(value = "报销级别名称")
+    private String entryreimburselevel_name;
+
+    @ApiParam(value = "是否兼职")
+    private boolean partjob ;
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public boolean isPartjob() {
+        return partjob;
+    }
+    public void setPartjob(boolean partjob) {
+        this.partjob = partjob;
+    }
+
+    public String getCompany_id() {
+        return company_id;
+    }
+
+    public void setCompany_id(String company_id) {
+        this.company_id = company_id;
+    }
+
+    public String getCompany_number() {
+        return company_number;
+    }
+
+    public void setCompany_number(String company_number) {
+        this.company_number = company_number;
+    }
+
+    public String getCompany_name() {
+        return company_name;
+    }
+
+    public void setCompany_name(String company_name) {
+        this.company_name = company_name;
+    }
+
+    public String getEntryreimburselevel_id() {
+        return entryreimburselevel_id;
+    }
+
+    public void setEntryreimburselevel_id(String entryreimburselevel_id) {
+        this.entryreimburselevel_id = entryreimburselevel_id;
+    }
+
+    public String getEntryreimburselevel_number() {
+        return entryreimburselevel_number;
+    }
+
+    public void setEntryreimburselevel_number(String entryreimburselevel_number) {
+        this.entryreimburselevel_number = entryreimburselevel_number;
+    }
+
+    public String getEntryreimburselevel_name() {
+        return entryreimburselevel_name;
+    }
+
+    public void setEntryreimburselevel_name(String entryreimburselevel_name) {
+        this.entryreimburselevel_name = entryreimburselevel_name;
+    }
+}

+ 40 - 0
nckd-fi/src/main/java/nckd/fi/er/webapi/model/UserTypeModel.java

@@ -1,6 +1,7 @@
 package nckd.fi.er.webapi.model;
 
 import kd.bos.openapi.common.custom.annotation.ApiParam;
+import nckd.base.common.model.BaseModel;
 
 import java.io.Serializable;
 
@@ -21,4 +22,43 @@ public class UserTypeModel extends BaseModel implements Serializable {
     @ApiParam(value = "类型.类别 1:内部人员, 2:外部人员")
     private String category ;
 
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getEnable() {
+        return enable;
+    }
+
+    public void setEnable(String enable) {
+        this.enable = enable;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(String category) {
+        this.category = category;
+    }
 }