UpdateImpairmentDailyTask.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package sys.sc.task;
  2. import com.alibaba.druid.support.logging.Log;
  3. import com.alibaba.druid.support.logging.LogFactory;
  4. import com.jcraft.jsch.SftpException;
  5. import kd.bos.context.RequestContext;
  6. import kd.bos.dataentity.entity.DynamicObject;
  7. import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
  8. import kd.bos.entity.EntityMetadataCache;
  9. import kd.bos.exception.KDException;
  10. import kd.bos.orm.query.QCP;
  11. import kd.bos.orm.query.QFilter;
  12. import kd.bos.schedule.api.MessageHandler;
  13. import kd.bos.schedule.executor.AbstractTask;
  14. import kd.bos.servicehelper.BusinessDataServiceHelper;
  15. import kd.bos.servicehelper.operation.DeleteServiceHelper;
  16. import kd.bos.servicehelper.operation.SaveServiceHelper;
  17. import sys.sc.opplugin.utils.SftpClient;
  18. import java.io.*;
  19. import java.text.SimpleDateFormat;
  20. import java.util.*;
  21. /**
  22. * @author cjz
  23. * @date 2024/9/10 11:06
  24. * @description:减值数据自动更新,并更新客户基础资料
  25. */
  26. public class UpdateImpairmentDailyTask extends AbstractTask {
  27. private static final Log log = LogFactory.getLog(UpdateImpairmentDailyTask.class);
  28. public static String host="192.168.10.69";//服务器ip地址
  29. public static String username="root";//用户名
  30. public static int port = 22;//端口号
  31. public static String password="Kd@86262007";//用户密码
  32. @Override
  33. public MessageHandler getMessageHandle() {
  34. return super.getMessageHandle();
  35. }
  36. @Override
  37. public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
  38. log.info("---------------------获取服务器连接--------------------");
  39. //获取服务器连接
  40. SftpClient sftpClient=new SftpClient(host,username,password,port);
  41. try {
  42. sftpClient.connect();
  43. } catch (Exception e) {
  44. throw new RuntimeException(e);
  45. }
  46. String mes="-------------------------正在执行任务,读取减值数据----------------------";
  47. log.info(mes+requestContext);
  48. try {
  49. //文件路径
  50. String filelocation=getFileUrl("jzsjurl");
  51. //减值数据基础资料
  52. DynamicObjectType dynamicObjectType = EntityMetadataCache.getDataEntityType("nckd_impairment");
  53. //减值表字段
  54. List<String> selector = Arrays.asList(
  55. "nckd_dubil_id", "nckd_cust_id", "nckd_cur_cd", "nckd_dubil_amt", "nckd_asset_bal",
  56. "nckd_stage_rslt", "nckd_ecl_ratio","nckd_cust_name"
  57. );
  58. List<DynamicObject> createdataList = new ArrayList<>();
  59. QFilter filter=new QFilter("nckd_isdelete", QCP.equals,false);
  60. //查询已经存在的数据
  61. DynamicObject[] existingData = BusinessDataServiceHelper
  62. .load(dynamicObjectType.getName(), String.join(",", selector) + ",nckd_isdelete", new QFilter[]{filter});
  63. Set<String> processeddubilidSet = new HashSet<>();
  64. try (BufferedReader reader = new BufferedReader(new InputStreamReader(sftpClient.fileInputStream(filelocation)))) {
  65. String line;
  66. while ((line = reader.readLine()) != null) {
  67. //去掉换行符|$|
  68. line = line.replace("|$|", "");
  69. //空格符号,根据这个符号分割
  70. String[] fields = line.split("\u0001");
  71. //如果获取的数据行不等于预设字段的行,则跳过这行数据
  72. if (fields.length != selector.size()) {
  73. continue;
  74. }
  75. //获取单据号
  76. String dubil_id = fields[0];
  77. DynamicObject data;
  78. processeddubilidSet.add(dubil_id);
  79. //新增数据
  80. data = new DynamicObject(dynamicObjectType);
  81. for (int i = 0; i < selector.size(); i++) {
  82. data.set(selector.get(i), fields[i]);
  83. }
  84. //设置创建时间
  85. data.set("nckd_creatd",new Date());
  86. data.set("nckd_isdelete",false);
  87. createdataList.add(data);
  88. }
  89. }
  90. sftpClient.disconnect();
  91. //读取的文件数据转化成DynamicObject
  92. DynamicObject[] dynamicObjectlist=createdataList.toArray(new DynamicObject[0]);
  93. //新增数据不为空则更新到数据库中
  94. if (!createdataList.isEmpty()) {
  95. //转换list为DynamicObject类型
  96. SaveServiceHelper.save(dynamicObjectType,dynamicObjectlist);
  97. }
  98. //删除所有的数据,再新增
  99. for (DynamicObject existingDatum : existingData) {
  100. existingDatum.set("nckd_isdelete", true);
  101. }
  102. SaveServiceHelper.save(existingData);
  103. QFilter qFilter=new QFilter("nckd_isdelete",QCP.equals,true);
  104. DeleteServiceHelper.delete(dynamicObjectType.getName(),new QFilter[]{qFilter});
  105. log.info("-----------------------减值数据已成功保存---------------------");
  106. custSave(dynamicObjectlist);
  107. log.info("------------------------客户数据已成功保存----------------------");
  108. } catch (IOException ex) {
  109. ex.printStackTrace();
  110. log.error("----------------------------读取文件发生错误"+ex.getMessage()+"--------------------------");
  111. } catch (SftpException e) {
  112. throw new RuntimeException(e);
  113. }
  114. }
  115. @Override
  116. public boolean isSupportReSchedule() {
  117. return super.isSupportReSchedule();
  118. }
  119. //根据接口配置信息获取组织人员,拼接服务器文件路径url,参数为urlcode接口配置信息编码
  120. public String getFileUrl(String urlcode) throws IOException {
  121. //组织人员接口配置信息获取
  122. DynamicObject nckd_jkpzxx= BusinessDataServiceHelper
  123. .loadSingle("nckd_jkpzxx", new QFilter[]{new QFilter("number", "=", urlcode)});
  124. //取文件名
  125. String nckd_filename=nckd_jkpzxx.getString("nckd_filename");
  126. //获取文件路径
  127. String nckd_url=nckd_jkpzxx.getString("nckd_url");
  128. //当前日期
  129. Date currentDate=new Date();
  130. Calendar calendar = Calendar.getInstance();
  131. calendar.setTime(currentDate);
  132. calendar.add(Calendar.DATE, -1); // 将日期减少一天
  133. //日期减少一天
  134. Date newDate = calendar.getTime();
  135. //转换日期格式
  136. SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");
  137. String datestr=sf.format(newDate);
  138. //真实路径
  139. if (nckd_url.equals("/var/appstatic/")) {
  140. nckd_url="/home/kingdee/cosmic/nginx-appstatic/store/appstatic/";
  141. }
  142. //文件完整路径
  143. String realPath = nckd_url+datestr+ File.separator+nckd_filename;
  144. return realPath;
  145. }
  146. //根据减值数据存储客户名客户号数据
  147. public void custSave(DynamicObject[] dynamicObjectlist)
  148. {
  149. //客户基础资料
  150. DynamicObjectType dynamicObjectType = EntityMetadataCache.getDataEntityType("nckd_customers");
  151. //客户表字段
  152. List<String> selector = Arrays.asList(
  153. "number", "name"
  154. );
  155. //查询已经存在的客户数据
  156. DynamicObject[] existingData = BusinessDataServiceHelper
  157. .load(dynamicObjectType.getName(), String.join(",", selector),null);
  158. List<DynamicObject> dataListAdd = new ArrayList<>();
  159. //存在数据的客户号
  160. Map<String, DynamicObject> existingDataMap = new HashMap<>();
  161. for (DynamicObject obj : existingData) {
  162. existingDataMap.put(obj.getString("number"), obj);
  163. }
  164. for(DynamicObject dataList:dynamicObjectlist)
  165. {
  166. //获取这条数据的id
  167. String nckd_cust_id=dataList.getString("nckd_cust_id");
  168. //客户号不存在则保存
  169. if (!existingDataMap.containsKey(nckd_cust_id))
  170. {
  171. DynamicObject data = new DynamicObject(dynamicObjectType);
  172. //客户号
  173. data.set("number",dataList.getString("nckd_cust_id"));
  174. //客户名
  175. data.set("name",dataList.getString("nckd_cust_name"));
  176. //设置状态为可用
  177. data.set("enable","1");
  178. //设置状态为已审核
  179. data.set("status","C");
  180. dataListAdd.add(data);
  181. }
  182. }
  183. //保存
  184. SaveServiceHelper.save(dynamicObjectType,dataListAdd.toArray(new DynamicObject[0]));
  185. }
  186. }