PanelViewServiceImpl.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package com.uas.kanban.service.impl;
  2. import java.io.IOException;
  3. import java.sql.SQLException;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map;
  9. import javax.xml.transform.TransformerException;
  10. import org.dom4j.DocumentException;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Service;
  13. import com.alibaba.fastjson.JSON;
  14. import com.alibaba.fastjson.JSONObject;
  15. import com.uas.kanban.annotation.NotEmpty;
  16. import com.uas.kanban.base.BaseDao;
  17. import com.uas.kanban.base.BaseService;
  18. import com.uas.kanban.dao.KanbanDao;
  19. import com.uas.kanban.dao.PanelDao;
  20. import com.uas.kanban.dao.PanelViewDao;
  21. import com.uas.kanban.exception.OperationException;
  22. import com.uas.kanban.model.Kanban;
  23. import com.uas.kanban.model.Panel;
  24. import com.uas.kanban.model.PanelView;
  25. import com.uas.kanban.model.Parameter;
  26. import com.uas.kanban.model.ViewConfig;
  27. import com.uas.kanban.service.PanelViewService;
  28. import com.uas.kanban.service.ParameterService;
  29. import com.uas.kanban.support.DataSourceManager;
  30. import com.uas.kanban.support.KanbanParser;
  31. import com.uas.kanban.support.SystemSession;
  32. import com.uas.kanban.util.CollectionUtils;
  33. import com.uas.kanban.util.ObjectUtils;
  34. import com.uas.kanban.util.StringUtils;
  35. import me.chyxion.jdbc.NewbieJdbcSupport;
  36. /**
  37. * 面板画面
  38. *
  39. * @author zhuth
  40. * @since 2018/5/24 14:04
  41. */
  42. @Service
  43. public class PanelViewServiceImpl extends BaseService<PanelView> implements PanelViewService {
  44. @Autowired
  45. private PanelViewDao panelViewDao;
  46. @Autowired
  47. private PanelDao panelDao;
  48. @Autowired
  49. private KanbanDao kanbanDao;
  50. @Autowired
  51. private ParameterService parameterService;
  52. @Autowired
  53. private DataSourceManager dataSourceManager;
  54. @Autowired
  55. private KanbanParser kanbanParser;
  56. @Override
  57. public PanelView save(@NotEmpty("json") String json) {
  58. PanelView panelView = panelViewDao.parse(json);
  59. Panel panel = panelDao.checkExist(panelView.getPanelCode());
  60. panelView.setPanelVersion(panel.getVersion());
  61. return panelViewDao.save(panelView);
  62. }
  63. @Override
  64. public int update(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
  65. PanelView newPanelView = panelViewDao.parse(json);
  66. PanelView oldPanelView = panelViewDao.checkExist(newPanelView.getCode());
  67. if(ObjectUtils.equals(newPanelView, oldPanelView)) {
  68. return 0;
  69. }
  70. return panelViewDao.update(newPanelView);
  71. }
  72. @Override
  73. public Map<String, Object> parseData(@NotEmpty("code") String code, Integer index, String kanbanCode) throws OperationException {
  74. index = index == null ? 0 : index;
  75. PanelView panelView = panelViewDao.checkExist(code);
  76. BaseDao.checkFields(panelView);
  77. Panel panel = panelDao.checkExist(panelView.getPanelCode());
  78. List<ViewConfig> areaConfigs = panelView.getAreaConfig();
  79. ViewConfig viewConfig = areaConfigs.get(index);
  80. List<String> viewKanbans = viewConfig.getViewKanbans();
  81. if(CollectionUtils.isEmpty(viewKanbans)) {
  82. throw new IllegalStateException("该画面未配置可展示看板");
  83. }
  84. if (!StringUtils.isEmpty(kanbanCode)) {
  85. if (!viewKanbans.contains(kanbanCode)) {
  86. throw new IllegalArgumentException("看板不存在或未启用:" + kanbanCode);
  87. }
  88. } else {
  89. kanbanCode = viewKanbans.get(0);
  90. }
  91. Kanban kanban = kanbanDao.checkExist(kanbanCode);
  92. BaseDao.checkFields(kanban);
  93. String content = kanban.getContent();
  94. String title = kanban.getTitle();
  95. if (StringUtils.isEmpty(content)) {
  96. throw new IllegalStateException("看板内容为空:" + kanbanCode);
  97. }
  98. List<Parameter> parameters = parameterService.getParseDataByPanelCode(panel.getCode());
  99. List<JSONObject> pvalues = panelView.getParameters();
  100. JSONObject values = pvalues.get(index);
  101. for(Parameter parameter : parameters) {
  102. String value = values.getString(parameter.getCode());
  103. parameter.setValue(value);
  104. }
  105. // 解析看板
  106. String kanbanContent;
  107. try {
  108. NewbieJdbcSupport jdbc = dataSourceManager.getJdbc(panel.getDataSourceCode());
  109. kanbanContent = kanbanParser.parseXml(content, title, parameters, jdbc);
  110. } catch (DocumentException e) {
  111. throw new IllegalStateException("xml 解析出错", e);
  112. } catch (TransformerException e) {
  113. throw new IllegalStateException("xml 映射出错", e);
  114. } catch (IOException e) {
  115. throw new IllegalStateException("xml 转换出错", e);
  116. } catch (SQLException e) {
  117. throw new IllegalStateException("SQL 查询错误", e);
  118. }
  119. Map<String, Object> result = new HashMap<>();
  120. Map<String, Object> instance = new HashMap<>();
  121. instance.put("parameters", parameters);
  122. instance.put("enabledKanbanCodes", viewKanbans);
  123. instance.put("display", panel.getDisplay());
  124. instance.put("switchFrequency", values.get("refreshFrequency"));
  125. instance.put("refreshFrequency", values.get("refreshFrequency"));
  126. result.put("instance", instance);
  127. List<JSONObject> data = new ArrayList<>();
  128. data.add(JSONObject.parseObject(kanbanContent));
  129. result.put("data", data);
  130. return result;
  131. }
  132. @Override
  133. public PanelView getByPanelCode(String panelCode) throws OperationException {
  134. PanelView panelView = panelViewDao.findByPanelCode(panelCode);
  135. Panel panel = panelDao.checkExist(panelCode);
  136. if(panelView == null || panel.getVersion() > panelView.getPanelVersion()) {
  137. if(panelView != null) {
  138. panelView = updatePanelView(panelCode, panelView);
  139. } else {
  140. panelView = generatePanelView(panelCode);
  141. }
  142. }
  143. return panelView;
  144. }
  145. /**
  146. * 更新面板多画面配置
  147. *
  148. * @param panelCode 面板 code
  149. * @param oldPanelView 旧的画面配置
  150. * @return 新的画面配置
  151. * @throws OperationException
  152. * @throws IllegalArgumentException
  153. */
  154. private PanelView updatePanelView(@NotEmpty("panelCode") String panelCode, @NotEmpty("oldPanelView") PanelView oldPanelView) throws IllegalArgumentException, OperationException {
  155. Panel panel = panelDao.checkExist(panelCode);
  156. PanelView panelView;
  157. try{
  158. panelView = ObjectUtils.clone(oldPanelView);
  159. } catch (IOException | ClassNotFoundException e) {
  160. throw new IllegalStateException("更新画面配置时,旧画面克隆失败", e);
  161. }
  162. panelView.setPanelVersion(panel.getVersion());
  163. List<ViewConfig> viewConfigs = panelView.getAreaConfig();
  164. List<Parameter> newParameter = parameterService.getParseDataByPanelCode(panel.getCode());
  165. Iterator<Parameter> i = newParameter.iterator();
  166. while(i.hasNext()) {
  167. Parameter p = i.next();
  168. for(ViewConfig viewConfig : viewConfigs) {
  169. if(viewConfig.getViewParameters() == null) {
  170. break;
  171. }
  172. JSONObject jsonObj = JSON.parseObject(viewConfig.getViewParameters());
  173. // TODO 这里只取了String类型的值
  174. if(jsonObj.getString(p.getCode()) != null) {
  175. String value = jsonObj.getString(p.getCode());
  176. List<Object> optionalValues = p.getOptionalValues();
  177. List<String> values = new ArrayList<String>();
  178. for(Object obj : optionalValues) {
  179. values.add(obj.toString());
  180. }
  181. if(values.contains(value)) {
  182. // 使用原值
  183. } else {
  184. // 使用新值
  185. jsonObj.put(p.getCode(), values.get(0));
  186. }
  187. }
  188. viewConfig.setViewParameters(JSON.toJSONString(jsonObj));
  189. }
  190. }
  191. panelView.setAreaConfig(viewConfigs);
  192. panelViewDao.update(panelView);
  193. return panelView;
  194. }
  195. /**
  196. * 初始化面板多画面配置
  197. *
  198. * @param panelCode 面板 code
  199. * @return 画面配置
  200. */
  201. private PanelView generatePanelView(@NotEmpty("panelCode") String panelCode) {
  202. Panel panel = panelDao.checkExist(panelCode);
  203. PanelView panelView = new PanelView();
  204. panelView.setViewType("single");
  205. panelView.setPanelCode(panel.getCode());
  206. panelView.setPanelVersion(panel.getVersion());
  207. panelView.setAreaRows(1);
  208. panelView.setAreaCols(1);
  209. panelView.setUserCode(SystemSession.getUser().codeNotEmpty());
  210. List<ViewConfig> areaConfig = new ArrayList<ViewConfig>();
  211. ViewConfig v = new ViewConfig();
  212. v.setViewIndex(0);
  213. v.setViewKanbans(new ArrayList<String>());
  214. List<Parameter> parameters = parameterService.getParseDataByPanelCode(panelCode);
  215. String parametersStr = "{";
  216. for(Parameter p: parameters) {
  217. parametersStr += ("\"" + p.getCode() + "\":\"" + p.getValue() + "\",");
  218. }
  219. parametersStr += "\"refreshFrequency\":5}";
  220. v.setViewParameters(parametersStr);
  221. areaConfig.add(v);
  222. panelView.setAreaConfig(areaConfig);
  223. return panelView;
  224. }
  225. }