UpdateBankDailyTask.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package sys.sc.task;
  2. import com.alibaba.druid.support.logging.Log;
  3. import com.alibaba.druid.support.logging.LogFactory;
  4. import kd.bos.context.RequestContext;
  5. import kd.bos.dataentity.entity.DynamicObject;
  6. import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
  7. import kd.bos.entity.EntityMetadataCache;
  8. import kd.bos.exception.KDException;
  9. import kd.bos.orm.query.QCP;
  10. import kd.bos.orm.query.QFilter;
  11. import kd.bos.schedule.api.MessageHandler;
  12. import kd.bos.schedule.executor.AbstractTask;
  13. import kd.bos.servicehelper.BusinessDataServiceHelper;
  14. import kd.bos.servicehelper.operation.SaveServiceHelper;
  15. import sys.sc.opplugin.utils.InterFaceImgUtils;
  16. import sys.sc.opplugin.utils.SftpClient;
  17. import java.io.BufferedReader;
  18. import java.io.IOException;
  19. import java.io.InputStreamReader;
  20. import java.text.SimpleDateFormat;
  21. import java.util.*;
  22. /**
  23. * @author cjz
  24. * @date 2024/9/10 9:00
  25. * @description:日常更新行名行号调度计划
  26. */
  27. public class UpdateBankDailyTask extends AbstractTask {
  28. private static final Log log = LogFactory.getLog(UpdateBankDailyTask.class);
  29. public InterFaceImgUtils interFaceImgUtils=new InterFaceImgUtils("produceurl");
  30. @Override
  31. public MessageHandler getMessageHandle() {
  32. return super.getMessageHandle();
  33. }
  34. @Override
  35. public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
  36. String mes="-----------------正在执行任务,读取行名行号---------------------";
  37. log.info(mes+requestContext);
  38. //行名行号表字段
  39. List<String> selector = Arrays.asList(
  40. "number", "name"
  41. );
  42. //行名行号表标识
  43. String bd_bebank="bd_bebank";
  44. try {
  45. log.info("----------------------获取服务器连接------------------------");
  46. //服务器ip
  47. String host=interFaceImgUtils.getServerName();
  48. //用户名
  49. String username=interFaceImgUtils.getServerUser();
  50. //用户密码
  51. String password=interFaceImgUtils.getServerPassword();
  52. //分割符
  53. String splitsign=interFaceImgUtils.getServerSplit();
  54. //结尾符
  55. String endsign=interFaceImgUtils.getServerEndsign();
  56. int port= interFaceImgUtils.getPort();
  57. //获取服务器连接
  58. SftpClient sftpClient=new SftpClient(host,username,password,port);
  59. sftpClient.connect();
  60. List<DynamicObject> createdataList = new ArrayList<>();
  61. List<DynamicObject> updatedataList = new ArrayList<>();
  62. //文件路径
  63. String fileurl = getFileUrl("hmhhurl");
  64. //基础资料
  65. DynamicObjectType dynamicObjectType = EntityMetadataCache.getDataEntityType(bd_bebank);
  66. //国家基础资料(中国)
  67. DynamicObject country= BusinessDataServiceHelper
  68. .loadSingle("bd_country","number", new QFilter[]{new QFilter("number", QCP.equals, "001")});
  69. //查出所有现有的数据
  70. DynamicObject[] existingData = BusinessDataServiceHelper
  71. .load(dynamicObjectType.getName(), String.join(",", selector)+",enable,nckd_datasource", null);
  72. //查找文件更新的数据
  73. Map<String, DynamicObject> existingDataMap = new HashMap<>();
  74. for (DynamicObject obj : existingData) {
  75. //单据号
  76. existingDataMap.put(obj.getString(selector.get(0)), obj);
  77. }
  78. Set<String> processeddubilidSet = new HashSet<>();
  79. //读取服务器文件并写入
  80. try (BufferedReader reader = new BufferedReader(new InputStreamReader(sftpClient.fileInputStream(fileurl)))) {
  81. String line;
  82. while ((line = reader.readLine()) != null) {
  83. //去掉换行符|$|
  84. line = line.replace(endsign, "");
  85. //空格符号,根据这个符号分割
  86. String[] fields = line.split(splitsign,-1);
  87. //如果获取的数据行不等于预设字段的行,则跳过这行数据
  88. // if (fields.length != selector.size()) {
  89. // continue;
  90. // }
  91. //获取单据号
  92. String dubil_id = fields[0];
  93. boolean isUpdated = false;
  94. DynamicObject data;
  95. processeddubilidSet.add(dubil_id);
  96. if (existingDataMap.containsKey(dubil_id)) {
  97. //获取对应单据号的数据
  98. data = existingDataMap.get(dubil_id);
  99. for (int i = 0; i < selector.size(); i++) {
  100. String fieldName = selector.get(i);
  101. String newValue = fields[i];
  102. String existingValue = data.getString(fieldName);
  103. //判断数据是否与之前的数据相同,不相同则更新
  104. if (!Objects.equals(existingValue, newValue)) {
  105. data.set(fieldName, newValue);
  106. isUpdated = true;
  107. }
  108. }
  109. //更新了数据则设置数据更新的时间
  110. if (isUpdated) {
  111. updatedataList.add(data);
  112. }
  113. } else {
  114. //不存在这条数据则新增一条到data中
  115. data = new DynamicObject(dynamicObjectType);
  116. for (int i = 0; i < selector.size(); i++) {
  117. data.set(selector.get(i), fields[i]);
  118. }
  119. //国家
  120. data.set("country",country);
  121. //省
  122. data.set("provincetxt","江西");
  123. //市
  124. data.set("citytxt","南昌");
  125. //联行号等于行号
  126. data.set("union_number",fields[0]);
  127. //设置可用状态
  128. data.set("enable","1");
  129. //设置数据来源,0为手动更新,1为文件自动更新
  130. data.set("nckd_datasource","1");
  131. createdataList.add(data);
  132. }
  133. }
  134. }
  135. //关闭连接
  136. sftpClient.disconnect();
  137. //获取自动添加的数据,与手动添加的数据做区分,nckd_datasource:1为读取数据添加,0为手动添加
  138. DynamicObject[] autoData = BusinessDataServiceHelper
  139. .load(dynamicObjectType.getName()
  140. , String.join(",", selector)+",enable,nckd_datasource",
  141. new QFilter[]{new QFilter("nckd_datasource", QCP.equals, "1")});
  142. for (DynamicObject autoDatum : autoData) {
  143. //如果导入的数据在系统中没有则禁用
  144. if (!processeddubilidSet.contains(autoDatum.getString("number"))) {
  145. //设置禁用
  146. autoDatum.set("enable", "0");
  147. }
  148. }
  149. SaveServiceHelper.save(autoData);
  150. //查找更新数据
  151. for (Map.Entry<String, DynamicObject> entry : existingDataMap.entrySet()) {
  152. String dubil_id = entry.getKey();
  153. DynamicObject data = entry.getValue();
  154. if (!processeddubilidSet.contains(dubil_id)) {
  155. // data.set("nckd_isdelete", true);
  156. updatedataList.add(data);
  157. }
  158. }
  159. //新增数据不为空则更新到数据库中
  160. if (!createdataList.isEmpty()) {
  161. SaveServiceHelper.save(dynamicObjectType, createdataList.toArray(new DynamicObject[0]));
  162. }
  163. //更新的数据不为空,则更新到数据库中
  164. if (!updatedataList.isEmpty()) {
  165. SaveServiceHelper.save(updatedataList.get(0).getDynamicObjectType(), updatedataList.toArray(new DynamicObject[0]));
  166. }
  167. log.info("------------------数据已成功保存------------------");
  168. } catch (IOException ex) {
  169. ex.printStackTrace();
  170. log.info("----------------------读取文件时发生错误-----------------");
  171. } catch (Exception ex) {
  172. throw new RuntimeException(ex);
  173. }
  174. }
  175. @Override
  176. public boolean isSupportReSchedule() {
  177. return super.isSupportReSchedule();
  178. }
  179. //根据接口配置信息获取组织人员,拼接服务器文件路径url,参数为urlcode接口配置信息编码
  180. public String getFileUrl(String urlcode)
  181. {
  182. //组织人员接口配置信息获取
  183. DynamicObject nckd_jkpzxx= BusinessDataServiceHelper
  184. .loadSingle("nckd_jkpzxx", new QFilter[]{new QFilter("number", "=", urlcode)});
  185. //取文件名
  186. String nckd_filename= nckd_jkpzxx.getString("nkcd_filename");
  187. //获取文件路径
  188. String nckd_url=nckd_jkpzxx.getString("nckd_url");
  189. //当前日期
  190. Date currentDate=new Date();
  191. Calendar calendar = Calendar.getInstance();
  192. calendar.setTime(currentDate);
  193. calendar.add(Calendar.DATE, -1); // 将日期减少一天
  194. //日期减少一天
  195. Date newDate = calendar.getTime();
  196. //转换日期格式
  197. SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");
  198. String datestr=sf.format(newDate);
  199. //文件路径拼接
  200. //文件完整路径
  201. String realPath = nckd_url+datestr+"/"+nckd_filename+"_"+datestr+".dat";
  202. return realPath;
  203. }
  204. }