index.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <!-- 救灾物资数量价值表 -->
  2. <template>
  3. <basic-container>
  4. <el-form class="whole_form">
  5. <el-row :gutter="20">
  6. <el-col :span="6">
  7. <el-form-item label="省份">
  8. <el-select v-model="searchList.provinceDeptIdList" clearable multiple @change="getSupplies">
  9. <el-option v-for="item in cityList" :key="item.deptId" :label="item.name" :value="item.deptId" />
  10. </el-select>
  11. </el-form-item>
  12. </el-col>
  13. <el-col :span="6">
  14. <el-form-item label="储备仓库">
  15. <el-select
  16. v-model="searchList.deptIdList"
  17. clearable
  18. multiple
  19. :disabled="searchList.provinceDeptIdList.length === 0"
  20. :placeholder="searchList.provinceDeptIdList.length === 0 ? '请先选择省份' : '请选择储备仓库'"
  21. >
  22. <el-option v-for="item in warehouseList" :key="item.deptId" :label="item.name" :value="item.deptId" />
  23. </el-select>
  24. </el-form-item>
  25. </el-col>
  26. <el-col :span="6">
  27. <el-form-item label="物资类别">
  28. <el-select v-model="searchList.dmUpcode1List" clearable multiple>
  29. <el-option v-for="item in suppliesList" :key="item.id" :label="item.name" :value="item.code" />
  30. </el-select>
  31. </el-form-item>
  32. </el-col>
  33. <el-col :span="6">
  34. <el-form-item label="物资名称">
  35. <el-input v-model="searchList.dmUpname2" clearable />
  36. </el-form-item>
  37. </el-col>
  38. </el-row>
  39. <el-row class="btn_center">
  40. <el-button type="primary" @click="getList">搜索</el-button>
  41. <el-button @click="clearSearch">清空</el-button>
  42. </el-row>
  43. </el-form>
  44. <el-table :data="tableData" stripe border :span-method="arraySpanMethod">
  45. <el-table-column type="index" label="序号" header-align="center" align="center" />
  46. <el-table-column prop="upidName" label="省份" header-align="center" align="center" />
  47. <el-table-column prop="username" label="储备仓库" header-align="center" align="center" />
  48. <template v-for="item in headerName" :key="item">
  49. <el-table-column :label="item.dmUpname" header-align="center" align="center">
  50. <template v-for="iten in item.children" :key="iten">
  51. <el-table-column :label="iten.dmUpname" header-align="center" align="center">
  52. <el-table-column :prop="iten.dmUpcode" :label="iten.units" header-align="center" align="center" />
  53. </el-table-column>
  54. </template>
  55. </el-table-column>
  56. </template>
  57. <el-table-column prop="tolNum" label="数量总计(件)" header-align="center" align="center" />
  58. <el-table-column prop="tolMoney" label="总价值(万元)" header-align="center" align="center" />
  59. </el-table>
  60. </basic-container>
  61. </template>
  62. <script setup lang="ts">
  63. import { ref } from "vue";
  64. import { handleTree } from "@/utils/util";
  65. import {
  66. getDroughtResistantHeader,
  67. getDroughtResistantList,
  68. getCityList,
  69. getSysTreeDict
  70. } from "@/api/dataStatistics/index";
  71. const headerName: any = ref([]);
  72. const headerProps: any = ref([]);
  73. const tableData: any = ref([]);
  74. const searchList: any = ref({});
  75. const mergeObj: any = ref({});
  76. const cityList: any = ref([]);
  77. const warehouseList: any = ref([]);
  78. const suppliesList: any = ref([]);
  79. // 获取省份列表
  80. getCityList({ deptType: 2 }).then((res: any) => {
  81. if (res.code === 0) {
  82. cityList.value = res.data;
  83. }
  84. });
  85. // 根据省份列表获取储备仓库
  86. const getSupplies = (value: string[]) => {
  87. getCityList({ parentIdList: value }).then((res: any) => {
  88. if (res.code === 0) {
  89. warehouseList.value = res.data;
  90. }
  91. });
  92. };
  93. // 获取物资类别
  94. getSysTreeDict({ type: 1, difference: 2, parentCodeList: ["300"] }).then((res: any) => {
  95. if (res.code === 0) {
  96. suppliesList.value = res.data;
  97. }
  98. });
  99. // 获取表头数据
  100. getDroughtResistantHeader({ matype1: ["300"] }).then((res: any) => {
  101. if (res.code === 0) {
  102. res.data
  103. .map((item: any) => {
  104. const parent = {
  105. dmUpcode: item.matypecode2,
  106. dmUpname: item.matypename2
  107. };
  108. const own = {
  109. dmUpcode: item.matypecode3,
  110. dmUpname: item.matypename3,
  111. units: item.matypename4
  112. };
  113. return [parent, own];
  114. })
  115. .forEach((item: any) => {
  116. headerName.value.push(...item);
  117. });
  118. headerName.value = handleTree(headerName.value, "dmUpcode");
  119. headerProps.value = res.data.map((item: any) => item.matypecode3);
  120. headerProps.value.unshift("upidName", "username");
  121. }
  122. getList();
  123. });
  124. // getSpanArr方法
  125. const getSpanArr = (data: any) => {
  126. headerProps.value.forEach((key: any) => {
  127. let count = 0; // 用来记录需要合并行的起始位置
  128. mergeObj.value[key] = []; // 记录每一列的合并信息
  129. data.forEach((item: any, index: number) => {
  130. // index == 0表示数据为第一行,直接 push 一个 1
  131. if (index === 0) {
  132. mergeObj.value[key].push(1);
  133. } else {
  134. // 判断当前行是否与上一行其值相等 如果相等 在 count 记录的位置其值 +1 表示当前行需要合并 并push 一个 0 作为占位
  135. if (item[key] === data[index - 1][key]) {
  136. mergeObj.value[key][count] += 1;
  137. mergeObj.value[key].push(0);
  138. } else {
  139. // 如果当前行和上一行其值不相等
  140. count = index; // 记录当前位置
  141. mergeObj.value[key].push(1); // 重新push 一个 1
  142. }
  143. }
  144. });
  145. });
  146. };
  147. // 获取表格数据
  148. const getList = () => {
  149. const data = {
  150. ...searchList.value,
  151. dmUpcode0List: ["300"]
  152. };
  153. getDroughtResistantList(data).then((res: any) => {
  154. if (res.code === 0) {
  155. tableData.value = res.data
  156. .map((item: any) => {
  157. const retVal: any = ref({
  158. ...item.map
  159. });
  160. retVal.value.upidName = item.upidName;
  161. retVal.value.username = item.username;
  162. retVal.value.tolMoney = item.tolMoney;
  163. retVal.value.tolNum = item.tolNum;
  164. return retVal.value;
  165. })
  166. .filter((item: any) => {
  167. headerProps.value.filter((ite: any) => {
  168. if (!item[ite]) {
  169. item[ite] = 0;
  170. }
  171. });
  172. return item;
  173. });
  174. getSpanArr(tableData.value);
  175. }
  176. });
  177. };
  178. const clearSearch = () => {
  179. searchList.value = {
  180. provinceDeptIdList: [],
  181. deptIdList: [],
  182. dmUpcode1List: [],
  183. dmUpname2: ""
  184. };
  185. getList();
  186. };
  187. const arraySpanMethod = ({ row, column, rowIndex, columnIndex }: any) => {
  188. // 判断列的属性
  189. if (headerProps.value.indexOf(column.property) !== -1) {
  190. // 判断其值是不是为0
  191. if (mergeObj.value[column.property][rowIndex]) {
  192. return [mergeObj.value[column.property][rowIndex], 1];
  193. } else {
  194. // 如果为0则为需要合并的行
  195. return [0, 0];
  196. }
  197. }
  198. };
  199. </script>