ProcessReportStatic.vue 12 KB

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