WholeProcessManagement.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. <template>
  2. <!-- 全流程管理列表组件 -->
  3. <div id="WholeProcessManagement">
  4. <el-form :inline="true" ref="myTaskForm" style="padding: 10px">
  5. <el-form-item label="模糊查询">
  6. <el-input v-model="allSearchColumn" clearable> </el-input
  7. ></el-form-item>
  8. <el-form-item style="float: right">
  9. <el-button type="primary" @click="onSubmit">查询</el-button>
  10. <el-button @click="resetForm()">重置</el-button>
  11. </el-form-item>
  12. </el-form>
  13. <el-table
  14. v-loading="tableInitLoading"
  15. :data="tableData"
  16. style="width: calc(100% - 20px); padding: 0 10px"
  17. height="calc(80vh - 400px)"
  18. stripe
  19. :row-class-name="tableRowClassName"
  20. @row-click="rowClick"
  21. >
  22. <el-table-column type="index" width="50" label="序号"> </el-table-column>
  23. <el-table-column
  24. prop="c_project_name"
  25. label="项目名称"
  26. :filters="filters.cProjectNameFilters"
  27. :filter-multiple="false"
  28. :filtered-value="cProjectNameFilters"
  29. >
  30. </el-table-column>
  31. <!-- <el-table-column prop="c_task_type_str" label="任务类型"> </el-table-column> -->
  32. <el-table-column
  33. prop="c_project_type_str"
  34. label="项目类型"
  35. :filters="filters.cProjectTypeStrFilters"
  36. :filter-multiple="false"
  37. :filtered-value="cProjectTypeStrFilters"
  38. >
  39. </el-table-column>
  40. <el-table-column
  41. prop="c_owning_street_town_str"
  42. label="所属街镇"
  43. :filters="filters.cOwningStreetTownStrFilters"
  44. :filter-multiple="false"
  45. :filtered-value="cOwningStreetTownStrFilters"
  46. >
  47. </el-table-column>
  48. <el-table-column
  49. prop="c_year"
  50. label="年份"
  51. :filters="filters.cYearFilters"
  52. :filter-multiple="false"
  53. :filtered-value="cYearFilters"
  54. >
  55. </el-table-column>
  56. </el-table>
  57. <div id="WholeProcessManagement-footer">
  58. <Pagination :paginationData="paginationData" />
  59. </div>
  60. <!-- 全流程管理流程组件 -->
  61. <StepsMyBox
  62. id="stepsBox"
  63. :clickData="clickData"
  64. v-show="StepsMyBoxShowState"
  65. @hideStepsMyBoxState="StepsMyBoxShowState = false"
  66. />
  67. </div>
  68. </template>
  69. <script>
  70. /**
  71. * 头部菜单(全流程管理列表)组件
  72. * @author: LiuMengxiang
  73. * @Date: 2022年11月21-25日
  74. */
  75. import StepsMyBox from "./StepsMyBox.vue";
  76. import Pagination from "@/components/common/Pagination.vue";
  77. export default {
  78. name: "WholeProcessManagement",
  79. components: { StepsMyBox, Pagination },
  80. data() {
  81. return {
  82. tableInitLoading: true,
  83. // 数据字典暂存对象
  84. selectSelectDataMap: {
  85. projectType: [],
  86. associatedItems: []
  87. },
  88. StepsMyBoxShowState: false,
  89. // 查询条件
  90. formInline: {
  91. c_task_type: "",
  92. c_owning_street_town: "",
  93. c_create_date: ""
  94. },
  95. // 搜索SQL对象
  96. whereStr: "",
  97. // 模糊搜索框绑定对象
  98. allSearchColumn: "",
  99. // filters
  100. filters: {
  101. cProjectNameFilters: [],
  102. cProjectTypeStrFilters: [],
  103. cOwningStreetTownStrFilters: [],
  104. cYearFilters: []
  105. },
  106. // 表头搜索条件绑定对象
  107. cProjectNameFilters: [],
  108. cProjectTypeStrFilters: [],
  109. cOwningStreetTownStrFilters: [],
  110. cYearFilters: [],
  111. // 我的任务form表单
  112. tableData: [],
  113. paginationData: {
  114. pageSize: 10,
  115. currentPage: 1,
  116. pageSizes: [10, 20, 50],
  117. total: 0,
  118. currentChange: val => {
  119. this.handleCurrentChange(val);
  120. },
  121. handleSizeChange: val => {
  122. this.handleSizeChange(val);
  123. }
  124. },
  125. clickData: {}
  126. };
  127. },
  128. props: {},
  129. mounted() {
  130. // 首先获取数据字典中的下拉框数据
  131. this.selectSelectData("0", "c_task_type", "projectType");
  132. this.selectSelectData("0", "项目类别", "project2Type");
  133. this.selectSelectData("0", "浦东新区行政区划", "associatedItems");
  134. this.onSubmit();
  135. },
  136. computed: {
  137. filteredValues() {
  138. return (
  139. this.cProjectNameFilters[0] +
  140. this.cProjectTypeStrFilters[0] +
  141. this.cOwningStreetTownStrFilters[0] +
  142. this.cYearFilters[0]
  143. );
  144. }
  145. },
  146. watch: {
  147. filteredValues() {
  148. this.onSubmit();
  149. }
  150. },
  151. methods: {
  152. // 数据字典查询
  153. selectSelectData(type, cName, keyName) {
  154. let params = new FormData();
  155. params.append("type", type);
  156. params.append("cName", cName);
  157. this.$Post(this.urlsCollection.selectByCNameAType, params).then(
  158. res => {
  159. if (res.code === 200 && res.content.length > 0) {
  160. this.selectSelectDataMap[keyName] = res.content;
  161. }
  162. },
  163. error => {
  164. this.$message.error(error);
  165. console.log(error);
  166. }
  167. );
  168. },
  169. // 数据字典对照显示
  170. getSelectByIndex(selectName, index) {
  171. let slotValue = "";
  172. if (this.selectSelectDataMap[selectName] && this.selectSelectDataMap[selectName].length > 0) {
  173. this.selectSelectDataMap[selectName].forEach(item => {
  174. if (item.index == index) {
  175. slotValue = item.name;
  176. }
  177. });
  178. }
  179. return slotValue;
  180. },
  181. // 切换条数
  182. handleSizeChange(val) {
  183. this.paginationData.pageSize = val;
  184. this.onSubmit();
  185. },
  186. // 切换页
  187. handleCurrentChange(val) {
  188. this.paginationData.currentPage = val;
  189. this.onSubmit();
  190. },
  191. /**
  192. * 搜索条件拼接
  193. * @list 符合条件的值
  194. * @columnName 判断字段名
  195. * @whereStr 搜索条件字符串
  196. * */
  197. appendWhereStr(list, columnName) {
  198. // 搜索条件拼接
  199. let whereStr = "";
  200. if (list.length > 0) {
  201. whereStr += " or " + columnName + " in ('";
  202. list.forEach((item, index) => {
  203. if (list.length > index + 1) {
  204. whereStr += item + "','";
  205. } else {
  206. whereStr += item + "') ";
  207. }
  208. });
  209. }
  210. return whereStr;
  211. },
  212. /**
  213. * 判断已经存在的类型中的code
  214. * @keyName 类别名称
  215. * @listNmae 暂存结果对象
  216. */
  217. isIndexOfToList(keyName, listNmae) {
  218. if (this.allSearchColumn && this.selectSelectDataMap[keyName]) {
  219. this.selectSelectDataMap[keyName].forEach(item => {
  220. if (item.name == this.allSearchColumn) {
  221. listNmae.push(item.index);
  222. }
  223. });
  224. }
  225. },
  226. /**
  227. * 全字段模糊查询
  228. * 通过全表查询模拟分页
  229. * 查询出结果后自动得到下拉框中的联动
  230. * */
  231. onSubmit() {
  232. if (!this.tableInitLoading) {
  233. this.tableInitLoading = true;
  234. }
  235. // 创建搜索条件对象
  236. this.whereStr = "";
  237. // 存在明确条件时
  238. if (
  239. this.cProjectNameFilters[0] ||
  240. this.cProjectTypeStrFilters[0] ||
  241. this.cOwningStreetTownStrFilters[0] ||
  242. this.cYearFilters[0]
  243. ) {
  244. // 存在明确条件又存在模糊条件时
  245. let andWhereStr = "";
  246. let orWhereStr = "";
  247. // 项目名称
  248. if (this.cProjectNameFilters[0]) {
  249. andWhereStr += `and c_project_name = '${this.cProjectNameFilters[0]}' `;
  250. } else if (this.allSearchColumn) {
  251. orWhereStr += `or c_project_name like '%${this.allSearchColumn}%' `;
  252. }
  253. // 项目类型
  254. if (this.cProjectTypeStrFilters[0]) {
  255. andWhereStr += `and c_project_type = '${this.cProjectTypeStrFilters[0]}' `;
  256. } else if (this.allSearchColumn) {
  257. let c_bsjzwt = [];
  258. // 首先判断已经存在的类型中的code
  259. this.isIndexOfToList("associatedItems", c_bsjzwt);
  260. // 搜索条件拼接
  261. orWhereStr += this.appendWhereStr(c_bsjzwt, "c_owning_street_town");
  262. }
  263. // } else if (this.allSearchColumn) {
  264. // orWhereStr += `or c_project_type like '%${this.allSearchColumn}%' `;
  265. // }
  266. // 所属街道
  267. if (this.cOwningStreetTownStrFilters[0]) {
  268. andWhereStr += `and c_owning_street_town = '${this.cOwningStreetTownStrFilters[0]}' `;
  269. } else if (this.allSearchColumn) {
  270. let c_bsjzwt = [];
  271. // 首先判断已经存在的类型中的code
  272. this.isIndexOfToList("projectType", c_bsjzwt);
  273. // 搜索条件拼接
  274. orWhereStr += this.appendWhereStr(c_bsjzwt, "c_owning_street_town");
  275. }
  276. // 年份
  277. if (this.cYearFilters[0]) {
  278. andWhereStr += `and c_year = '${this.cYearFilters[0]}' `;
  279. } else if (this.allSearchColumn) {
  280. let c_zdsjsxwtList = [];
  281. if (this.filters.cYearFilters) {
  282. this.filters.cYearFilters.forEach((k, v) => {
  283. let keyStr = k.text + "";
  284. if (keyStr.indexOf(this.allSearchColumn) != -1) {
  285. c_zdsjsxwtList.push(k.text);
  286. }
  287. });
  288. }
  289. orWhereStr += this.appendWhereStr(c_zdsjsxwtList, "c_year");
  290. }
  291. // 格式化SQL语句
  292. if (orWhereStr) {
  293. this.whereStr = "where ";
  294. this.whereStr += andWhereStr.substring(3, andWhereStr.length);
  295. this.whereStr += " and(" + orWhereStr.substring(2, orWhereStr.length) + ") ";
  296. } else {
  297. this.whereStr = "where ";
  298. this.whereStr += andWhereStr.substring(3, andWhereStr.length);
  299. }
  300. this.whereStr += `;`;
  301. } else if (this.allSearchColumn) {
  302. // 不存在明确条件,只存在模糊条件时
  303. this.whereStr += `where c_project_name like '%${this.allSearchColumn}%' `;
  304. let c_zdsjsxwtList = [];
  305. if (this.filters.cYearFilters) {
  306. this.filters.cYearFilters.forEach((k, v) => {
  307. let keyStr = k.text + "";
  308. if (keyStr.indexOf(this.allSearchColumn) != -1) {
  309. c_zdsjsxwtList.push(k.text);
  310. }
  311. });
  312. this.whereStr += this.appendWhereStr(c_zdsjsxwtList, "c_year");
  313. }
  314. let c_bsjzwt = [];
  315. // 首先判断已经存在的类型中的code
  316. this.isIndexOfToList("project2Type", c_bsjzwt);
  317. // 搜索条件拼接
  318. this.whereStr += this.appendWhereStr(c_bsjzwt, "c_project_type");
  319. let c_owning_street_town = [];
  320. // 首先判断已经存在的类型中的code
  321. this.isIndexOfToList("projectType", c_owning_street_town);
  322. // 搜索条件拼接
  323. this.whereStr += this.appendWhereStr(c_owning_street_town, "c_owning_street_town");
  324. }
  325. // 创建FormData对象
  326. let params = new FormData();
  327. params = {
  328. columnId: 29,
  329. whereStr: this.whereStr
  330. };
  331. // 开始查询
  332. this.$Post(this.urlsCollection.getContentInfoWhere, params).then(
  333. res => {
  334. if (res.code === 200 && res.content && res.content.length > 0) {
  335. // 总数
  336. this.paginationData.total = res.content.length;
  337. // 每页显示数据个数
  338. // this.currentPageSize;
  339. this.tableData = res.content.slice(
  340. (this.paginationData.currentPage - 1) * this.paginationData.pageSize,
  341. this.paginationData.currentPage * this.paginationData.pageSize > this.paginationData.total
  342. ? this.paginationData.total
  343. : this.paginationData.currentPage * this.paginationData.pageSize
  344. );
  345. this.filters = {
  346. cProjectNameFilters: [],
  347. cProjectTypeStrFilters: [],
  348. cOwningStreetTownStrFilters: [],
  349. cYearFilters: []
  350. };
  351. let cProjectNameFilters = [];
  352. let cProjectTypeStrFilters = [];
  353. let cOwningStreetTownStrFilters = [];
  354. let cYearFilters = [];
  355. res.content.forEach(item => {
  356. if (cProjectNameFilters.indexOf(item.c_project_name) == -1) {
  357. cProjectNameFilters.push(item.c_project_name);
  358. }
  359. if (cProjectTypeStrFilters.indexOf(item.c_project_type) == -1) {
  360. cProjectTypeStrFilters.push(item.c_project_type);
  361. }
  362. if (cOwningStreetTownStrFilters.indexOf(item.c_owning_street_town) == -1) {
  363. cOwningStreetTownStrFilters.push(item.c_owning_street_town);
  364. }
  365. if (cYearFilters.indexOf(item.c_year) == -1) {
  366. cYearFilters.push(item.c_year);
  367. }
  368. });
  369. cProjectTypeStrFilters.forEach(item => {
  370. this.filters.cProjectTypeStrFilters.push({ text: this.getSelectByIndex("project2Type", item), value: item });
  371. });
  372. for (let index = 0; index < cYearFilters.length; index++) {
  373. for (let index2 = index; index2 < cYearFilters.length; index2++) {
  374. let syearsList = cYearFilters[index];
  375. let eyearsList = cYearFilters[index2];
  376. if (syearsList > eyearsList) {
  377. cYearFilters[index] = eyearsList;
  378. cYearFilters[index2] = syearsList;
  379. }
  380. }
  381. }
  382. cYearFilters.forEach(item => {
  383. this.filters.cYearFilters.push({ text: Number(item), value: Number(item) });
  384. });
  385. cProjectNameFilters.forEach(item => {
  386. this.filters.cProjectNameFilters.push({ text: item, value: item });
  387. });
  388. cOwningStreetTownStrFilters.forEach(item => {
  389. this.filters.cOwningStreetTownStrFilters.push({
  390. text: this.getSelectByIndex("associatedItems", item),
  391. value: item
  392. });
  393. });
  394. this.tableData.forEach(item => {
  395. item.c_task_type_str = this.getSelectByIndex("projectType", item.c_task_type);
  396. item.c_project_type_str = this.getSelectByIndex("project2Type", item.c_project_type);
  397. item.c_owning_street_town_str = this.getSelectByIndex("associatedItems", item.c_owning_street_town);
  398. });
  399. this.tableInitLoading = false;
  400. } else {
  401. this.paginationData.total = 0;
  402. this.tableInitLoading = false;
  403. this.tableData = [];
  404. }
  405. },
  406. error => {
  407. this.tableData = [];
  408. this.tableInitLoading = false;
  409. this.$message.error(error);
  410. }
  411. );
  412. },
  413. // 查询事件(废弃)
  414. onSubmitOld() {
  415. if (!this.tableInitLoading) {
  416. this.tableInitLoading = true;
  417. }
  418. let params = new FormData();
  419. params.append("columnId", "29");
  420. params.append("states", "2,3");
  421. params.append("pageSize", this.paginationData.pageSize);
  422. params.append("page", this.paginationData.currentPage - 1);
  423. let searchParam = [];
  424. if (this.formInline.c_task_type) {
  425. let param1 = {
  426. field: "c_task_type",
  427. searchType: "1",
  428. content: {
  429. value: this.formInline.c_task_type
  430. }
  431. };
  432. searchParam.push(param1);
  433. }
  434. if (this.formInline.c_owning_street_town) {
  435. let param1 = {
  436. field: "c_owning_street_town",
  437. searchType: "1",
  438. content: {
  439. value: this.formInline.c_owning_street_town
  440. }
  441. };
  442. searchParam.push(param1);
  443. }
  444. if (this.formInline.c_create_date) {
  445. let param1 = {
  446. field: "c_year",
  447. searchType: "1",
  448. content: {
  449. value: this.formInline.c_create_date - 0
  450. }
  451. };
  452. searchParam.push(param1);
  453. }
  454. params.append("search", JSON.stringify(searchParam));
  455. let sortparam = [{ field: "c_year", orderByType: 2 }];
  456. params.append("orderBy", JSON.stringify(sortparam));
  457. this.$Post(this.urlsCollection.selectContentList, params).then(
  458. res => {
  459. if (res.code === 200 && res.content.data.length > 0) {
  460. this.tableData = res.content.data;
  461. if (this.tableData.length > 0) {
  462. this.tableData.forEach(item => {
  463. item.c_task_type_str = this.getSelectByIndex("projectType", item.c_task_type);
  464. item.c_project_type_str = this.getSelectByIndex("project2Type", item.c_project_type);
  465. item.c_owning_street_town_str = this.getSelectByIndex("associatedItems", item.c_owning_street_town);
  466. });
  467. }
  468. this.tableInitLoading = false;
  469. this.paginationData.total = res.content.count;
  470. } else {
  471. this.tableData = [];
  472. this.tableInitLoading = false;
  473. this.$message.error(res.message);
  474. }
  475. },
  476. error => {
  477. this.tableData = [];
  478. this.tableInitLoading = false;
  479. this.$message.error(error);
  480. }
  481. );
  482. },
  483. // 查询条件重置
  484. resetForm() {
  485. this.formInline = {
  486. c_task_type: "",
  487. c_owning_street_town: "",
  488. c_create_date: ""
  489. };
  490. this.cProjectNameFilters = [];
  491. this.cProjectTypeStrFilters = [];
  492. this.cOwningStreetTownStrFilters = [];
  493. this.cYearFilters = [];
  494. this.onSubmit();
  495. },
  496. // 给每一行row的数据对象里添加index属性
  497. tableRowClassName({ row, rowIndex }) {
  498. row.index = rowIndex;
  499. },
  500. // 用户单击某行时触发操作
  501. rowClick(row, column, event) {
  502. // console.log(row,column,event);
  503. this.ToView(row.index);
  504. },
  505. // 查看
  506. ToView(index) {
  507. this.StepsMyBoxShowState = true;
  508. this.clickData = this.tableData[index];
  509. }
  510. }
  511. };
  512. </script>
  513. <style lang="less" scoped>
  514. #WholeProcessManagement {
  515. position: absolute;
  516. display: flex;
  517. background: #00274d;
  518. z-index: 999;
  519. margin-top: 60px;
  520. width: 100%;
  521. height: calc(100% - 60px);
  522. -moz-user-select: none;
  523. -webkit-user-select: none;
  524. -ms-user-select: none;
  525. -khtml-user-select: none;
  526. user-select: none;
  527. overflow: hidden;
  528. flex-direction: column;
  529. &-footer {
  530. width: 99%;
  531. margin: 0 auto;
  532. height: 10%;
  533. position: absolute;
  534. bottom: 10px;
  535. display: flex;
  536. align-items: center;
  537. justify-content: flex-end;
  538. }
  539. }
  540. </style>