ProcessReportDynamic.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. <template>
  2. <div>
  3. <Navbar
  4. :title="processReportDto.name"
  5. :is-go-back="processReportDto.goback"
  6. />
  7. <div>
  8. <h5>{{ processReportDto.description }}</h5>
  9. </div>
  10. <div>
  11. <div class="form-inline">
  12. <div
  13. v-for="(item, index) in parameters"
  14. :key="'parameter-' + index"
  15. class="form-group m-form-group"
  16. >
  17. <div class="form-inline-div">
  18. <label
  19. v-if="item.displayType != 'ListBoxEnumEditor'"
  20. :for="'editor_' + item.id"
  21. >{{ item.displayName }}</label>
  22. <input
  23. v-if="item.displayType =='TextEditor'"
  24. :id="'editor_' + item.id"
  25. v-model="item.fieldValue.displayValue[0]"
  26. autocomplete="off"
  27. type="text"
  28. class="form-control m-input-group"
  29. placeholder="请输入内容"
  30. @change="valueChanged(item)"
  31. />
  32. <textarea
  33. v-if="item.displayType =='TextAreaEditor'"
  34. :id="'editor_' + item.id"
  35. v-model="item.fieldValue.displayValue[0]"
  36. rows="5"
  37. type="text"
  38. class="form-control m-input-group"
  39. placeholder="请输入内容"
  40. @change="valueChanged(item)"
  41. />
  42. <input
  43. v-if="item.displayType =='NumberEditor'"
  44. :id="'editor_' + item.id"
  45. v-model="item.fieldValue.displayValue[0]"
  46. autocomplete="off"
  47. type="number"
  48. class="form-control m-input-group"
  49. placeholder="请输入数字"
  50. @change="valueChanged(item)"
  51. />
  52. <Switches
  53. v-if="item.displayType =='CheckBoxEditor'"
  54. v-model="item.fieldValue.displayValue[0]"
  55. color="green"
  56. type-bold="true"
  57. @change="valueChanged(item)"
  58. />
  59. <DateTime
  60. v-if="item.displayType =='DateTimeBoxEditor'"
  61. :id="'editor_' + item.id"
  62. v-model="item.fieldValue.displayValue[0]"
  63. class="m-input-group"
  64. name="datetime"
  65. @update:model-value="changeValue(item, $event)"
  66. />
  67. <EnumSelectWidget
  68. v-if="item.displayType =='ListBoxEnumEditor'"
  69. :field="item"
  70. :field-value="item.fieldValue"
  71. class="m-input-group"
  72. @value-changed="valueChanged($event, item)"
  73. />
  74. <MultiSearchWidget
  75. v-if="item.displayType =='MultiSearchBoxEditor'"
  76. :info-window-no="item.infoWindowNo"
  77. :where-clause-source="{'processReportParameter': {'processReportNo': processReportDto.no, 'fieldName': item.fieldName}}"
  78. :field="item"
  79. :field-value="item.fieldValue"
  80. class="m-input-group"
  81. :display-name="item.listDisplayFieldNames"
  82. @value-changed="tabValueChanged($event, item)"
  83. />
  84. <SearchWidget
  85. v-if="item.displayType =='SearchBoxEditor'"
  86. :where-clause-source="{'processReportParameter': {'processReportNo': processReportDto.no, 'fieldName': item.fieldName}}"
  87. :info-window-no="item.infoWindowNo"
  88. :field="item"
  89. :field-value="item.fieldValue"
  90. :display-name="item.listDisplayFieldNames"
  91. class="m-input-group"
  92. :parent-model-data="parentModelData"
  93. @value-changed="tabValueChanged($event, item)"
  94. />
  95. </div>
  96. <!--<div v-if = "item.constraintEnum == 'Between'" class="form-inline-div">
  97. <label v-if="item.displayType != 'ListBoxEnumEditor'" :for="'editor_' + item.id">——</label>
  98. <input autocomplete="off" v-if="item.displayType =='NumberEditor'" type="number" v-model="item.value2"
  99. class="form-control m-input-group" :id="'editor_' + item.id" placeholder="请输入数字" @change="valueChanged(item)"/>
  100. <DateTime v-if="item.displayType =='DateTimeBoxEditor'" :dateValue="item.value2"
  101. class="form-control m-input-group" name="datetime"
  102. :id="'editor_' + item.id" @on-value-change="changeValue(item, $event)" />
  103. </div> -->
  104. </div>
  105. </div>
  106. <div class="form-group">
  107. <button
  108. v-if="processReportDto.htmlHelpUrl != null && processReportDto.htmlHelpUrl != ''"
  109. class="btn btn-default"
  110. @click="openHtmlHelp(processReportDto.htmlHelpUrl)"
  111. >
  112. <span class="glyphicon glyphicon-question-sign" />
  113. </button>
  114. <input
  115. autocomplete="off"
  116. type="button"
  117. class="btn btn-primary"
  118. style="margin-top: 15px;"
  119. value="确定"
  120. @click="runProcessDynamic()"
  121. />
  122. </div>
  123. <ProcessReportResultPreview
  124. :process-report-result="processReportResult"
  125. :pdf-only="processReportDto.pdfOnly"
  126. :excel-only="processReportDto.excelOnly"
  127. />
  128. </div>
  129. <Loading v-if="loading" />
  130. </div>
  131. </template>
  132. <script>
  133. import { defineAsyncComponent } from 'vue';
  134. import Common from '../../common/Common.js';
  135. import Navbar from '../../navbar/src/Navbar.vue';
  136. import DateTime from '../../datetime/src/DateTime.vue';
  137. import Loading from '../../loading/src/Loading.vue';
  138. import ProcessReportResultPreview from './ProcessReportResultPreview.vue';
  139. import SearchWidget from '../../info/src/SearchWidget.vue';
  140. import Switches from '../../switches/src/Switches.vue';
  141. export default {
  142. components: {
  143. DateTime,
  144. MultiSearchWidget : defineAsyncComponent(() =>
  145. import('../../info/src/MultiSearchWidget.vue'),
  146. ),
  147. Loading,
  148. ProcessReportResultPreview,
  149. SearchWidget,
  150. Switches,
  151. Navbar,
  152. },
  153. props: {
  154. 'processReportDto':{
  155. type: Object,
  156. default: null,
  157. },
  158. },
  159. emits:['valueChanged'],
  160. data: function () {
  161. return {
  162. 'processReportId': '',
  163. 'processReportDtos': {},
  164. 'processResultData': '',
  165. 'processReportResult': {},
  166. 'parameters': [],
  167. 'parentModelData': {
  168. 'data': {
  169. },
  170. },
  171. loading: false,
  172. };
  173. },
  174. //监控processReportDto,当dto变化时重新渲染界面
  175. watch: {
  176. 'processReportDto': function (to, from) {
  177. this.parameters = [];
  178. this.processReportResult.reportResults = undefined;
  179. this.initData(this.processReportDto);
  180. },
  181. 'processReportDto.processReportParameters': function () {
  182. this.initData(this.processReportDto);
  183. },
  184. // 路由切换的时候清空报表结果数据
  185. '$route': function () {
  186. this.processReportResult = {};
  187. },
  188. },
  189. mounted: function () {
  190. this.initData(this.processReportDto);
  191. },
  192. methods: {
  193. /**
  194. * 打开帮助页面
  195. */
  196. openHtmlHelp: function (htmlHelpUrl) {
  197. window.open(htmlHelpUrl);
  198. },
  199. /**
  200. * 初始化数据
  201. * @param {Object} data 流程报表数据
  202. * @return {void}
  203. */
  204. initData: function (data) {
  205. console.log('获取的参数列表:' + JSON.stringify(data));
  206. var _self = this;
  207. if (data == undefined) {
  208. return;
  209. }
  210. _self.parameters = [];
  211. if (data.processReportParameters) {
  212. data.processReportParameters.forEach(function (item) {
  213. if (item.constraintEnum == 'Between') {
  214. var cloneObject1 = _self.cloneParameter(item);
  215. _self.parameters.push(cloneObject1);
  216. var cloneObject = {
  217. 'index': 2,
  218. 'isMandatory': false,
  219. 'id': item.id,
  220. 'fieldName': item.fieldName + '2',
  221. 'name': item.name,
  222. 'help': item.help,
  223. 'displayType': item.displayType,
  224. 'listDisplayFieldNames': item.listDisplayFieldNames,
  225. 'infoWindowId': item.infoWindowId,
  226. 'sortNo': item.sortNo,
  227. 'isShow': item.isShow,
  228. 'constraintEnum': item.constraintEnum,
  229. 'enumClass': item.enumClass,
  230. 'fieldValue': {
  231. 'id': '',
  232. 'constraintEnum': item.constraintEnum,
  233. 'displayValue': [],
  234. 'fieldType': 'String',
  235. },
  236. 'calloutProcessNo': item.calloutProcessNo,
  237. 'listDisplayFieldName': item.listDisplayFieldName,
  238. 'displayName': '~',
  239. 'infoWindowNo': item.infoWindowNo,
  240. };
  241. _self.parentModelData.data[cloneObject.fieldName] = cloneObject.fieldValue;
  242. console.log(cloneObject);
  243. _self.parameters.push(cloneObject);
  244. } else {
  245. var obj = _self.cloneParameter(item);
  246. _self.parameters.push(obj);
  247. }
  248. });
  249. }
  250. // 排序
  251. _self.parameters.sort(function (a, b) {
  252. return a.sortNo - b.sortNo;
  253. });
  254. console.log(_self.parameters);
  255. //_self.processReportDto = data;
  256. },
  257. /**
  258. * 执行流程
  259. * @return {void}
  260. */
  261. runProcessDynamic: function () {
  262. var _self = this;
  263. _self.processResultData = {
  264. 'processReportNo': _self.processReportDto.no,
  265. 'modelData': {
  266. data: {},
  267. },
  268. };
  269. _self.parameters.forEach(function (item) {
  270. var fieldName = item.fieldName;
  271. _self.processResultData.modelData.data[fieldName] = item.fieldValue;
  272. });
  273. _self.processReportResult = {};
  274. _self.loading=true;
  275. $.ajax({
  276. url: Common.getApiURL('ProcessReportResource/runProcessDynamic'),
  277. type: 'post',
  278. dataType: 'json',
  279. beforeSend: function (request) {
  280. Common.addTokenToRequest(request);
  281. },
  282. contentType: 'application/json',
  283. data: JSON.stringify(_self.processResultData),
  284. success: function (data) {
  285. _self.loading=false;
  286. _self.processReportResult = data;
  287. if (_self.processReportResult.reportResults != undefined && _self.processReportResult.reportResults.length > 0) {
  288. _self.processReportResult.reportResults.forEach(function (item, index) {
  289. item.previewIndex=1;
  290. if (index == 0) {
  291. item.showPreview=true;
  292. } else {
  293. item.showPreview=false;
  294. }
  295. });
  296. }
  297. // _self.processReportDto.excelOnly = false;
  298. // _self.processReportDto.pdfOnly = true;
  299. },
  300. error: function (XMLHttpRequest, textStatus, errorThrown) {
  301. _self.loading=false;
  302. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  303. },
  304. });
  305. },
  306. /**
  307. * 时间选择框数据发生改变
  308. * @param {Object} item 当前field
  309. * @param {String} newValue 改变后的值
  310. * @return {void}
  311. */
  312. changeValue: function (item, newValue) {
  313. item.fieldValue.displayValue[0]=newValue;
  314. this.valueChanged(item);
  315. },
  316. /**
  317. * 搜索框值发生改变
  318. * @param {Object} newFieldValue 改变后的值
  319. * @param {Object} item 当前field
  320. * @return {void}
  321. */
  322. tabValueChanged: function (newFieldValue, item) {
  323. item.fieldValue = newFieldValue;
  324. this.valueChanged(item);
  325. },
  326. /**
  327. * 复制参数
  328. * @param {Object}
  329. */
  330. cloneParameter: function (parameter) {
  331. var cloneObject = {
  332. 'index': 1,
  333. 'isMandatory': false,
  334. 'id': parameter.id,
  335. 'fieldName': parameter.fieldName,
  336. 'name': parameter.name,
  337. 'help': parameter.help,
  338. 'displayType': parameter.displayType,
  339. 'listDisplayFieldNames': parameter.listDisplayFieldNames,
  340. 'infoWindowId': parameter.infoWindowId,
  341. 'sortNo': parameter.sortNo,
  342. 'isShow': parameter.isShow,
  343. 'constraintEnum': parameter.constraintEnum,
  344. 'enumClass': parameter.enumClass,
  345. 'fieldValue': '',
  346. 'calloutProcessNo': parameter.calloutProcessNo,
  347. 'listDisplayFieldName': parameter.listDisplayFieldName,
  348. 'displayName': parameter.displayName,
  349. 'infoWindowNo': parameter.infoWindowNo,
  350. 'value2': '',
  351. };
  352. if (parameter.fieldValue) {
  353. cloneObject.fieldValue = parameter.fieldValue;
  354. } else {
  355. cloneObject.fieldValue = {
  356. 'id': parameter.id,
  357. 'constraintEnum': parameter.constraintEnum,
  358. 'displayValue': [],
  359. 'fieldType': 'String',
  360. };
  361. }
  362. this.parentModelData.data[cloneObject.fieldName] = cloneObject.fieldValue;
  363. return cloneObject;
  364. },
  365. // 值改变事件
  366. valueChanged: function (processReportParameter) {
  367. // this.fieldValue = newFieldValue;
  368. this.$emit('valueChanged', processReportParameter);
  369. this.parentModelData.data[processReportParameter.fieldName] = processReportParameter.fieldValue;
  370. this.parameters.forEach(function (item) {
  371. if (item.fieldName == processReportParameter.fieldName) {
  372. item = processReportParameter;
  373. }
  374. });
  375. },
  376. },
  377. };
  378. </script>
  379. <style scoped>
  380. .m-form-group label {
  381. font-size: 15px;
  382. width: 80px;
  383. text-align: center;
  384. }
  385. .processResult-textarea {
  386. width: 100%;
  387. height: 200px;
  388. }
  389. .form-input {
  390. border-radius: 4px !important;
  391. }
  392. .form-inline-div {
  393. display: inline;
  394. }
  395. .m-form-group {
  396. margin-left: 5px !important;
  397. margin-right: 5px !important;
  398. margin-bottom: 5px !important;
  399. }
  400. .m-input-group {
  401. border-radius: 4px !important;
  402. width: 200px !important;
  403. }
  404. </style>