ProcessReportStatic.vue 12 KB

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