ProcessReportStatic.vue 12 KB

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