SaveWaterPowerReadService.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package com.kingdee.eas.custom.dormitorysystem.service;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.kingdee.bos.BOSException;
  4. import com.kingdee.bos.Context;
  5. import com.kingdee.bos.bsf.service.app.IHRMsfService;
  6. import com.kingdee.bos.dao.IObjectPK;
  7. import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
  8. import com.kingdee.bos.metadata.MetaDataLoaderFactory;
  9. import com.kingdee.bos.metadata.data.ColumnInfo;
  10. import com.kingdee.bos.metadata.data.SQLType;
  11. import com.kingdee.bos.metadata.entity.*;
  12. import com.kingdee.eas.common.EASBizException;
  13. import com.kingdee.eas.custom.dormitorysystem.dormitory.DormitoryFactory;
  14. import com.kingdee.eas.custom.dormitorysystem.dormitory.DormitoryInfo;
  15. import com.kingdee.eas.custom.dormitorysystem.dormitory.IDormitory;
  16. import com.kingdee.eas.custom.dormitorysystem.waterpower.IWaterPowerMeterReading;
  17. import com.kingdee.eas.custom.dormitorysystem.waterpower.WaterPowerMeterReadingFactory;
  18. import com.kingdee.eas.custom.dormitorysystem.waterpower.WaterPowerMeterReadingInfo;
  19. import com.kingdee.eas.framework.CoreBaseInfo;
  20. import org.apache.commons.lang3.StringUtils;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import com.kingdee.eas.base.core.util.EmptyUtil;
  24. import com.kingdee.eas.base.permission.UserCollection;
  25. import com.kingdee.eas.base.permission.UserFactory;
  26. import com.kingdee.eas.base.permission.UserInfo;
  27. import java.math.BigDecimal;
  28. import java.util.ArrayList;
  29. import java.util.HashMap;
  30. import java.util.List;
  31. import java.util.Map;
  32. /**
  33. * 保存水电读书
  34. * coyle
  35. * 2025/12/19 10:37
  36. */
  37. public class SaveWaterPowerReadService implements IHRMsfService {
  38. private static final Logger logger = LoggerFactory.getLogger(SaveWaterPowerReadService.class);
  39. // 定义日期格式化器,避免重复创建
  40. @Override
  41. public Object process(Context ctx, Map<String, Object> param) throws EASBizException, BOSException {
  42. if (ctx == null) {
  43. throw new BOSException("上下文Context不能为空");
  44. }
  45. IWaterPowerMeterReading localInstance = WaterPowerMeterReadingFactory.getLocalInstance(ctx);
  46. WaterPowerMeterReadingInfo info = new WaterPowerMeterReadingInfo();
  47. Object fidObj = param.get("fid");
  48. if (fidObj != null && !StringUtils.isEmpty(fidObj.toString()) && (fidObj.toString()).length()> 5) {
  49. String fid = fidObj.toString().trim();
  50. info = localInstance.getWaterPowerMeterReadingInfo(new ObjectUuidPK(fid));
  51. }
  52. EntityObjectInfo enty = MetaDataLoaderFactory.getLocalMetaDataLoader(ctx).getEntity(info.getBOSType());
  53. PropertyCollection ps = enty.getInheritedNoDuplicatedPropertiesRuntime();
  54. List<String> ColumnNames = new ArrayList<>();
  55. List<String> bigCol = new ArrayList<>();
  56. for (int j = 0; j < ps.size(); ++j) {
  57. PropertyInfo p = ps.get(j);
  58. ColumnInfo mappingField = p.getMappingField();
  59. SQLType typeName = mappingField.getTypeName();
  60. String fkey = p.getName();
  61. if (EmptyUtil.isEmpty(fkey)) continue;
  62. if(StringUtils.equals( typeName.toString() , "NUMERIC")) {
  63. bigCol.add(fkey);
  64. }
  65. ColumnNames.add(fkey);
  66. }
  67. // 4. 构建查询结果并返回
  68. setObjectPropertyValue (info, param, ColumnNames, bigCol );
  69. if (fidObj != null && !StringUtils.isEmpty(fidObj.toString()) && (fidObj.toString()).length()> 5 )
  70. localInstance.update(new ObjectUuidPK(fidObj.toString()), info);
  71. else {
  72. //抄表人
  73. if(param.containsKey("creatorNum")) {
  74. String creatorNum = String.valueOf(param.get("creatorNum"));
  75. UserCollection userCollection = UserFactory.getLocalInstance(ctx).getUserCollection(" where number = '" + creatorNum +"'");
  76. if(null != userCollection && userCollection.size() > 0) {
  77. UserInfo userInfo = userCollection.get(0);
  78. info.setMeterReaPerson(userInfo.getPerson());
  79. }
  80. }else {
  81. IObjectPK userId = ctx.getCaller();
  82. UserInfo user = UserFactory.getRemoteInstance().getUserByID(userId);
  83. String personId = user.getPerson().getId().toString();
  84. info.put("meterReaPerson",personId);
  85. }
  86. IObjectPK addnew = localInstance.addnew(info);
  87. }
  88. return "success";
  89. }
  90. protected void setObjectPropertyValue(CoreBaseInfo coreBaseInfo,Map<String, Object> param, List<String> ColumnNames ,List<String> bigCol) {
  91. Object data = param.get("data");
  92. if (data == null) {
  93. return;
  94. }
  95. String dataStr = data.toString().trim();
  96. if(dataStr.startsWith("'") && dataStr.endsWith("'")){
  97. dataStr = dataStr.substring(1, dataStr.length() - 1);
  98. }else if(dataStr.startsWith("\"") && dataStr.endsWith("\"")){
  99. dataStr = dataStr.substring(1, dataStr.length() - 1);
  100. }
  101. dataStr = dataStr .replace("\\", "");
  102. //转换为json后,再转换为map
  103. Map<String, Object> dataMap = (Map<String, Object>) JSONObject.parse(dataStr.toString());
  104. // 1. 预处理:生成 小写键 -> 原值 的映射(仅需执行一次)
  105. Map<String, Object> lowerCaseDataMap = new HashMap<>();
  106. for (Map.Entry<String, Object> entry : dataMap.entrySet()) {
  107. // 键转小写,值保留原值
  108. String lowerKey = entry.getKey().toLowerCase();
  109. lowerCaseDataMap.put(lowerKey, entry.getValue());
  110. }
  111. // 3. 遍历ColumnNames,不区分大小写匹配
  112. for (String propName : ColumnNames) {
  113. // propName也转小写,匹配预处理后的映射
  114. String lowerPropName = propName.toLowerCase();
  115. if (lowerCaseDataMap.containsKey(lowerPropName)) {
  116. Object value = lowerCaseDataMap.get(lowerPropName);
  117. if (value != null && !StringUtils.isAllEmpty(value.toString())) {
  118. if( bigCol.contains(propName) ) {
  119. coreBaseInfo.put(propName, safeConvertToBigDecimal(value.toString())); // 最终存入的键还是原propName(保持原有命名)
  120. }else {
  121. coreBaseInfo.put(propName, value); // 最终存入的键还是原propName(保持原有命名)
  122. }
  123. // if("dormitory".equals(lowerPropName)) {
  124. // coreBaseInfo.put(propName, "gMIDv2SBRdqAf5nD2B1DzlUo6p0="); // 最终存入的键还是原propName(保持原有命名)
  125. // }
  126. }
  127. }
  128. }
  129. }
  130. /**
  131. * 安全将字符串转换为BigDecimal
  132. * @param str 待转换的字符串(可能为空、非数字)
  133. * @param defaultValue 转换失败时的默认值(如BigDecimal.ZERO)
  134. * @return 合法的BigDecimal值
  135. */
  136. public static BigDecimal safeConvertToBigDecimal(String str, BigDecimal defaultValue) {
  137. // 1. 处理空值(null/空字符串/全空格)
  138. if (str == null || str.trim().isEmpty()) {
  139. return defaultValue;
  140. }
  141. try {
  142. // 2. 尝试转换为BigDecimal
  143. return new BigDecimal(str.trim());
  144. } catch (NumberFormatException e) {
  145. // 3. 转换失败返回默认值(可记录日志便于排查)
  146. System.err.println("字符串转换BigDecimal失败,值为:" + str + ",原因:" + e.getMessage());
  147. return defaultValue;
  148. }
  149. }
  150. // 重载方法:默认值为0
  151. public static BigDecimal safeConvertToBigDecimal(String str) {
  152. return safeConvertToBigDecimal(str, BigDecimal.ZERO);
  153. }
  154. }