SpreadJson.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. package cn.com.lzt.budget.data.util;
  2. import cn.com.lzt.budget.costbreakdown.entity.BudgetCostBreakdownEntity;
  3. import cn.com.lzt.budget.data.dto.BudgetSpreadCellData;
  4. import cn.com.lzt.budget.inst.entity.BudgetInstEntity;
  5. import cn.com.lzt.budget.instmeasure.entity.BudgetInstMeasureEntity;
  6. import cn.com.lzt.budget.tempsheet.entity.BudgetTempSheetEntity;
  7. import org.apache.commons.lang3.StringUtils;
  8. import org.codehaus.jackson.map.ObjectMapper;
  9. import org.jeecgframework.core.constant.Globals;
  10. import org.jeecgframework.core.util.ApplicationContextUtil;
  11. import org.jeecgframework.core.util.oConvertUtils;
  12. import org.jeecgframework.web.system.service.SystemService;
  13. import org.springframework.context.ApplicationContext;
  14. import java.io.IOException;
  15. import java.math.BigDecimal;
  16. import java.util.ArrayList;
  17. import java.util.HashMap;
  18. import java.util.List;
  19. import java.util.Map;
  20. public class SpreadJson {
  21. private String id;
  22. public String json ;
  23. ObjectMapper mapper = new ObjectMapper();
  24. private Map<String,Object> jsonMap ;
  25. private Map<String,Object> sheets ;
  26. private Map<String,Map<String,Object>> allCellMap;//所有单元格
  27. private Integer rowCount;
  28. private Integer colCount;
  29. private boolean change =false;
  30. private static Map<String,SpreadJson> holderMap = new HashMap<>();
  31. private String tempsheetId;
  32. public SpreadJson(String json){
  33. this(json,false);
  34. }
  35. public SpreadJson(String json,boolean init){
  36. this.json = json;
  37. try {
  38. jsonMap = mapper.readValue(json,Map.class);
  39. sheets = (Map<String, Object>) jsonMap.get("sheets");
  40. if(init){
  41. initCellData();
  42. }
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. /**
  48. *
  49. * @param id tempsheet#id cost#id
  50. * @return
  51. */
  52. public static SpreadJson getCacheInstance(BudgetConstant.BudgetType budgetType,String id, String tempsheetId,String json, boolean init){
  53. synchronized (holderMap) {
  54. SpreadJson spread = holderMap.get(id);
  55. if (spread == null) {
  56. if(StringUtils.isBlank(json)){
  57. SystemService systemService = ApplicationContextUtil.getContext().getBean(SystemService.class);
  58. switch (budgetType){
  59. case tempsheet:
  60. BudgetInstEntity instEntity = systemService.getEntity(BudgetInstEntity.class, id);
  61. json = instEntity.getJson();
  62. tempsheetId = instEntity.getTempSheetId();
  63. break;
  64. case costbreakdown:
  65. BudgetCostBreakdownEntity breakdownEntity = systemService.getEntity(BudgetCostBreakdownEntity.class, id);
  66. json = breakdownEntity.getJson();
  67. break;
  68. }
  69. }
  70. if(StringUtils.isBlank(json)) return null;
  71. spread = new SpreadJson(json, init);
  72. spread.id = id;
  73. spread.setTempsheetId(tempsheetId);
  74. holderMap.put(id, spread);
  75. }
  76. return spread;
  77. }
  78. }
  79. public static void clear(){
  80. holderMap.clear();
  81. }
  82. private void initCellData() {
  83. allCellMap = new HashMap<>();
  84. Map<String, Object> dataMap = data(1);
  85. Map<String, Object> dataTable = (Map<String, Object>) dataMap.get("dataTable");
  86. for(Map.Entry<String,Object> entry :dataTable.entrySet()) {
  87. String row = entry.getKey();
  88. rowCount = Integer.valueOf(row)+1;
  89. Map<String, Object> rowCols = (Map<String, Object>) entry.getValue();
  90. for (Map.Entry<String, Object> rowColsEntry : rowCols.entrySet()) {
  91. String col = rowColsEntry.getKey();
  92. colCount = Integer.valueOf(col)+1;
  93. String key = row+"#"+col;
  94. Map<String, Object> cellMap = (Map<String, Object>) rowColsEntry.getValue();
  95. allCellMap.put(key,cellMap);
  96. }
  97. }
  98. }
  99. public Map<String, Object> data(Integer sheetIndex){
  100. String key = "Sheet"+sheetIndex;
  101. Map<String,Object> sheetMap = (Map<String, Object>) sheets.get(key);
  102. Map<String,Object> dataMap = (Map<String, Object>) sheetMap.get("data");
  103. return dataMap;
  104. }
  105. public String getJson() {
  106. return json;
  107. }
  108. public void setJson(String json) {
  109. this.json = json;
  110. }
  111. public String toJson() throws IOException {
  112. return mapper.writeValueAsString(jsonMap);
  113. }
  114. public Map<String, Object> getJsonMap() {
  115. return jsonMap;
  116. }
  117. public List<BudgetSpreadCellData> getFillData(){
  118. return getFillData(BudgetConstant.EXPECT_YES);
  119. }
  120. //直接写值
  121. public synchronized void writeDataValue(Integer dataRow ,Integer dataCol,BigDecimal dataValue){
  122. String key = dataRow+"#"+dataCol;
  123. Map<String,Object> cellMap = allCellMap.get(key);
  124. if(dataValue==null) dataValue=BigDecimal.ZERO;
  125. if(cellMap!=null){
  126. cellMap.put("value", dataValue.doubleValue());
  127. change = true;
  128. }
  129. }
  130. public synchronized void writeDataValue(Integer dataRow ,Integer dataCol,String dataValue){
  131. String key = dataRow+"#"+dataCol;
  132. Map<String,Object> cellMap = allCellMap.get(key);
  133. if(dataValue==null) dataValue="";
  134. if(cellMap!=null){
  135. cellMap.put("value", dataValue);
  136. change = true;
  137. }
  138. }
  139. public synchronized void writeFormula(Integer dataRow ,Integer dataCol,String formula){
  140. _writeCellValue(dataRow,dataCol,"formula",formula);
  141. }
  142. private synchronized void _writeCellValue(Integer row ,Integer col,String key, String value){
  143. Map<String,Object> cellMap = getDataCell(row,col);
  144. if(cellMap!=null){
  145. cellMap.put(key, value);
  146. change = true;
  147. }
  148. }
  149. //获得单元格
  150. public synchronized Map<String,Object> getDataCell(Integer row,Integer col){
  151. String key = row+"#"+col;
  152. Map<String,Object> cellMap = allCellMap.get(key);
  153. return cellMap;
  154. }
  155. public String getString(Integer row ,Integer col){
  156. return oConvertUtils.getString(getDataValue(row,col));
  157. }
  158. public BigDecimal getDecimal(Integer row ,Integer col){
  159. String sValue = getString(row,col);
  160. try {
  161. if (StringUtils.isNotBlank(sValue)) {
  162. return new BigDecimal(sValue);
  163. }
  164. }catch(Exception e){
  165. return BigDecimal.ZERO;
  166. }
  167. return null;
  168. }
  169. private synchronized Object getDataValue(Integer row ,Integer col){
  170. Map<String,Object> cellMap =getDataCell(row,col);
  171. if(cellMap!=null){
  172. return cellMap.get("value");
  173. }
  174. return null;
  175. }
  176. //获得tag的值
  177. public String getTagValue(Integer row ,Integer col,String tagKey){
  178. Map<String,Object> cellMap = getDataCell(row,col );
  179. if(cellMap!=null){
  180. Map<String, Object> cellTag = (Map<String, Object>) cellMap.get("tag");
  181. if(cellTag!=null){
  182. return oConvertUtils.getString(cellTag.get(tagKey));
  183. }
  184. }
  185. return null;
  186. }
  187. /**
  188. *
  189. * @param defalutExcpet 默认预实维度
  190. * @return
  191. */
  192. public List<BudgetSpreadCellData> getFillData(Integer defalutExcpet){
  193. Integer sheetIndex = 1;
  194. Map<String, Object> dataMap = data(sheetIndex);
  195. Map<String, Object> dataTable = (Map<String, Object>) dataMap.get("dataTable");
  196. List<BudgetSpreadCellData> list = new ArrayList<>();
  197. for(Map.Entry<String,Object> entry :dataTable.entrySet()){
  198. String row = entry.getKey();
  199. Map<String, Object> rowCols = (Map<String, Object>) entry.getValue();
  200. for(Map.Entry<String,Object> rowColsEntry :rowCols.entrySet()) {
  201. String col = rowColsEntry.getKey();
  202. BudgetSpreadCellData cellData = new BudgetSpreadCellData();
  203. Map<String, Object> cellMap = (Map<String, Object>) rowColsEntry.getValue();
  204. Map<String, Object> cellTag = (Map<String, Object>) cellMap.get("tag");
  205. if (cellTag == null) continue;
  206. Boolean dataCell = (Boolean) cellTag.get("dataCell");
  207. if (dataCell == null || !dataCell) continue;
  208. Object value = cellMap.get("value");
  209. String formula =oConvertUtils.getString(cellMap.get("formula"));
  210. Integer expect = oConvertUtils.getInt(cellTag.get("expect"),defalutExcpet);
  211. cellData.setFormula(formula);
  212. cellData.setExpect(expect);
  213. String dataType =oConvertUtils.getString(cellTag.get("datatype"));
  214. cellData.setDataType(dataType);
  215. String showType =oConvertUtils.getString(cellTag.get("showType"));
  216. cellData.setShowType(showType);
  217. if(StringUtils.equals(dataType,"txt") || dataType==null){
  218. cellData.setTxtValue(value==null?null:value.toString());
  219. }else{
  220. if(value!=null && StringUtils.isNotBlank(value.toString())){
  221. try {
  222. cellData.setValue(BudgetUtils.measureShowValueToDb(new BigDecimal(StringUtils.trim(value.toString())), dataType, showType));
  223. }catch (NumberFormatException ne){
  224. System.out.println(row+","+col+","+value.toString());
  225. throw ne;
  226. }
  227. }
  228. }
  229. String functionId = oConvertUtils.getString(cellTag.get("functionId"));
  230. cellData.setFunctionId(functionId);
  231. String measureId = oConvertUtils.getString(cellTag.get("measureId"));
  232. cellData.setMeasureId(measureId);
  233. String measureName = oConvertUtils.getString(cellTag.get("measureName"));
  234. cellData.setMeasureName(measureName);
  235. String entityId = oConvertUtils.getString(cellTag.get("entityId"));
  236. cellData.setEntityId(entityId);
  237. String entityName = oConvertUtils.getString(cellTag.get("entityName"));
  238. cellData.setEntityName(entityName);
  239. Integer includeTax = oConvertUtils.getInt(cellTag.get("includeTax"),Integer.valueOf(Globals.YES));
  240. cellData.setIncludeTax(includeTax);
  241. String controlFlag = oConvertUtils.getString(cellTag.get("controlFlag"));
  242. cellData.setControlFlag(controlFlag);
  243. Integer readOnly = oConvertUtils.getInt(cellTag.get("readOnly"),Integer.valueOf(Globals.NO));
  244. cellData.setReadOnly(readOnly);
  245. cellData.addDataRule("readOnly", readOnly);
  246. String fractionNum = oConvertUtils.getString(cellTag.get("fractionNum"));
  247. String currencySymbol = oConvertUtils.getString(cellTag.get("currencySymbol"));
  248. String thousandth = oConvertUtils.getString(cellTag.get("thousandth"));
  249. String saveAuth = oConvertUtils.getString(cellTag.get("saveAuth"));
  250. cellData.addDataRule("fractionNum", fractionNum);
  251. cellData.addDataRule("currencySymbol", currencySymbol);
  252. cellData.addDataRule("thousandth", thousandth);
  253. cellData.addDataRule("saveAuth", saveAuth);
  254. cellData.setRow(Integer.valueOf(row));
  255. cellData.setCol(Integer.valueOf(col));
  256. String findKey =oConvertUtils.getString(cellTag.get("findKey"));
  257. cellData.setFindKey(findKey);
  258. cellData.setCellMapRef(cellMap);
  259. list.add(cellData);
  260. }
  261. }
  262. return list;
  263. }
  264. public Integer getRowCount() {
  265. return rowCount;
  266. }
  267. public void setRowCount(Integer rowCount) {
  268. this.rowCount = rowCount;
  269. }
  270. public Integer getColCount() {
  271. return colCount;
  272. }
  273. public void setColCount(Integer colCount) {
  274. this.colCount = colCount;
  275. }
  276. public boolean isChange() {
  277. return change;
  278. }
  279. public void setChange(boolean change) {
  280. this.change = change;
  281. }
  282. public String getId() {
  283. return id;
  284. }
  285. public void setId(String id) {
  286. this.id = id;
  287. }
  288. public String getTempsheetId() {
  289. return tempsheetId;
  290. }
  291. public void setTempsheetId(String tempsheetId) {
  292. this.tempsheetId = tempsheetId;
  293. }
  294. }