package sys.sc.task; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; import com.jcraft.jsch.SftpException; import kd.bos.context.RequestContext; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType; import kd.bos.entity.EntityMetadataCache; import kd.bos.exception.KDException; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.schedule.api.MessageHandler; import kd.bos.schedule.executor.AbstractTask; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.operation.DeleteServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; import sys.sc.opplugin.utils.SftpClient; import java.io.*; import java.text.SimpleDateFormat; import java.util.*; /** * @author cjz * @date 2024/9/10 11:06 * @description:减值数据自动更新,并更新客户基础资料 */ public class UpdateImpairmentDailyTask extends AbstractTask { private static final Log log = LogFactory.getLog(UpdateImpairmentDailyTask.class); public static String host="192.168.10.69";//服务器ip地址 public static String username="root";//用户名 public static int port = 22;//端口号 public static String password="Kd@86262007";//用户密码 @Override public MessageHandler getMessageHandle() { return super.getMessageHandle(); } @Override public void execute(RequestContext requestContext, Map map) throws KDException { log.info("---------------------获取服务器连接--------------------"); //获取服务器连接 SftpClient sftpClient=new SftpClient(host,username,password,port); try { sftpClient.connect(); } catch (Exception e) { throw new RuntimeException(e); } String mes="-------------------------正在执行任务,读取减值数据----------------------"; log.info(mes+requestContext); try { //文件路径 String filelocation=getFileUrl("jzsjurl"); //减值数据基础资料 DynamicObjectType dynamicObjectType = EntityMetadataCache.getDataEntityType("nckd_impairment"); //减值表字段 List selector = Arrays.asList( "nckd_dubil_id", "nckd_cust_id", "nckd_cur_cd", "nckd_dubil_amt", "nckd_asset_bal", "nckd_stage_rslt", "nckd_ecl_ratio","nckd_cust_name" ); List createdataList = new ArrayList<>(); QFilter filter=new QFilter("nckd_isdelete", QCP.equals,false); //查询已经存在的数据 DynamicObject[] existingData = BusinessDataServiceHelper .load(dynamicObjectType.getName(), String.join(",", selector) + ",nckd_isdelete", new QFilter[]{filter}); Set processeddubilidSet = new HashSet<>(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(sftpClient.fileInputStream(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]; DynamicObject data; processeddubilidSet.add(dubil_id); //新增数据 data = new DynamicObject(dynamicObjectType); for (int i = 0; i < selector.size(); i++) { data.set(selector.get(i), fields[i]); } //设置创建时间 data.set("nckd_creatd",new Date()); data.set("nckd_isdelete",false); createdataList.add(data); } } sftpClient.disconnect(); //读取的文件数据转化成DynamicObject DynamicObject[] dynamicObjectlist=createdataList.toArray(new DynamicObject[0]); //新增数据不为空则更新到数据库中 if (!createdataList.isEmpty()) { //转换list为DynamicObject类型 SaveServiceHelper.save(dynamicObjectType,dynamicObjectlist); } //删除所有的数据,再新增 for (DynamicObject existingDatum : existingData) { existingDatum.set("nckd_isdelete", true); } SaveServiceHelper.save(existingData); QFilter qFilter=new QFilter("nckd_isdelete",QCP.equals,true); DeleteServiceHelper.delete(dynamicObjectType.getName(),new QFilter[]{qFilter}); log.info("-----------------------减值数据已成功保存---------------------"); custSave(dynamicObjectlist); log.info("------------------------客户数据已成功保存----------------------"); } catch (IOException ex) { ex.printStackTrace(); log.error("----------------------------读取文件发生错误"+ex.getMessage()+"--------------------------"); } catch (SftpException e) { throw new RuntimeException(e); } } @Override public boolean isSupportReSchedule() { return super.isSupportReSchedule(); } //根据接口配置信息获取组织人员,拼接服务器文件路径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+ File.separator+nckd_filename; return realPath; } //根据减值数据存储客户名客户号数据 public void custSave(DynamicObject[] dynamicObjectlist) { //客户基础资料 DynamicObjectType dynamicObjectType = EntityMetadataCache.getDataEntityType("nckd_customers"); //客户表字段 List selector = Arrays.asList( "number", "name" ); //查询已经存在的客户数据 DynamicObject[] existingData = BusinessDataServiceHelper .load(dynamicObjectType.getName(), String.join(",", selector),null); List dataListAdd = new ArrayList<>(); //存在数据的客户号 Map existingDataMap = new HashMap<>(); for (DynamicObject obj : existingData) { existingDataMap.put(obj.getString("number"), obj); } for(DynamicObject dataList:dynamicObjectlist) { //获取这条数据的id String nckd_cust_id=dataList.getString("nckd_cust_id"); //客户号不存在则保存 if (!existingDataMap.containsKey(nckd_cust_id)) { DynamicObject data = new DynamicObject(dynamicObjectType); //客户号 data.set("number",dataList.getString("nckd_cust_id")); //客户名 data.set("name",dataList.getString("nckd_cust_name")); //设置状态为可用 data.set("enable","1"); //设置状态为已审核 data.set("status","C"); dataListAdd.add(data); } } //保存 SaveServiceHelper.save(dynamicObjectType,dataListAdd.toArray(new DynamicObject[0])); } }