Эх сурвалжийг харах

Merge remote-tracking branch 'origin/master'

zoufan_kd 7 сар өмнө
parent
commit
8e240a5c93

+ 2 - 0
src/main/java/fi/em/formPlugin/BusinessProcessingEditPlugin.java

@@ -228,6 +228,7 @@ public class BusinessProcessingEditPlugin extends AbstractListPlugin implements
                         String nckdCyffyxm = reJo.getString("nckd_cyffyxm");
                         String settleorg = reJo.getString("settleorg");
                         String duedate = reJo.getString("duedate");
+                        Long id = reJo.getLong("id");
                         QFilter nckd_cysfyxmFilter = new QFilter("number", QCP.equals, nckdCyffyxm);
                         DynamicObject nckd_cyffyxm = BusinessDataServiceHelper.loadSingle("er_expenseitemedit", "id", new QFilter[]{nckd_cysfyxmFilter});
                         BigDecimal settleamount = reJo.getBigDecimal("nckd_cyfgzbalance");
@@ -243,6 +244,7 @@ public class BusinessProcessingEditPlugin extends AbstractListPlugin implements
                         DynamicObject dynamicObjects = (DynamicObject) value;
                         this.getModel().setValue("nckd_cyfwldw", dynamicObjects, rowIndex);
                         this.getModel().setValue("nckd_cyfdata", bizdate, rowIndex);
+                        this.getModel().setValue("nckd_bigintfield", id, rowIndex);
                         this.getModel().setValue("nckd_datefield1", duedate, rowIndex);
                         this.getModel().setValue("nckd_cyfgzbalance", settleamount, rowIndex);
                         this.getModel().setValue("nckd_cyfcxbalance", settleamount, rowIndex);

+ 3 - 0
src/main/java/fi/em/formPlugin/BusinessProcessingPlugin.java

@@ -205,6 +205,7 @@ public class BusinessProcessingPlugin extends AbstractFormPlugin implements Plug
                 Date bizdate = dynamicObject.getDate("bizdate");
                 Date duedate = dynamicObject.getDate("duedate");
                 DynamicObject org = dynamicObject.getDynamicObject("org");
+                long id = dynamicObject.getLong("id");
                 //应收挂账金额/冲销金额
                 BigDecimal settleamount = dynamicObject.getBigDecimal("unsettleamount");
                 for (DynamicObject entryentity : dynamicObject.getDynamicObjectCollection("detailentry")) {
@@ -224,6 +225,7 @@ public class BusinessProcessingPlugin extends AbstractFormPlugin implements Plug
                     this.getModel().setValue("nckd_cyforg", org, rowIndex);
                     this.getModel().setValue("nckd_cyfgzbalance", settleamount, rowIndex);
                     this.getModel().setValue("nckd_cyfcxbalance", settleamount, rowIndex);
+                    this.getModel().setValue("nckd_billid", id, rowIndex);
                     QFilter nckd_cysfyxmFilter = new QFilter("number", QCP.equals,payeenamev);
                     DynamicObject nckd_cyffyxm = BusinessDataServiceHelper.loadSingle("bd_supplier","id",new QFilter[] {nckd_cysfyxmFilter});
                     this.getModel().setValue("nckd_basedatafield", nckd_cyffyxm, rowIndex);
@@ -250,6 +252,7 @@ public class BusinessProcessingPlugin extends AbstractFormPlugin implements Plug
                     obj.put("nckd_cyfwldw", "");
                     obj.put("nckd_cyfdata", bizdate);
                     obj.put("duedate", duedate);
+                    obj.put("id", id);
                     obj.put("nckd_cyfgzbalance", settleamount);
                     obj.put("settleorg", org.getString("number"));
                     if (expenseitem != null) {

+ 0 - 1
src/main/java/kd/bos/login/utils/DemoSMSSender.java

@@ -168,7 +168,6 @@ public class DemoSMSSender implements SMSSender {
                 int index = responseJson.indexOf("<?xml");
                 responseJson = responseJson.substring(index);
             }
-
             JSONObject jsonObject = XML.toJSONObject(responseJson);
             client.close();
             return jsonObject;

+ 314 - 0
src/main/java/sys/sc/formplugin/ABillServiceHelper.java

@@ -0,0 +1,314 @@
+package sys.sc.formplugin;
+
+import kd.bos.base.BaseShowParameter;
+import kd.bos.bill.BillShowParameter;
+import kd.bos.bill.OperationStatus;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.db.tx.TX;
+import kd.bos.db.tx.TXHandle;
+import kd.bos.dlock.DLock;
+import kd.bos.entity.BasedataEntityType;
+import kd.bos.entity.BillEntityType;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.CloseCallBack;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.IFormView;
+import kd.bos.form.ShowType;
+import kd.bos.mvc.SessionManager;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import sys.sc.opplugin.utils.ReflectUtils;
+
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+/**
+ * @Des 单据帮助类
+ * @Author jiang
+ */
+
+public class ABillServiceHelper {
+
+    /**
+     * 执行单据操作
+     *
+     * @param operationKey 单据上操作代码
+     * @param formId       单据实体编码
+     * @param dataEntities 单据数据包
+     * @param option       option
+     * @return 操作结果
+     */
+    public static OperationResult executeOperate(String operationKey, String formId, DynamicObject[] dataEntities, OperateOption option) {
+        return OperationServiceHelper.executeOperate(operationKey, formId, dataEntities, option);
+    }
+
+    /**
+     * 执行单据操作
+     *
+     * @param operationKey 单据上操作代码
+     * @param formId       单据实体编码
+     * @param ids          单据id集合
+     * @param option       option
+     * @return 操作结果
+     */
+    public static OperationResult executeOperate(String operationKey, String formId, Object[] ids, OperateOption option) {
+        return OperationServiceHelper.executeOperate(operationKey, formId, ids, option);
+    }
+
+    /**
+     * 创建新增界面模型
+     *
+     * @param formId 单据实体编码
+     * @return 界面模型
+     */
+    public static IFormView createAddView(String formId) {
+        FormShowParameter parameter = getShowParameter(formId);
+        return createViewByShowParameter(parameter);
+    }
+
+    /**
+     * 通过打开参数创建view
+     *
+     * @param parameter 打开参数
+     * @return 界面模型
+     */
+    public static IFormView createViewByShowParameter(FormShowParameter parameter) {
+        invokeFormServiceMethod(parameter);
+        return SessionManager.getCurrent().getView(parameter.getPageId());
+    }
+
+    /**
+     * 创建修改界面模型
+     *
+     * @param formId 单据实体编码
+     * @param id     id
+     * @return 界面模型
+     */
+    public static IFormView createModifyView(String formId, String id) {
+        FormShowParameter parameter = getModifyParameter(formId, id);
+        return createViewByShowParameter(parameter);
+    }
+
+    /**
+     * 修改单据并创建修改锁
+     *
+     * @param formId 单据实体编码
+     * @param id     id
+     * @param view   view回调
+     * @param action 操作回调
+     * @return 操作结果
+     */
+    public static OperationResult modifyFormWithLock(String formId, String id, Consumer<IFormView> view,
+                                                     Function<IFormView, OperationResult> action) {
+        DLock lock = DLock.create(formId + id, "createModifyView" + formId + id);
+        lock.lock();
+        OperationResult result;
+        try {
+            IFormView modifyView = createModifyView(formId, id);
+            view.accept(modifyView);
+            result = action.apply(modifyView);
+            exitView(modifyView);
+        } finally {
+            lock.unlock();
+        }
+        return result;
+    }
+
+    /**
+     * 执行保存操作并不受到外围事务的影响
+     *
+     * @param view 单据视图
+     * @return 操作结果
+     */
+    public static OperationResult saveOperateWithNoTx(IFormView view) {
+        try (TXHandle ignored = TX.notSupported()) {
+            return saveOperate(view);
+        }
+    }
+
+    /**
+     * 执行保存操作并不受到外围事务的影响
+     *
+     * @param view      单据视图
+     * @param autoAudit 是否自动提交审核
+     * @return 操作结果
+     */
+    public static OperationResult saveOperateWithNoTx(IFormView view, boolean autoAudit) {
+        try (TXHandle ignored = TX.notSupported()) {
+            return saveOperate(view, autoAudit);
+        }
+    }
+
+    /**
+     * 执行保存操作并且受外围事务的影响
+     *
+     * @param view 单据视图
+     * @return 操作结果
+     */
+    public static OperationResult saveOperate(IFormView view) {
+        OperationResult result;
+        try {
+            result = view.invokeOperation("save");
+        } finally {
+            exitView(view);
+        }
+        return result;
+    }
+
+    /**
+     * 执行保存操作并且受外围事务的影响
+     *
+     * @param view      单据视图
+     * @param autoAudit 是否自动提交审核
+     * @return 操作结果
+     */
+    public static OperationResult saveOperate(IFormView view, boolean autoAudit) {
+        OperationResult result = saveOperate(view);
+        if (autoAudit) {
+            if (result.isSuccess()) {
+                IFormView modifyView = createModifyView(view.getEntityId(), result.getSuccessPkIds().get(0).toString());
+                try {
+                    result = modifyView.invokeOperation("submit");
+                    if (result.isSuccess()) {
+                        result = modifyView.invokeOperation("audit");
+                    }
+                } finally {
+                    exitView(modifyView);
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 获取单据打开参数
+     *
+     * @param formId 单据实体编码
+     * @return 打开参数
+     */
+    public static FormShowParameter getShowParameter(String formId) {
+        FormShowParameter parameter;
+        MainEntityType mainEntityType = EntityMetadataCache.getDataEntityType(formId);
+        if (mainEntityType.getClass().equals(BasedataEntityType.class)) {
+
+            parameter = new BaseShowParameter();
+        } else if (mainEntityType.getClass().equals(BillEntityType.class)) {
+            BillShowParameter s = new BillShowParameter();
+            Map<String, Object> maps = new HashMap<String, Object>();
+            maps.put("SELECT_ORG_ID", "1002947892337442816");
+            s.setCustomParams(maps);
+            parameter = s ;
+
+        } else {
+            parameter = new FormShowParameter();
+        }
+
+        parameter.setStatus(OperationStatus.ADDNEW);
+        parameter.getOpenStyle().setShowType(ShowType.MainNewTabPage);
+        parameter.getOpenStyle().setTargetKey("tabap");
+        parameter.setFormId(formId);
+        return parameter;
+    }
+
+    /**
+     * 获取单据修改打开参数
+     *
+     * @param formId 单据实体编码
+     * @param id     id
+     * @return 打开参数
+     */
+    public static FormShowParameter getModifyParameter(String formId, String id) {
+        FormShowParameter parameter = getShowParameter(formId);
+        if (parameter.getClass().equals(BaseShowParameter.class)) {
+            BaseShowParameter baseShowParameter = (BaseShowParameter) parameter;
+            try {
+                MainEntityType mainEntityType = EntityMetadataCache.getDataEntityType(formId);
+                String org = mainEntityType.getMainOrg();
+                String pkName = mainEntityType.getPrimaryKey().getName();
+                DynamicObject object = QueryServiceHelper.queryOne(formId, org, new QFilter[]{new QFilter(pkName, QCP.equals, id)});
+                String orgId = object.getString(org);
+                baseShowParameter.setCustomParam("useorgId", orgId);
+                baseShowParameter.setUseOrgId(object.getLong(org));
+            } catch (Exception ignored) {
+            }
+            baseShowParameter.setPkId(id);
+            baseShowParameter.setStatus(OperationStatus.EDIT);
+
+        } else {
+            BillShowParameter billShowParameter = (BillShowParameter) parameter;
+            billShowParameter.setPkId(id);
+            billShowParameter.setStatus(OperationStatus.EDIT);
+        }
+        return parameter;
+    }
+    /**
+     * 获取客户单据修改打开参数
+     *
+     * @param formId 单据实体编码
+     * @param id     id
+     * @return 打开参数
+     */
+    public static FormShowParameter kHgetModifyParameter(String formId, String id,String appyId) {
+        FormShowParameter parameter = getShowParameter(formId);
+        if (parameter.getClass().equals(BaseShowParameter.class)) {
+            BaseShowParameter baseShowParameter = (BaseShowParameter) parameter;
+            try {
+                MainEntityType mainEntityType = EntityMetadataCache.getDataEntityType(formId);
+                String org = mainEntityType.getMainOrg();
+                String pkName = mainEntityType.getPrimaryKey().getName();
+                DynamicObject object = QueryServiceHelper.queryOne(formId, org, new QFilter[]{new QFilter(pkName, QCP.equals, id)});
+                String orgId = object.getString(org);
+                baseShowParameter.setCustomParam("useorgId", orgId);
+                baseShowParameter.setUseOrgId(object.getLong(org));
+                //添加维护个性化参数
+                baseShowParameter.setCustomParam("isPersonalizeData", Boolean.TRUE);
+                baseShowParameter.setCustomParam("isPersonalizedModify", Boolean.TRUE);
+                baseShowParameter.setCustomParam("useOrgID",appyId);
+                baseShowParameter.setCustomParam("useorgId",appyId);
+               // CloseCallBack callBack = new CloseCallBack(this, "personalizeData");
+            } catch (Exception ignored) {
+            }
+            baseShowParameter.setPkId(id);
+            //添加维护个性化参数
+            baseShowParameter.setCustomParam("isPersonalizeData", Boolean.TRUE);
+            baseShowParameter.setCustomParam("isPersonalizedModify", Boolean.TRUE);
+            baseShowParameter.setCustomParam("useOrgID",appyId);
+            baseShowParameter.setCustomParam("useorgId",appyId);
+            baseShowParameter.setStatus(OperationStatus.EDIT);
+
+        } else {
+            BillShowParameter billShowParameter = (BillShowParameter) parameter;
+            billShowParameter.setPkId(id);
+            billShowParameter.setStatus(OperationStatus.EDIT);
+            //添加维护个性化参数
+            billShowParameter.setCustomParam("isPersonalizeData", Boolean.TRUE);
+            billShowParameter.setCustomParam("isPersonalizedModify", Boolean.TRUE);
+            billShowParameter.setCustomParam("useOrgID",appyId);
+            billShowParameter.setCustomParam("useorgId",appyId);
+        }
+        return parameter;
+    }
+
+    /**
+     * 反射执行内部方法
+     *
+//     * @param parameter 打开参数
+     */
+    private static void invokeFormServiceMethod(FormShowParameter parameter) {
+        ReflectUtils.invokeCosmicMethod("kd.bos.service.ServiceFactory", "FormService", "createConfig", parameter);
+        ReflectUtils.invokeCosmicMethod("kd.bos.service.ServiceFactory", "FormService", "batchInvokeAction", parameter.getPageId(), "[{\"key\":\"\",\"methodName\":\"loadData\",\"args\":[],\"postData\":[]}]");
+    }
+
+    public static void exitView(IFormView view) {
+        view.getModel().setDataChanged(false);
+        view.close();
+    }
+}

+ 146 - 0
src/main/java/sys/sc/formplugin/ApiHttpUtils.java

@@ -0,0 +1,146 @@
+package sys.sc.formplugin;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.script.annotations.KSObject;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@KSObject
+public class ApiHttpUtils {
+
+    public static String Posthttp(String url, String Params) throws Exception {
+        // 获得Http客户端
+        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+        // 创建Post请求
+        //设置请求路径
+        HttpPost httpPost = new HttpPost(url);
+        httpPost.setHeader("Content-type", "application/json;charset=utf-8");
+        httpPost.setHeader("mesgtype", "bills_crop_base64");
+        httpPost.setHeader("channelcode", "JSX");
+        Date date = new Date();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        String formatDate = dateFormat.format(date);
+        httpPost.setHeader("channeldate", formatDate);
+        long time = new Date().getTime();
+        String channeltime = Long.toString(time);
+        httpPost.setHeader("channeltime",channeltime);
+        long l = System.currentTimeMillis();
+        String channelserno = Long.toString(l);
+        httpPost.setHeader("channelserno", channelserno);
+        httpPost.setHeader("brno", "");
+        httpPost.setHeader("tellerno", "*DMY");
+        httpPost.setHeader("terminalno", "");
+        httpPost.setHeader("APP_", "");
+        httpPost.setHeader("reserve", "");
+        httpPost.setHeader("dealcode", "");
+        httpPost.setHeader("dealmsg", "");
+        httpPost.setHeader("App_key", "XYK_DPJ_KEY");
+        httpPost.setHeader("App_secret", "XYK_DPJ_SECRET");
+        JSONObject object = new JSONObject();
+        object.put("file_base64",Params);
+        StringEntity entity = new StringEntity(object.toString(), ContentType.APPLICATION_JSON);
+        // post请求是将参数放在请求体里面传过去的;这里将entity放入post请求体中
+        // 设置编码格式
+//        entity.setContentEncoding("UTF-8");
+        // 发送Json格式的数据请求
+//        entity.setContentType("application/json");
+        httpPost.setEntity(entity);
+        // 响应模型(发送post请求)
+        CloseableHttpResponse response = httpClient.execute(httpPost);
+        // 从响应模型中获取响应实体
+        HttpEntity responseEntity = response.getEntity();
+        JSONObject jsonObject = new JSONObject();
+        if (responseEntity != null) {
+            jsonObject = JSON.parseObject(EntityUtils.toString(response.getEntity()));
+            return jsonObject.toJSONString();
+        }
+        // 释放资源
+        if (httpClient != null) {
+            httpClient.close();
+        }
+        if (response != null) {
+            response.close();
+        }
+        return "";
+    }
+    public static String toJsonString(String Params) throws Exception {
+        JSONObject json = new JSONObject();//返回最外层json
+        json.put("errcode","");
+        json.put("traceId","");
+        json.put("description","");
+        JSONObject data = new JSONObject();//数据层json
+        json.put("batchNo","");
+        JSONArray recoginitionData = new JSONArray();//数据层数组
+        JSONObject fileObj = new JSONObject();//实际数据json
+        fileObj.put("canBeDeduction","");
+        fileObj.put("salerName","");
+        fileObj.put("invoiceMoney","");
+        fileObj.put("signStatus","");
+        fileObj.put("downloadUrl","");
+        fileObj.put("fileHash","");
+        fileObj.put("invoiceAmount","");
+        fileObj.put("localUrl","");
+        fileObj.put("deductionStatus","");
+        fileObj.put("salerTaxNo","");
+        fileObj.put("invoiceType","");
+        fileObj.put("invoiceNo","");
+        fileObj.put("isRepeat","");
+        fileObj.put("pixel","");
+        fileObj.put("oriImageSize","");
+        fileObj.put("pdfToImgSnapshotUrl","");
+        fileObj.put("orientation","");
+        fileObj.put("batchNo","");
+        fileObj.put("clientId","");
+        fileObj.put("buyerTaxNo","");
+        fileObj.put("warningCode","");
+        fileObj.put("originalState","");
+        fileObj.put("companySeal","");
+        fileObj.put("originalUrl","");
+        fileObj.put("invoiceDate","");
+        fileObj.put("buyerName","");
+        fileObj.put("invoiceCode","");
+        fileObj.put("serialNo","");
+        fileObj.put("totalAmount","");
+        fileObj.put("taxRate","");
+        fileObj.put("oriOrientation","");
+        fileObj.put("oriRegion","");
+        fileObj.put("rotationAngle","");
+        fileObj.put("snapshotUrl","");
+        fileObj.put("imageSerialNo","");
+        fileObj.put("recognitionSerialNo","");
+        fileObj.put("totalTaxAmount","");
+        fileObj.put("taxAmount","");
+        fileObj.put("region","");
+        fileObj.put("isExpend","");
+        fileObj.put("expendStatus","");
+        fileObj.put("fileType","");
+        JSONArray items = new JSONArray();//数据明细层数组
+        JSONObject mxFileObj = new JSONObject();//明细数据json
+        mxFileObj.put("unitPrice","");
+        mxFileObj.put("taxRate","");
+        mxFileObj.put("unit","");
+        mxFileObj.put("num","");
+        mxFileObj.put("detailAmount","");
+        mxFileObj.put("taxAmount","");
+        mxFileObj.put("goodsName","");
+        //值拼接完成后开始set数据结构
+        items.add(mxFileObj);
+        fileObj.put("items",items);
+        recoginitionData.add(fileObj);
+        data.put("recoginitionData",recoginitionData);
+        json.put("data",data);
+        return json.toJSONString();
+    }
+}

+ 774 - 0
src/main/java/sys/sc/formplugin/TestPlugin.java

@@ -0,0 +1,774 @@
+package sys.sc.formplugin;
+
+import kd.bos.base.utils.msg.BaseMessage;
+import kd.bos.base.utils.msg.OrgMessage;
+import kd.bos.dataentity.entity.CloneUtils;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.IFormView;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.org.utils.OrgUtils;
+import kd.bos.orm.ORM;
+import kd.bos.orm.impl.ORMImpl;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.sec.user.utils.UserOperationUtils;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.imc.bdm.common.constant.BotpCallBackLogConstant;
+
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.EventObject;
+import java.util.List;
+import java.util.Date;
+import java.util.*;
+
+public class TestPlugin  extends AbstractListPlugin {
+
+    //根据接口配置信息获取组织人员,拼接服务器文件路径url,参数为urlcode接口配置信息编码
+    public String getFileUrl(String urlcode) throws IOException {
+        //组织人员接口配置信息获取
+        DynamicObject nckd_jkpzxx= BusinessDataServiceHelper
+                .loadSingle("nckd_jkpzxx", new QFilter[]{new QFilter("number", "=", urlcode)});
+        //取文件名
+        String nckd_filename=nckd_jkpzxx.getString("nckd_filename");
+        //获取文件路径
+        String nckd_url=nckd_jkpzxx.getString("nckd_url");
+        //当前日期
+        Date currentDate=new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(currentDate);
+        calendar.add(Calendar.DATE, -1); // 将日期减少一天
+        //日期减少一天
+        Date newDate = calendar.getTime();
+        //转换日期格式
+        SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");
+        String datestr=sf.format(newDate);
+        //真实路径
+        if (nckd_url.equals("/var/appstatic/")) {
+            nckd_url="/home/kingdee/cosmic/nginx-appstatic/store/appstatic/";
+        }
+        String realPath = nckd_url+datestr+"/"+nckd_filename;
+        return realPath;
+    }
+
+    //从文件读取数据更新到基础资料中
+    public void generateDataFile(String filePath) {
+        try {
+
+            DynamicObjectType dynamicObjectType = EntityMetadataCache.getDataEntityType("nckd_basicdata");
+            List<String> selector = Arrays.asList(
+                    "nckd_employeeid", "nckd_name", "nckd_gender", "nckd_nl", "nckd_zzmm",
+                    "nckd_zgxl", "nckd_szdwname", "nckd_szdwcode", "nckd_orgidname", "nckd_orgidcode",
+                    "nckd_yjbmname", "nckd_yjbmcode", "nckd_posidname", "nckd_posidcode", "nckd_yggxlb",
+                    "nckd_status", "nckd_sjh"
+            );
+            List<DynamicObject> createdataList = new ArrayList<>();
+            List<DynamicObject> updatedataList = new ArrayList<>();
+            //查出所有现有的数据
+            DynamicObject[] existingData = BusinessDataServiceHelper
+                    .load(dynamicObjectType.getName(), String.join(",", selector) + ",nckd_updatedate,nckd_isdelete", null);
+            Map<String, DynamicObject> existingDataMap = new HashMap<>();
+            for (DynamicObject obj : existingData) {
+                existingDataMap.put(obj.getString("nckd_employeeid"), obj);
+            }
+            Set<String> processedGonghaoSet = new HashSet<>();
+            try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
+                String line;
+                while ((line = reader.readLine()) != null) {
+                    //去掉换行符|$|
+                    line = line.replace("|$|", "");
+                    //空格符号,根据这个符号分割
+                    String[] fields = line.split("\u0001");
+                    //如果获取的数据行不等于预设字段的行,则跳过这行数据
+                    if (fields.length != selector.size()) {
+                        continue;
+                    }
+                    //获取工号
+                    String gonghao = fields[0];
+                    boolean isUpdated = false;
+                    DynamicObject data;
+                    processedGonghaoSet.add(gonghao);
+                    if (existingDataMap.containsKey(gonghao)) {
+                        //获取对应工号的数据
+                        data = existingDataMap.get(gonghao);
+                        for (int i = 0; i < selector.size(); i++) {
+                            String fieldName = selector.get(i);
+                            String newValue = fields[i];
+                            String existingValue = data.getString(fieldName);
+                            //判断数据是否与之前的数据相同,不相同则更新
+                            if (!Objects.equals(existingValue, newValue)) {
+                                data.set(fieldName, newValue);
+                                isUpdated = true;
+                            }
+                        }
+                        //更新了数据则设置数据更新的时间
+                        if (isUpdated) {
+                            data.set("nckd_updatedate", new Date());
+                            updatedataList.add(data);
+                        }
+                    } else {
+                        //不存在这条数据则新增一条到data中
+                        data = new DynamicObject(dynamicObjectType);
+                        for (int i = 0; i < selector.size(); i++) {
+                            data.set(selector.get(i), fields[i]);
+                        }
+                        Date now = new Date();
+                        data.set("nckd_createdate", now);
+                        data.set("nckd_updatedate", now);
+                        createdataList.add(data);
+                    }
+                }
+            }
+            for (Map.Entry<String, DynamicObject> entry : existingDataMap.entrySet()) {
+                String gonghao = entry.getKey();
+                DynamicObject data = entry.getValue();
+
+                if (!processedGonghaoSet.contains(gonghao)) {
+                    data.set("nckd_isdelete", true);
+                    updatedataList.add(data);
+                }
+            }
+
+            //新增数据不为空则更新到数据库中
+            if (!createdataList.isEmpty()) {
+                SaveServiceHelper.save(dynamicObjectType, createdataList.toArray(new DynamicObject[0]));
+            }
+            //更新的数据不为空,则更新到数据库中
+            if (!updatedataList.isEmpty()) {
+                SaveServiceHelper.save(updatedataList.get(0).getDynamicObjectType(), updatedataList.toArray(new DynamicObject[0]));
+            }
+            this.getView().showMessage("数据已成功保存!");
+        } catch (IOException ex) {
+            ex.printStackTrace();
+            this.getView().showMessage("读取文件时发生错误:" + ex.getMessage());
+        }
+    }
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        super.afterDoOperation(e);
+        String filePath = "D:/test.dat";
+        if ("scdatwj".equals(e.getOperateKey())) {//生成data文件
+            try {
+                DynamicObjectType dynamicObjectType = EntityMetadataCache.getDataEntityType("nckd_basicdata");
+                // 定义选择的字段
+                List<String> selector = new ArrayList<>();
+                selector.add("nckd_employeeid");
+                selector.add("nckd_name");
+                selector.add("nckd_gender");
+                selector.add("nckd_nl");
+                selector.add("nckd_zzmm");
+                selector.add("nckd_zgxl");
+                selector.add("nckd_szdwname");
+                selector.add("nckd_szdwcode");
+                selector.add("nckd_orgidname");
+                selector.add("nckd_orgidcode");
+                selector.add("nckd_yjbmname");
+                selector.add("nckd_yjbmcode");
+                selector.add("nckd_posidname");
+                selector.add("nckd_posidcode");
+                selector.add("nckd_yggxlb");
+                selector.add("nckd_status");
+                selector.add("nckd_sjh");
+                DynamicObject[] dataList = BusinessDataServiceHelper.load(dynamicObjectType.getName(), String.join(",", selector), null);
+                File file = new File(filePath);
+                //文件路径不存在则创建文件
+                if (!file.exists()) {
+                    File parentDir = file.getParentFile();
+                    if (parentDir != null && !parentDir.exists()) {
+                        parentDir.mkdirs();
+                    }
+                    file.createNewFile();
+                }
+                try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), "GBK"))) {
+                    for (DynamicObject data : dataList) {
+                        StringBuilder line = new StringBuilder();
+                        for (String field : selector) {
+                            line.append(data.get(field) != null ? data.get(field).toString() : "").append("\u0001");
+                        }
+                        line.setLength(line.length() - 1);
+                        line.append("|$|");
+                        writer.write(line.toString());
+                        writer.newLine();
+                    }
+                    this.getView().showMessage("数据文件已成功生成!");
+                }
+            } catch (IOException ex) {
+                ex.printStackTrace();
+                this.getView().showMessage("生成数据文件时发生错误!");
+            }
+        }
+        //更新人员
+        else if ("gxry".equals(e.getOperateKey())) {
+            //更新人员
+            // 从 nckd_basicdata 表中获取所有人员数据,假设通过某个条件查找
+            DynamicObject[] personDataArray = BusinessDataServiceHelper.load(
+                    "nckd_basicdata",
+                    "id,nckd_employeeid,nckd_name,nckd_gender,nckd_nl,nckd_zzmm,nckd_zgxl,nckd_orgidname,nckd_orgidcode,nckd_posidname,nckd_posidcode,nckd_yggxlb,nckd_status,nckd_sjh",
+                    null
+            );
+            if (personDataArray == null || personDataArray.length == 0) {
+                this.getView().showMessage("未从 nckd_basicdata 表中获取到任何人员数据!");
+                return;
+            }
+            String msg="";
+            // 人员类型写死的
+            for (DynamicObject personData : personDataArray) {
+                //获取id
+                String id=personData.getString("id");
+                // 获取工号
+                String gonghao = personData.getString("nckd_employeeid");
+                if (gonghao == null || gonghao.isEmpty()) {
+                    continue;
+                }
+                // 查询用户是否已存在
+                DynamicObject existingUser = BusinessDataServiceHelper.loadSingle(
+                        "bos_user", new QFilter[]{new QFilter("number", "=", gonghao)}
+                );
+                // 用户已存在,进行数据更新
+                if (existingUser != null) {
+                    //初始化
+                    boolean isUpdated = false;
+                    // 比较并更新性别
+                    Object newGender = personData.get("nckd_gender");
+                    if (!newGender.equals(existingUser.get("gender"))) {
+                        existingUser.set("gender", newGender);
+                        isUpdated = true;
+                    }
+                    // 比较并更新手机号
+                    Object newPhone = personData.get("nckd_sjh");
+                    if (!newPhone.equals(existingUser.get("phone"))) {
+                        existingUser.set("phone", newPhone);
+                        isUpdated = true;
+                    }
+                    //更新部门和岗位
+                    DynamicObjectCollection existingDeptEntries = existingUser.getDynamicObjectCollection("entryentity");
+                    //人员部门分录
+                    DynamicObject existingDeptEntry = existingDeptEntries.isEmpty() ? null : existingDeptEntries.get(0);
+                    // 获取新的部门信息
+                    String deptCode = personData.getString("nckd_orgidcode");
+                    DynamicObject newOrgInfo = BusinessDataServiceHelper.loadSingle(
+                            "bos_adminorg", new QFilter[]{new QFilter("number", "=", deptCode)}
+                    );
+                    boolean deptUpdated = false;
+                    if (newOrgInfo != null) {
+                        if (existingDeptEntry == null) {
+                            // 如果没有现有部门分录,则添加新的部门分录
+                            existingDeptEntry = existingDeptEntries.addNew();
+                            deptUpdated = true;
+                        }
+                        // 比较并更新部门信息
+                        if (!deptCode.equals(existingDeptEntry.get("dpt.number"))) {
+                            existingDeptEntry.set("dpt", newOrgInfo);
+                            deptUpdated = true;
+                        }
+                        // 更新组织结构
+                        DynamicObjectCollection structureInfoCollection = newOrgInfo.getDynamicObjectCollection("structure");
+                        if (structureInfoCollection != null && !structureInfoCollection.isEmpty()) {
+                            DynamicObject structureInfo = structureInfoCollection.get(0);
+                            if(existingDeptEntry.getDynamicObject("orgstructure")!=null){
+                                if (!structureInfo.getPkValue().equals(existingDeptEntry.getDynamicObject("orgstructure").getPkValue())) {
+                                    existingDeptEntry.set("orgstructure", structureInfo.getPkValue());
+                                    deptUpdated = true;
+                                }
+                            }else{
+                                existingDeptEntry.set("orgstructure", structureInfo.getPkValue());
+                                deptUpdated = true;
+                            }
+                        }
+                        // 标记是否需要保存
+                        if (deptUpdated) {
+                            isUpdated = true;
+                        }
+                    } else {
+                        this.getView().showMessage("未找到部门编码为 " + deptCode + " 的部门信息!");
+                    }
+                    // 获取新的岗位信息
+                    String postName = personData.getString("nckd_posidname");
+                    if (!postName.equals(existingDeptEntry.getString("position"))) {
+                        existingDeptEntry.set("position", postName);
+                        isUpdated = true;
+                    }
+                    // 如果有更新则保存
+                    if (isUpdated) {
+                        SaveServiceHelper.save(new DynamicObject[]{existingUser});
+                        msg+="工号为 " + gonghao + " 的用户信息已更新!";
+                    }
+
+                } else {
+                    // 用户不存在,创建新用户
+                    DynamicObjectType userType = EntityMetadataCache.getDataEntityType("bos_user");
+                    DynamicObject userinfo = new DynamicObject(userType);
+                    ORM impl = ORM.create();
+                    userinfo.set("id", impl.genLongId("bos_user"));
+                    userinfo.set("number", gonghao);
+                    // 设置其他字段
+                    userinfo.set("gender", personData.get("nckd_gender"));
+//                    userinfo.set("nckd_nl", personData.get("nckd_nl"));
+//                    userinfo.set("nckd_zzmm", personData.get("nckd_zzmm"));
+//                    userinfo.set("nckd_zgxl", personData.get("nckd_zgxl"));
+//                    userinfo.set("nckd_yggxlb", personData.get("nckd_yggxlb"));
+//                    userinfo.set("nckd_status", personData.get("nckd_status"));
+                    //人员手机号
+                    userinfo.set("phone", personData.get("nckd_sjh"));
+                    // 设置其他固定字段
+                    userinfo.set("startdate", new Date());
+                    Calendar c = Calendar.getInstance();
+                    c.set(Calendar.YEAR, 2999);
+                    userinfo.set("enddate", c.getTime());
+                    userinfo.set("masterid", userinfo.get("id"));
+                    userinfo.set("enable", 1);
+                    userinfo.set("status", "C");
+                    userinfo.set("password", "8HrquJnZfyOkmmHkpGLXfg==");
+                    userinfo.set("isregisted", "1");
+                    userinfo.set("isactived", "1");
+                    userinfo.set("pswstrategy", "338333884850648064");
+                    userinfo.set("psweffectivedate", new Date());
+                    userinfo.set("useenddate", c.getTime());
+                    // 设置姓名和拼音
+                    String name = personData.getString("nckd_name");
+                    userinfo.set("name", name);
+                    String fullPinyin = UserOperationUtils.getFullSpellByName(name);
+                    String simplePinyin = UserOperationUtils.getFirstSpellByName(name);
+                    userinfo.set("fullpinyin", fullPinyin);
+                    userinfo.set("simplepinyin", simplePinyin);
+                    // 设置用户名
+                    String username = UserOperationUtils.getUserNameByFormatedFullPinyin(
+                            (long) userinfo.getPkValue(), fullPinyin, null
+                    );
+                    userinfo.set("username", username);
+                    // 创建部门分录
+                    DynamicObjectCollection bmflList = userinfo.getDynamicObjectCollection("entryentity");
+                    DynamicObject bumeninfo = bmflList.addNew();
+                    // 获取部门编码并在 bos_adminorg 表中查找部门信息
+                    String deptCode = personData.getString("nckd_orgidcode");
+                    DynamicObject orginfo = BusinessDataServiceHelper.loadSingle(
+                            "bos_adminorg", new QFilter[]{new QFilter("number", "=", deptCode)}
+                    );
+                    if (orginfo != null) {
+                        bumeninfo.set("dpt", orginfo);
+                        // 获取组织的分录集合 structure 的第一条数据
+                        DynamicObjectCollection structureInfoCollection = orginfo.getDynamicObjectCollection("structure");
+                        if (structureInfoCollection != null && !structureInfoCollection.isEmpty()) {
+                            DynamicObject structureInfo = structureInfoCollection.get(0); // 获取第一条结构信息
+                            bumeninfo.set("orgstructure", structureInfo.getPkValue());
+                        } else {
+                            this.getView().showMessage("部门编码为 " + deptCode + " 的部门缺少组织结构信息,跳过该记录。");
+                        }
+                    }
+                    String postName = personData.getString("nckd_posidname");;
+                    bumeninfo.set("position", postName);
+                    //所在岗位名称
+                    String positionnumber = personData.getString("nckd_posidname");;
+                    bumeninfo.set("post", positionnumber);
+                    // 保存新用户信息
+                    SaveServiceHelper.save(new DynamicObject[]{userinfo});
+                    msg+="工号为 " + gonghao + " 的用户已创建!";
+                }
+            }
+            if("".equals(msg)){
+                this.getView().showMessage("没有需要更新或新增的人员");
+            }else{
+                this.getView().showMessage(msg);
+            }
+        }
+        //更新组织
+        else if ("gxzz".equals(e.getOperateKey())){
+            // 获取形态信息 编码为 Orgform06 的 bos_org_pattern(部门组织)
+            DynamicObject xingtaiinfo = BusinessDataServiceHelper.loadSingle(
+                    "bos_org_pattern", new QFilter[]{new QFilter("number", "=", "Orgform06")}
+            );
+            //获取形态信息,编码为 Orgform02 的bos_org_pattern(公司组织)
+            DynamicObject cpyinfo = BusinessDataServiceHelper.loadSingle(
+                    "bos_org_pattern", new QFilter[]{new QFilter("number", "=", "Orgform02")}
+            );
+            // 查询 nckd_basicdata 表中需要更新的数据
+            DynamicObject[] nckdData = BusinessDataServiceHelper.load(
+                    "nckd_basicdata",
+                    "id,nckd_szdwcode,nckd_szdwname,nckd_yjbmcode,nckd_yjbmname,nckd_orgidcode,nckd_orgidname",
+                    null
+            );
+            //行政组织
+            DynamicObject rootOrg = BusinessDataServiceHelper.loadSingle(
+                    "bos_adminorg", new QFilter[]{new QFilter("number", "=", "jxyh")}
+            );
+            if (rootOrg == null) {
+                this.getView().showMessage("指定的上级组织 'jxyh' 未找到!");
+                return;
+            }
+
+//            DynamicObjectType adminOrgType = EntityMetadataCache.getDataEntityType("bos_adminorg");
+            IFormView orgview = ABillServiceHelper.createAddView("bos_adminorg");
+            for (DynamicObject record : nckdData) {
+                // 判断并创建或更新所在单位
+                //所在单位编码
+                String szdwbm = record.getString("nckd_szdwcode");
+                //所在单位名称
+                String szdwmc = record.getString("nckd_szdwname");
+                DynamicObject org = BusinessDataServiceHelper.loadSingle(
+                        "bos_adminorg", new QFilter[]{new QFilter("number", "=", szdwbm)}
+                );
+                //没有单位则创建
+                if (org == null) {
+//                    org = new DynamicObject(adminOrgType);
+//                    IFormView orgview = ABillServiceHelper.createAddView("bos_adminorg");
+                    //组织编码
+                    orgview.getModel().setValue("number", szdwbm);
+                    //组织名称
+                    orgview.getModel().setValue("name", szdwmc);
+                    //上级组织
+                    orgview.getModel().setValue("parent", rootOrg);
+                    //形态,设置形态为公司
+                    orgview.getModel().setValue("orgpattern", cpyinfo);
+                    //数据状态设置为已审核
+                    orgview.getModel().setValue("status", "C");
+                    //使用状态设置为可用
+                    orgview.getModel().setValue("enable", "1");
+                    OperationResult operationResult = ABillServiceHelper.saveOperate(orgview);
+                    //保存不成功
+                    if (!operationResult.isSuccess()) {
+
+                    }
+                    org = orgview.getModel().getDataEntity();
+                    //如果存在单位则检查单位名是否一致,不一致则更新
+                }else if (!org.getString("name").equals(szdwmc))
+                {
+                    //设置单位名称
+                    org.set("name",szdwmc);
+                    // 更新组织结构
+                    DynamicObjectCollection structureInfoCollection = org.getDynamicObjectCollection("structure");
+                    DynamicObject structureInfo = structureInfoCollection.get(0);
+                    //设置长名称
+                    structureInfo.set("fullname",rootOrg.getString("name")+"_"+szdwmc);
+                    SaveServiceHelper.update(org);
+                }
+                // 判断一级机构编码 在行政组织中是否存在,不存在则新增
+                String yjjgbm = record.getString("nckd_yjbmcode");
+                String yjjgmc = record.getString("nckd_yjbmname");
+                //一级机构
+                DynamicObject yjjg = BusinessDataServiceHelper.loadSingle("bos_adminorg", new QFilter[]{new QFilter("number", "=", yjjgbm)});
+                if (yjjg == null) {
+//                    yjjg = new DynamicObject(adminOrgType);
+//                    IFormView yjjgView = ABillServiceHelper.createAddView("bos_adminorg");
+                    IFormView yjjgView = orgview;
+                    yjjgView.getModel().setValue("number", yjjgbm);
+                    yjjgView.getModel().setValue("name", yjjgmc);
+                    yjjgView.getModel().setValue("parent", org); // 父级组织为 org
+                    yjjgView.getModel().setValue("orgpattern", xingtaiinfo);
+                    yjjgView.getModel().setValue("status", "C");
+                    yjjgView.getModel().setValue("enable", "1");
+                    OperationResult yjjgOperationResult = ABillServiceHelper.saveOperate(yjjgView);
+                    if (!yjjgOperationResult.isSuccess()) {
+                        // Handle the failure case here
+                    }
+                    yjjg = yjjgView.getModel().getDataEntity();
+                } else if (!yjjg.getString("name").equals(yjjgmc)) {
+                    yjjg.set("name",yjjgmc);
+                    DynamicObjectCollection structureInfoCollection = yjjg.getDynamicObjectCollection("structure");
+                    DynamicObject structureInfo = structureInfoCollection.get(0);
+                    //设置长名称
+                    structureInfo.set("fullname",rootOrg.getString("name")+"_"+szdwmc+"_"+yjjgmc);
+                    SaveServiceHelper.update(yjjg);
+                }
+                // 判断所在部门编码 在行政组织中是否存在,不存在则新增
+                String szbmbm = record.getString("nckd_orgidcode");
+                String szbmmc = record.getString("nckd_orgidname");
+                //所在部门
+                DynamicObject szbm = BusinessDataServiceHelper.loadSingle("bos_adminorg", new QFilter[]{new QFilter("number", "=", szbmbm)});
+                if (szbm == null) {
+//                    szbm = new DynamicObject(adminOrgType);
+//                    IFormView szbmView = ABillServiceHelper.createAddView("bos_adminorg");
+                    IFormView szbmView=orgview;
+                    szbmView.getModel().setValue("number", szbmbm);
+                    szbmView.getModel().setValue("name", szbmmc);
+                    szbmView.getModel().setValue("parent", yjjg); // 设置父级为 yjjg
+                    szbmView.getModel().setValue("orgpattern", xingtaiinfo);
+                    szbmView.getModel().setValue("status", "C"); // 设置状态
+                    szbmView.getModel().setValue("enable", "1"); // 设置为启用状态
+                    // 保存操作
+                    OperationResult szbmOperationResult = ABillServiceHelper.saveOperate(szbmView);
+                    if (!szbmOperationResult.isSuccess()) {
+                        // 如果保存失败,可以在这里处理错误
+                        this.getView().showMessage("保存部门失败!");
+                        return;
+                    }
+                    if (szbmView.getModel() != null) {
+                        szbm = szbmView.getModel().getDataEntity();
+                    } else {
+                        this.getView().showMessage("保存后未能获取到部门数据!");
+                        return;
+                    }
+                    this.getView().showMessage("行政组织数据已成功更新!");
+                } else if (!szbm.getString("name").equals(szbmmc)) {
+                    szbm.set("name",szbmmc);
+                    DynamicObjectCollection structureInfoCollection = szbm.getDynamicObjectCollection("structure");
+                    DynamicObject structureInfo = structureInfoCollection.get(0);
+                    //设置长名称
+                    structureInfo.set("fullname",rootOrg.getString("name")+"_"+szdwmc+"_"+yjjgmc+"_"+szbmmc);
+                    SaveServiceHelper.update(szbm);
+                }
+            }
+        }
+        //生成数据
+        else if ("scsj".equals(e.getOperateKey())) {//从文件读取数据插入基础资料
+            try {
+                generateDataFile(getFileUrl("organduserurl"));
+            } catch (IOException ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+        //减值数据
+        if ("jzsj".equals(e.getOperateKey()))
+        {
+            try {
+                //文件路径
+                String filelocation="D:/jzdata.dat";
+                //减值数据基础资料
+                DynamicObjectType dynamicObjectType = EntityMetadataCache.getDataEntityType("nckd_impairment");
+                //减值表字段
+                List<String> selector = Arrays.asList(
+                        "nckd_dubil_id", "nckd_cust_id", "nckd_cur_cd", "nckd_dubil_amt", "nckd_asset_bal",
+                        "nckd_stage_rslt", "nckd_ecl_ratio"
+                );
+                List<DynamicObject> createdataList = new ArrayList<>();
+                List<DynamicObject> updatedataList = new ArrayList<>();
+                //查出所有现有的数据
+                DynamicObject[] existingData = BusinessDataServiceHelper
+                        .load(dynamicObjectType.getName(), String.join(",", selector) + ",nckd_isdelete", null);
+                Map<String, DynamicObject> existingDataMap = new HashMap<>();
+                for (DynamicObject obj : existingData) {
+                    //单据号
+                    existingDataMap.put(obj.getString("nckd_dubil_id"), obj);
+                }
+                Set<String> processeddubilidSet = new HashSet<>();
+                try (BufferedReader reader = new BufferedReader(new FileReader(filelocation))) {
+                    String line;
+                    while ((line = reader.readLine()) != null) {
+                        //去掉换行符|$|
+                        line = line.replace("|$|", "");
+                        //空格符号,根据这个符号分割
+                        String[] fields = line.split("\u0001");
+                        //如果获取的数据行不等于预设字段的行,则跳过这行数据
+                        if (fields.length != selector.size()) {
+                            continue;
+                        }
+                        //获取单据号
+                        String dubil_id = fields[0];
+                        boolean isUpdated = false;
+                        DynamicObject data;
+                        processeddubilidSet.add(dubil_id);
+                        if (existingDataMap.containsKey(dubil_id)) {
+                            //获取对应单据号的数据
+                            data = existingDataMap.get(dubil_id);
+                            for (int i = 0; i < selector.size(); i++) {
+                                String fieldName = selector.get(i);
+                                String newValue = fields[i];
+                                String existingValue = data.getString(fieldName);
+                                //判断数据是否与之前的数据相同,不相同则更新
+                                if (!Objects.equals(existingValue, newValue)) {
+                                    data.set(fieldName, newValue);
+                                    isUpdated = true;
+                                }
+                            }
+//                            //更新了数据则设置数据更新的时间
+                            if (isUpdated) {
+//                                data.set("nckd_updatedate", new Date());
+                                updatedataList.add(data);
+                            }
+                        } else {
+                            //不存在这条数据则新增一条到data中
+                            data = new DynamicObject(dynamicObjectType);
+                            for (int i = 0; i < selector.size(); i++) {
+                                data.set(selector.get(i), fields[i]);
+                            }
+//                            Date now = new Date();
+//                            data.set("nckd_createdate", now);
+//                            data.set("nckd_updatedate", now);
+                            createdataList.add(data);
+                        }
+                    }
+                }
+                //查找数据是否被删除
+                for (Map.Entry<String, DynamicObject> entry : existingDataMap.entrySet()) {
+                    String dubil_id = entry.getKey();
+                    DynamicObject data = entry.getValue();
+                    if (!processeddubilidSet.contains(dubil_id)) {
+                        data.set("nckd_isdelete", true);
+                        updatedataList.add(data);
+                    }
+                }
+                //新增数据不为空则更新到数据库中
+                if (!createdataList.isEmpty()) {
+                    SaveServiceHelper.save(dynamicObjectType, createdataList.toArray(new DynamicObject[0]));
+                }
+                //更新的数据不为空,则更新到数据库中
+                if (!updatedataList.isEmpty()) {
+                    SaveServiceHelper.save(updatedataList.get(0).getDynamicObjectType(), updatedataList.toArray(new DynamicObject[0]));
+                }
+                this.getView().showMessage("数据已成功保存!");
+            } catch (IOException ex) {
+                ex.printStackTrace();
+                this.getView().showMessage("读取文件时发生错误:" + ex.getMessage());
+            }
+        }
+
+        //获取接口配置表中组织人员的数据,返回服务器中文件路径
+        if ("jkpz".equals(e.getOperateKey())) {
+            try {
+                getFileUrl("organduserurl");
+            } catch (IOException ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+
+        //读取行名行号,存入对应基础资料中
+        if("hmhh".equals(e.getOperateKey())) {
+//            String fileurl=getFileUrl("hmhhurl");
+            //行名行号表字段
+            List<String> selector = Arrays.asList(
+                    "number", "name"
+            );
+            //文件路径
+            String fileurl="D:/hmhh.dat";
+            //行名行号表标识
+            String bd_bebank="bd_bebank";
+            try {
+                //基础资料
+                DynamicObjectType dynamicObjectType = EntityMetadataCache.getDataEntityType(bd_bebank);
+                //国家基础资料(中国)
+                DynamicObject country=BusinessDataServiceHelper
+                        .loadSingle("bd_country","number", new QFilter[]{new QFilter("number", QCP.equals, "001")});
+                List<DynamicObject> createdataList = new ArrayList<>();
+                List<DynamicObject> updatedataList = new ArrayList<>();
+                //查出所有现有的数据
+                DynamicObject[] existingData = BusinessDataServiceHelper
+                        .load(dynamicObjectType.getName(), String.join(",", selector)+",enable,nckd_datasource", null);
+                //查找文件更新的数据
+
+
+                Map<String, DynamicObject> existingDataMap = new HashMap<>();
+                for (DynamicObject obj : existingData) {
+                    //单据号
+                    existingDataMap.put(obj.getString(selector.get(0)), obj);
+                }
+                Set<String> processeddubilidSet = new HashSet<>();
+                try (BufferedReader reader = new BufferedReader(new FileReader(fileurl))) {
+                    String line;
+                    while ((line = reader.readLine()) != null) {
+                        //去掉换行符|$|
+                        line = line.replace("|$|", "");
+                        //空格符号,根据这个符号分割
+                        String[] fields = line.split("\u0001");
+                        //如果获取的数据行不等于预设字段的行,则跳过这行数据
+//                        if (fields.length != selector.size()) {
+//                            continue;
+//                        }
+                        //获取单据号
+                        String dubil_id = fields[0];
+                        boolean isUpdated = false;
+                        DynamicObject data;
+                        processeddubilidSet.add(dubil_id);
+                        if (existingDataMap.containsKey(dubil_id)) {
+                            //获取对应单据号的数据
+                            data = existingDataMap.get(dubil_id);
+                            for (int i = 0; i < selector.size(); i++) {
+                                String fieldName = selector.get(i);
+                                String newValue = fields[i];
+                                String existingValue = data.getString(fieldName);
+                                //判断数据是否与之前的数据相同,不相同则更新
+                                if (!Objects.equals(existingValue, newValue)) {
+                                    data.set(fieldName, newValue);
+                                    isUpdated = true;
+                                }
+                            }
+                            //更新了数据则设置数据更新的时间
+                            if (isUpdated) {
+                                updatedataList.add(data);
+                            }
+                        } else {
+                            //不存在这条数据则新增一条到data中
+                            data = new DynamicObject(dynamicObjectType);
+                            for (int i = 0; i < selector.size(); i++) {
+                                data.set(selector.get(i), fields[i]);
+                            }
+                            //国家
+                            data.set("country",country);
+                            //省
+                            data.set("provincetxt","江西");
+                            //市
+                            data.set("citytxt","南昌");
+                            //联行号等于行号
+                            data.set("union_number",fields[0]);
+                            //设置可用状态
+                            data.set("enable","1");
+                            //设置数据来源,0为手动更新,1为文件自动更新
+                            data.set("nckd_datasource","1");
+                            createdataList.add(data);
+                        }
+                    }
+                }
+                //获取自动添加的数据
+                DynamicObject[] autoData = BusinessDataServiceHelper
+                        .load(dynamicObjectType.getName()
+                                , String.join(",", selector)+",enable,nckd_datasource",
+                                new QFilter[]{new QFilter("nckd_datasource", QCP.equals, "1")});
+                for (int i=0;i< autoData.length;i++)
+                {
+                    //如果导入的数据在系统中没有则禁用
+                    if (!processeddubilidSet.contains(autoData[i].getString("number"))) {
+                        //设置禁用
+                        autoData[i].set("enable","0");
+                    }
+
+                }
+                SaveServiceHelper.save(autoData);
+
+
+                //查找更新数据
+                for (Map.Entry<String, DynamicObject> entry : existingDataMap.entrySet()) {
+                    String dubil_id = entry.getKey();
+                    DynamicObject data = entry.getValue();
+                    if (!processeddubilidSet.contains(dubil_id)) {
+//                        data.set("nckd_isdelete", true);
+                        updatedataList.add(data);
+                    }
+                }
+
+
+                //新增数据不为空则更新到数据库中
+                if (!createdataList.isEmpty()) {
+                    SaveServiceHelper.save(dynamicObjectType, createdataList.toArray(new DynamicObject[0]));
+                }
+                //更新的数据不为空,则更新到数据库中
+                if (!updatedataList.isEmpty()) {
+                    SaveServiceHelper.save(updatedataList.get(0).getDynamicObjectType(), updatedataList.toArray(new DynamicObject[0]));
+                }
+                this.getView().showMessage("数据已成功保存!");
+            } catch (IOException ex) {
+                ex.printStackTrace();
+                this.getView().showMessage("读取文件时发生错误:" + ex.getMessage());
+            }
+        }
+
+    }
+}
+
+

+ 473 - 0
src/main/java/sys/sc/formplugin/UpdateDataDailyTask.java

@@ -0,0 +1,473 @@
+package sys.sc.formplugin;
+
+import com.alibaba.druid.support.logging.Log;
+import com.alibaba.druid.support.logging.LogFactory;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.exception.KDException;
+import kd.bos.form.IFormView;
+import kd.bos.orm.ORM;
+import kd.bos.orm.query.QFilter;
+import kd.bos.schedule.api.MessageHandler;
+import kd.bos.schedule.executor.AbstractTask;
+import kd.bos.sec.user.utils.UserOperationUtils;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author cjz
+ * @date 2024/9/3 15:13
+ * @description:获取日常数据更新组织和人员调度计划
+ */
+public class UpdateDataDailyTask extends AbstractTask {
+
+    private static final Log log = LogFactory.getLog(UpdateDataDailyTask.class);
+
+    @Override
+    public MessageHandler getMessageHandle() {
+        return super.getMessageHandle();
+    }
+
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        String mes="---------------正在执行任务,读取文件数据更新组织和人员------------------";
+        log.info(mes+requestContext);
+        //文件路径
+        String path=getFileUrl("organduserurl");
+        //读取文件更新基础资料
+        updatebasicdata(path);
+        //更新组织
+        log.info("----------------更新组织中---------------------");
+        updateorg();
+        //更新人员
+        log.info("----------------更新人员中-------------------");
+        updateperson();
+    }
+    //读取文件更新基础资料
+    public void updatebasicdata(String filePath)
+    {
+        //读取文件写入基础资料中
+        try {
+            DynamicObjectType dynamicObjectType = EntityMetadataCache.getDataEntityType("nckd_basicdata");
+            List<String> selector = Arrays.asList(
+                    "nckd_employeeid", "nckd_name", "nckd_gender", "nckd_nl", "nckd_zzmm",
+                    "nckd_zgxl", "nckd_szdwname", "nckd_szdwcode", "nckd_orgidname", "nckd_orgidcode",
+                    "nckd_yjbmname", "nckd_yjbmcode", "nckd_posidname", "nckd_posidcode", "nckd_yggxlb",
+                    "nckd_status", "nckd_sjh"
+            );
+            List<DynamicObject> createdataList = new ArrayList<>();
+            List<DynamicObject> updatedataList = new ArrayList<>();
+            //查出所有现有的数据
+            DynamicObject[] existingData = BusinessDataServiceHelper
+                    .load(dynamicObjectType.getName(), String.join(",", selector) + ",nckd_updatedate,nckd_isdelete", null);
+            Map<String, DynamicObject> existingDataMap = new HashMap<>();
+            for (DynamicObject obj : existingData) {
+                existingDataMap.put(obj.getString("nckd_employeeid"), obj);
+            }
+            Set<String> processedGonghaoSet = new HashSet<>();
+            try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
+                String line;
+                while ((line = reader.readLine()) != null) {
+                    //去掉换行符|$|
+                    line = line.replace("|$|", "");
+                    //空格符号,根据这个符号分割
+                    String[] fields = line.split("\u0001");
+                    //如果获取的数据行不等于预设字段的行,则跳过这行数据
+                    if (fields.length != selector.size()) {
+                        continue;
+                    }
+                    //获取工号
+                    String gonghao = fields[0];
+                    boolean isUpdated = false;
+                    DynamicObject data;
+                    processedGonghaoSet.add(gonghao);
+                    if (existingDataMap.containsKey(gonghao)) {
+                        //获取对应工号的数据
+                        data = existingDataMap.get(gonghao);
+                        for (int i = 0; i < selector.size(); i++) {
+                            String fieldName = selector.get(i);
+                            String newValue = fields[i];
+                            String existingValue = data.getString(fieldName);
+                            //判断数据是否与之前的数据相同,不相同则更新
+                            if (!Objects.equals(existingValue, newValue)) {
+                                data.set(fieldName, newValue);
+                                isUpdated = true;
+                            }
+                        }
+                        //更新了数据则设置数据更新的时间
+                        if (isUpdated) {
+                            data.set("nckd_updatedate", new Date());
+                            updatedataList.add(data);
+                        }
+                    } else {
+                        //不存在这条数据则新增一条到data中
+                        data = new DynamicObject(dynamicObjectType);
+                        for (int i = 0; i < selector.size(); i++) {
+                            data.set(selector.get(i), fields[i]);
+                        }
+                        Date now = new Date();
+                        data.set("nckd_createdate", now);
+                        data.set("nckd_updatedate", now);
+                        createdataList.add(data);
+                    }
+                }
+            }
+            for (Map.Entry<String, DynamicObject> entry : existingDataMap.entrySet()) {
+                String gonghao = entry.getKey();
+                DynamicObject data = entry.getValue();
+
+                if (!processedGonghaoSet.contains(gonghao)) {
+                    data.set("nckd_isdelete", true);
+                    updatedataList.add(data);
+                }
+            }
+            //新增数据不为空则更新到数据库中
+            if (!createdataList.isEmpty()) {
+                SaveServiceHelper.save(dynamicObjectType, createdataList.toArray(new DynamicObject[0]));
+            }
+            //更新的数据不为空,则更新到数据库中
+            if (!updatedataList.isEmpty()) {
+                SaveServiceHelper.save(updatedataList.get(0).getDynamicObjectType(), updatedataList.toArray(new DynamicObject[0]));
+            }
+            log.info("数据已成功保存!");
+        } catch (IOException ex) {
+            ex.printStackTrace();
+            log.info("读取文件时发生错误:" + ex.getMessage());
+        }
+    }
+    //根据基础资料更新组织
+    public void updateorg()
+    {
+        // 获取形态信息 编码为 Orgform06 的 bos_org_pattern(部门组织)
+        DynamicObject xingtaiinfo = BusinessDataServiceHelper.loadSingle(
+                "bos_org_pattern", new QFilter[]{new QFilter("number", "=", "Orgform06")}
+        );
+        //获取形态信息,编码为 Orgform02 的bos_org_pattern(公司组织)
+        DynamicObject cpyinfo = BusinessDataServiceHelper.loadSingle(
+                "bos_org_pattern", new QFilter[]{new QFilter("number", "=", "Orgform02")}
+        );
+        // 查询 nckd_basicdata 表中需要更新的数据
+        DynamicObject[] nckdData = BusinessDataServiceHelper.load(
+                "nckd_basicdata",
+                "id,nckd_szdwcode,nckd_szdwname,nckd_yjbmcode,nckd_yjbmname,nckd_orgidcode,nckd_orgidname",
+                null
+        );
+        //行政组织
+        DynamicObject rootOrg = BusinessDataServiceHelper.loadSingle(
+                "bos_adminorg", new QFilter[]{new QFilter("number", "=", "jxyh")}
+        );
+        if (rootOrg == null) {
+            log.info("指定的上级组织 'jxyh' 未找到!");
+            return;
+        }
+        IFormView orgview = ABillServiceHelper.createAddView("bos_adminorg");
+        for (DynamicObject record : nckdData) {
+            // 判断并创建或更新所在单位
+            //所在单位编码
+            String szdwbm = record.getString("nckd_szdwcode");
+            //所在单位名称
+            String szdwmc = record.getString("nckd_szdwname");
+            DynamicObject org = BusinessDataServiceHelper.loadSingle(
+                    "bos_adminorg", new QFilter[]{new QFilter("number", "=", szdwbm)}
+            );
+            //没有单位则创建
+            if (org == null) {
+                //组织编码
+                orgview.getModel().setValue("number", szdwbm);
+                //组织名称
+                orgview.getModel().setValue("name", szdwmc);
+                //上级组织
+                orgview.getModel().setValue("parent", rootOrg);
+                //形态,设置形态为公司
+                orgview.getModel().setValue("orgpattern", cpyinfo);
+                //数据状态设置为已审核
+                orgview.getModel().setValue("status", "C");
+                //使用状态设置为可用
+                orgview.getModel().setValue("enable", "1");
+                OperationResult operationResult = ABillServiceHelper.saveOperate(orgview);
+                //保存不成功
+                if (!operationResult.isSuccess()) {
+
+                }
+                org = orgview.getModel().getDataEntity();
+                //如果存在单位则检查单位名是否一致,不一致则更新
+            }else if (!org.getString("name").equals(szdwmc))
+            {
+                //设置单位名称
+                org.set("name",szdwmc);
+                // 更新组织结构
+                DynamicObjectCollection structureInfoCollection = org.getDynamicObjectCollection("structure");
+                DynamicObject structureInfo = structureInfoCollection.get(0);
+                //设置长名称
+                structureInfo.set("fullname",rootOrg.getString("name")+"_"+szdwmc);
+                SaveServiceHelper.update(org);
+            }
+            // 判断一级机构编码 在行政组织中是否存在,不存在则新增
+            String yjjgbm = record.getString("nckd_yjbmcode");
+            String yjjgmc = record.getString("nckd_yjbmname");
+            //一级机构
+            DynamicObject yjjg = BusinessDataServiceHelper.loadSingle("bos_adminorg", new QFilter[]{new QFilter("number", "=", yjjgbm)});
+            if (yjjg == null) {
+                IFormView yjjgView=orgview;
+                yjjgView.getModel().setValue("number", yjjgbm);
+                yjjgView.getModel().setValue("name", yjjgmc);
+                yjjgView.getModel().setValue("parent", org); // 父级组织为 org
+                yjjgView.getModel().setValue("orgpattern", xingtaiinfo);
+                yjjgView.getModel().setValue("status", "C");
+                yjjgView.getModel().setValue("enable", "1");
+                OperationResult yjjgOperationResult = ABillServiceHelper.saveOperate(yjjgView);
+                if (!yjjgOperationResult.isSuccess()) {
+                    // Handle the failure case here
+                }
+                yjjg = yjjgView.getModel().getDataEntity();
+            } else if (!yjjg.getString("name").equals(yjjgmc)) {
+                yjjg.set("name",yjjgmc);
+                DynamicObjectCollection structureInfoCollection = yjjg.getDynamicObjectCollection("structure");
+                DynamicObject structureInfo = structureInfoCollection.get(0);
+                //设置长名称
+                structureInfo.set("fullname",rootOrg.getString("name")+"_"+szdwmc+"_"+yjjgmc);
+                SaveServiceHelper.update(yjjg);
+            }
+            // 判断所在部门编码 在行政组织中是否存在,不存在则新增
+            String szbmbm = record.getString("nckd_orgidcode");
+            String szbmmc = record.getString("nckd_orgidname");
+            //所在部门
+            DynamicObject szbm = BusinessDataServiceHelper.loadSingle("bos_adminorg", new QFilter[]{new QFilter("number", "=", szbmbm)});
+            if (szbm == null) {
+                IFormView szbmView=orgview;
+                szbmView.getModel().setValue("number", szbmbm);
+                szbmView.getModel().setValue("name", szbmmc);
+                szbmView.getModel().setValue("parent", yjjg); // 设置父级为 yjjg
+                szbmView.getModel().setValue("orgpattern", xingtaiinfo);
+                szbmView.getModel().setValue("status", "C"); // 设置状态
+                szbmView.getModel().setValue("enable", "1"); // 设置为启用状态
+                // 保存操作
+                OperationResult szbmOperationResult = ABillServiceHelper.saveOperate(szbmView);
+                if (!szbmOperationResult.isSuccess()) {
+                    // 如果保存失败,可以在这里处理错误
+                    log.info("保存部门失败!");
+                    return;
+                }
+                if (szbmView.getModel() != null) {
+                    szbm = szbmView.getModel().getDataEntity();
+                } else {
+                    log.info("保存后未能获取到部门数据!");
+                    return;
+                }
+                log.info("行政组织数据已成功更新!");
+            } else if (!szbm.getString("name").equals(szbmmc)) {
+                szbm.set("name",szbmmc);
+                DynamicObjectCollection structureInfoCollection = szbm.getDynamicObjectCollection("structure");
+                DynamicObject structureInfo = structureInfoCollection.get(0);
+                //设置长名称
+                structureInfo.set("fullname",rootOrg.getString("name")+"_"+szdwmc+"_"+yjjgmc+"_"+szbmmc);
+                SaveServiceHelper.update(szbm);
+            }
+        }
+    }
+    //根据基础资料更新人员
+    public void updateperson()
+    {
+        // 从 nckd_basicdata 表中获取所有人员数据,假设通过某个条件查找
+        DynamicObject[] personDataArray = BusinessDataServiceHelper.load(
+                "nckd_basicdata",
+                "id,nckd_employeeid,nckd_name,nckd_gender,nckd_nl,nckd_zzmm,nckd_zgxl,nckd_orgidname,nckd_orgidcode,nckd_posidname,nckd_posidcode,nckd_yggxlb,nckd_status,nckd_sjh",
+                null
+        );
+        if (personDataArray == null || personDataArray.length == 0) {
+            log.info("未从 nckd_basicdata 表中获取到任何人员数据!");
+            return;
+        }
+        String msg="";
+        for (DynamicObject personData : personDataArray) {
+            log.info("-------------更新人员------------");
+            // 获取工号
+            String gonghao = personData.getString("nckd_employeeid");
+            if (gonghao == null || gonghao.isEmpty()) {
+                continue;
+            }
+            // 查询用户是否已存在
+            DynamicObject existingUser = BusinessDataServiceHelper.loadSingle(
+                    "bos_user", new QFilter[]{new QFilter("number", "=", gonghao)}
+            );
+            // 用户已存在,进行数据更新
+            if (existingUser != null) {
+                //初始化
+                boolean isUpdated = false;
+                // 比较并更新性别
+                Object newGender = personData.get("nckd_gender");
+                if (!newGender.equals(existingUser.get("gender"))) {
+                    existingUser.set("gender", newGender);
+                    isUpdated = true;
+                }
+                // 比较并更新手机号
+                Object newPhone = personData.get("nckd_sjh");
+                if (!newPhone.equals(existingUser.get("phone"))) {
+                    existingUser.set("phone", newPhone);
+                    isUpdated = true;
+                }
+                //更新部门和岗位
+                DynamicObjectCollection existingDeptEntries = existingUser.getDynamicObjectCollection("entryentity");
+                //人员部门分录
+                DynamicObject existingDeptEntry = existingDeptEntries.isEmpty() ? null : existingDeptEntries.get(0);
+                // 获取新的部门信息
+                String deptCode = personData.getString("nckd_orgidcode");
+                DynamicObject newOrgInfo = BusinessDataServiceHelper.loadSingle(
+                        "bos_adminorg", new QFilter[]{new QFilter("number", "=", deptCode)}
+                );
+                boolean deptUpdated = false;
+                if (newOrgInfo != null) {
+                    if (existingDeptEntry == null) {
+                        // 如果没有现有部门分录,则添加新的部门分录
+                        existingDeptEntry = existingDeptEntries.addNew();
+                        deptUpdated = true;
+                    }
+                    // 比较并更新部门信息
+                    if (!deptCode.equals(existingDeptEntry.get("dpt.number"))) {
+                        existingDeptEntry.set("dpt", newOrgInfo);
+                        deptUpdated = true;
+                    }
+                    // 更新组织结构
+                    DynamicObjectCollection structureInfoCollection = newOrgInfo.getDynamicObjectCollection("structure");
+                    if (structureInfoCollection != null && !structureInfoCollection.isEmpty()) {
+                        DynamicObject structureInfo = structureInfoCollection.get(0);
+                        if(existingDeptEntry.getDynamicObject("orgstructure")!=null){
+                            if (!structureInfo.getPkValue().equals(existingDeptEntry.getDynamicObject("orgstructure").getPkValue())) {
+                                existingDeptEntry.set("orgstructure", structureInfo.getPkValue());
+                                deptUpdated = true;
+                            }
+                        }else{
+                            existingDeptEntry.set("orgstructure", structureInfo.getPkValue());
+                            deptUpdated = true;
+                        }
+                    }
+                    // 标记是否需要保存
+                    if (deptUpdated) {
+                        isUpdated = true;
+                    }
+                } else {
+                    log.info("未找到部门编码为 " + deptCode + " 的部门信息!");
+                }
+                // 获取新的岗位信息
+                String postName = personData.getString("nckd_posidname");
+                if (!postName.equals(existingDeptEntry.getString("position"))) {
+                    existingDeptEntry.set("position", postName);
+                    isUpdated = true;
+                }
+                // 如果有更新则保存
+                if (isUpdated) {
+                    SaveServiceHelper.save(new DynamicObject[]{existingUser});
+                    msg+="工号为 " + gonghao + " 的用户信息已更新!";
+                }
+            } else {
+                // 用户不存在,创建新用户
+                DynamicObjectType userType = EntityMetadataCache.getDataEntityType("bos_user");
+                DynamicObject userinfo = new DynamicObject(userType);
+                ORM impl = ORM.create();
+                userinfo.set("id", impl.genLongId("bos_user"));
+                userinfo.set("number", gonghao);
+                // 设置其他字段
+                userinfo.set("gender", personData.get("nckd_gender"));
+                //人员手机号
+                userinfo.set("phone", personData.get("nckd_sjh"));
+                // 设置其他固定字段
+                userinfo.set("startdate", new Date());
+                Calendar c = Calendar.getInstance();
+                c.set(Calendar.YEAR, 2999);
+                userinfo.set("enddate", c.getTime());
+                userinfo.set("masterid", userinfo.get("id"));
+                userinfo.set("enable", 1);
+                userinfo.set("status", "C");
+                userinfo.set("password", "8HrquJnZfyOkmmHkpGLXfg==");
+                userinfo.set("isregisted", "1");
+                userinfo.set("isactived", "1");
+                userinfo.set("pswstrategy", "338333884850648064");
+                userinfo.set("psweffectivedate", new Date());
+                userinfo.set("useenddate", c.getTime());
+                // 设置姓名和拼音
+                String name = personData.getString("nckd_name");
+                userinfo.set("name", name);
+                String fullPinyin = UserOperationUtils.getFullSpellByName(name);
+                String simplePinyin = UserOperationUtils.getFirstSpellByName(name);
+                userinfo.set("fullpinyin", fullPinyin);
+                userinfo.set("simplepinyin", simplePinyin);
+                // 设置用户名
+                String username = UserOperationUtils.getUserNameByFormatedFullPinyin(
+                        (long) userinfo.getPkValue(), fullPinyin, null
+                );
+                userinfo.set("username", username);
+                // 创建部门分录
+                DynamicObjectCollection bmflList = userinfo.getDynamicObjectCollection("entryentity");
+                DynamicObject bumeninfo = bmflList.addNew();
+                // 获取部门编码并在 bos_adminorg 表中查找部门信息
+                String deptCode = personData.getString("nckd_orgidcode");
+                DynamicObject orginfo = BusinessDataServiceHelper.loadSingle(
+                        "bos_adminorg", new QFilter[]{new QFilter("number", "=", deptCode)}
+                );
+                if (orginfo != null) {
+                    bumeninfo.set("dpt", orginfo);
+                    // 获取组织的分录集合 structure 的第一条数据
+                    DynamicObjectCollection structureInfoCollection = orginfo.getDynamicObjectCollection("structure");
+                    if (structureInfoCollection != null && !structureInfoCollection.isEmpty()) {
+                        DynamicObject structureInfo = structureInfoCollection.get(0); // 获取第一条结构信息
+                        bumeninfo.set("orgstructure", structureInfo.getPkValue());
+                    } else {
+                        log.info("部门编码为 " + deptCode + " 的部门缺少组织结构信息,跳过该记录。");
+                    }
+                }
+                String postName = personData.getString("nckd_posidname");;
+                bumeninfo.set("position", postName);
+                //所在岗位名称
+                String positionnumber = personData.getString("nckd_posidname");;
+                bumeninfo.set("post", positionnumber);
+                // 保存新用户信息
+                SaveServiceHelper.save(new DynamicObject[]{userinfo});
+                msg+="工号为 " + gonghao + " 的用户已创建!";
+            }
+        }
+        if("".equals(msg)){
+            log.info("没有需要更新或新增的人员");
+        }else{
+            log.info(msg);
+        }
+    }
+
+    //根据接口配置信息获取组织人员,拼接服务器文件路径url,参数为urlcode接口配置信息编码
+    public String getFileUrl(String urlcode)
+    {
+        //组织人员接口配置信息获取
+        DynamicObject nckd_jkpzxx= BusinessDataServiceHelper
+                .loadSingle("nckd_jkpzxx", new QFilter[]{new QFilter("number", "=", urlcode)});
+        //取文件名
+        String nckd_filename=nckd_jkpzxx.getString("nckd_filename");
+        //获取文件路径
+        String nckd_url=nckd_jkpzxx.getString("nckd_url");
+        //当前日期
+        Date currentDate=new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(currentDate);
+        calendar.add(Calendar.DATE, -1); // 将日期减少一天
+        //日期减少一天
+        Date newDate = calendar.getTime();
+        //转换日期格式
+        SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");
+        String datestr=sf.format(newDate);
+        //文件路径拼接
+        String url=nckd_url+datestr+"/"+nckd_filename;
+        return url;
+    }
+    @Override
+    public boolean isSupportReSchedule() {
+        return super.isSupportReSchedule();
+    }
+}

+ 77 - 0
src/main/java/sys/sc/opplugin/utils/ReflectUtils.java

@@ -0,0 +1,77 @@
+package sys.sc.opplugin.utils;
+
+import kd.bos.audit.Audit;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.TypesContainer;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.exception.ErrorCode;
+import kd.bos.exception.KDException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ReflectUtils {
+            private static final ConcurrentHashMap<String, Object> serviceObjectMap = new ConcurrentHashMap<>();
+            private static final ConcurrentHashMap<String, Method> serviceMethodMap = new ConcurrentHashMap<>();
+            public static Object invokeCosmicMethod(String appServiceFacory, String serviceName, String methodName, Object... paras) {
+                Class<?> factory = TypesContainer.getOrRegister(appServiceFacory);
+                Object result = null;
+                Object serviceObject = serviceObjectMap.get(serviceName);
+                if (serviceObject == null) {
+                    synchronized (serviceObjectMap) {
+                        serviceObject = serviceObjectMap.get(serviceName);
+                        if (serviceObject == null) {
+                            try {
+                                serviceObject = factory.getMethod("getService", String.class).invoke(null, serviceName);
+                            } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+                                e.printStackTrace();
+                            }
+                            if (serviceObject != null) {
+                                serviceObjectMap.put(serviceName, serviceObject);
+                            }
+                        }
+                    }
+                }
+
+                if (serviceObject != null) {
+                    Method serviceMethod = findServiceMethod(serviceObject.getClass(), methodName, paras == null ? 0 : paras.length);
+                    Audit audit = RequestContext.get().getAudit();
+                    if (audit.getServiceName() == null) {
+                        audit.setServiceName(serviceName + '.' + methodName);
+                    }
+
+                    try {
+                        result = serviceMethod.invoke(serviceObject, paras);
+                    } catch (IllegalAccessException | InvocationTargetException e) {
+                        e.printStackTrace();
+                    }
+                }
+
+                return result;
+            }
+
+            private static Method findServiceMethod(Class<?> clazz, String method, int paramterLength) {
+                String key = clazz.getName() + '#' + method + '#' + paramterLength;
+                Method serviceMethod = serviceMethodMap.get(key);
+                if (serviceMethod == null) {
+                    synchronized (serviceMethodMap) {
+                        serviceMethod = serviceMethodMap.get(key);
+                        if (serviceMethod == null) {
+                            Method[] methods = clazz.getMethods();
+                            for (Method m : methods) {
+                                if (m.getName().equalsIgnoreCase(method) && m.getParameterCount() == paramterLength) {
+                                    serviceMethod = m;
+                                    serviceMethodMap.put(key, m);
+                                    break;
+                                }
+                            }
+                        }
+                    }
+
+                    if (serviceMethod == null) {
+                        throw new KDException(new ErrorCode("###", ResManager.loadKDString("未发现类%s的方法%s", "DispatchServiceImpl_1", "bos-mservice-form")), clazz.getName(), method);
+                    }
+                }
+                return serviceMethod;
+            }
+        }