satisfaction.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. <template>
  2. <div class="judicial-statistics-satisfaction-container layout-pd">
  3. <!-- 搜索 -->
  4. <el-card shadow="never">
  5. <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
  6. <el-form-item label="回访时间段" prop="crTime">
  7. <el-date-picker
  8. v-model="state.queryParams.crTime"
  9. type="daterange"
  10. unlink-panels
  11. range-separator="至"
  12. start-placeholder="开始时间"
  13. end-placeholder="结束时间"
  14. :shortcuts="shortcuts"
  15. @change="handleQuery"
  16. value-format="YYYY-MM-DD"
  17. :clearable="false"
  18. />
  19. </el-form-item>
  20. <!-- <el-form-item label="类型" prop="TypeId">
  21. <el-select v-model="state.queryParams.TypeId" placeholder="类型" @change="handleQuery">
  22. <el-option label="办件结果" value="1" />
  23. <el-option label="办件态度" value="2" />
  24. </el-select>
  25. </el-form-item>-->
  26. <el-form-item>
  27. <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  28. <el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
  29. <SvgIcon name="ele-Refresh" class="mr5" />重置
  30. </el-button>
  31. </el-form-item>
  32. </el-form>
  33. </el-card>
  34. <el-card shadow="never">
  35. <ProTable
  36. ref="proTableRef"
  37. :columns="columns"
  38. :data="state.tableData"
  39. @updateTable="queryList"
  40. :loading="state.loading"
  41. show-summary
  42. border
  43. row-key="orgCode"
  44. :pagination="false"
  45. :summary-method="getSummaries"
  46. >
  47. <template #orgName="{ row }">
  48. <el-button link type="primary" @click="onDetailOrg(row)" v-if="!['市直合计', '区县合计'].includes(row.orgName)">{{
  49. row.orgName
  50. }}</el-button>
  51. <span v-else>{{ row.orgName }}</span>
  52. </template>
  53. <template #verySatisfiedCount="{ row }">
  54. <el-button
  55. link
  56. type="primary"
  57. @click="onDetail(row.verySatisfiedKey, row, '非常满意')"
  58. v-if="!['市直合计', '区县合计'].includes(row.orgName)"
  59. >{{ row.verySatisfiedCount }}</el-button
  60. >
  61. <span v-else>{{ row.verySatisfiedCount }}</span>
  62. </template>
  63. <template #satisfiedCount="{ row }">
  64. <el-button link type="primary" @click="onDetail(row.satisfiedKey, row, '满意')" v-if="!['市直合计', '区县合计'].includes(row.orgName)">{{
  65. row.satisfiedCount
  66. }}</el-button>
  67. <span v-else>{{ row.satisfiedCount }}</span>
  68. </template>
  69. <template #regardedAsSatisfiedCount="{ row }">
  70. <el-button
  71. link
  72. type="primary"
  73. @click="onDetail(row.regardedAsSatisfiedKey, row, '视为满意')"
  74. v-if="!['市直合计', '区县合计'].includes(row.orgName)"
  75. >{{ row.regardedAsSatisfiedCount }}</el-button
  76. >
  77. <span v-else>{{ row.regardedAsSatisfiedCount }}</span>
  78. </template>
  79. <template #defaultSatisfiedCount="{ row }">
  80. <el-button
  81. link
  82. type="primary"
  83. @click="onDetail(row.defaultSatisfiedKey, row, '默认满意')"
  84. v-if="!['市直合计', '区县合计'].includes(row.orgName)"
  85. >{{ row.defaultSatisfiedCount }}</el-button
  86. >
  87. <span v-else>{{ row.defaultSatisfiedCount }}</span>
  88. </template>
  89. <template #noSatisfiedCount="{ row }">
  90. <el-button
  91. link
  92. type="primary"
  93. @click="onDetail(row.noSatisfiedKey, row, '不满意')"
  94. v-if="!['市直合计', '区县合计'].includes(row.orgName)"
  95. >{{ row.noSatisfiedCount }}</el-button
  96. >
  97. <span v-else>{{ row.noSatisfiedCount }}</span>
  98. </template>
  99. <template #noEvaluateCount="{ row }">
  100. <el-button
  101. link
  102. type="primary"
  103. @click="onDetail(row.noEvaluateKey, row, '未作评价')"
  104. v-if="!['市直合计', '区县合计'].includes(row.orgName)"
  105. >{{ row.noEvaluateCount }}</el-button
  106. >
  107. <span v-else>{{ row.noEvaluateCount }}</span>
  108. </template>
  109. <template #noPutThroughCount="{ row }">
  110. <el-button
  111. link
  112. type="primary"
  113. @click="onDetail(row.noPutThroughKey, row, '未接通')"
  114. v-if="!['市直合计', '区县合计'].includes(row.orgName)"
  115. >{{ row.noPutThroughCount }}</el-button
  116. >
  117. <span v-else>{{ row.noPutThroughCount }}</span>
  118. </template>
  119. </ProTable>
  120. </el-card>
  121. </div>
  122. </template>
  123. <script setup lang="tsx" name="judicialStatisticsSatisfaction">
  124. import { onMounted, reactive, ref } from 'vue';
  125. import { FormInstance } from 'element-plus';
  126. import { shortcuts } from '@/utils/constants';
  127. import dayjs from 'dayjs';
  128. import { departmentSatisfaction } from '@/api/judicial';
  129. import { useRouter } from 'vue-router';
  130. // 定义变量内容
  131. const columns = ref<any>([
  132. { type: 'index', fixed: 'left', width: 55, label: '序号', align: 'center' },
  133. { prop: 'orgName', label: '部门名称', minWidth: 200 },
  134. { prop: 'orgTypeText', label: '部门类别', minWidth: 120 },
  135. { prop: 'totalSumCount', label: '小计' },
  136. {
  137. prop: 'totalSumRate',
  138. label: '总满意率',
  139. minWidth: 120,
  140. render: ({ row }) => {
  141. return `${row.totalSumRate}%`;
  142. },
  143. },
  144. { prop: 'verySatisfiedCount', label: '非常满意', minWidth: 120 },
  145. {
  146. prop: 'verySatisfiedRate',
  147. label: '非常满意率',
  148. minWidth: 120,
  149. render: ({ row }) => {
  150. return `${row.verySatisfiedRate}%`;
  151. },
  152. },
  153. { prop: 'satisfiedCount', label: '满意', minWidth: 120 },
  154. {
  155. prop: 'satisfiedRate',
  156. label: '满意率',
  157. minWidth: 120,
  158. render: ({ row }) => {
  159. return `${row.satisfiedRate}%`;
  160. },
  161. },
  162. { prop: 'regardedAsSatisfiedCount', label: '视为满意', minWidth: 120 },
  163. {
  164. prop: 'regardedAsSatisfiedRate',
  165. label: '视为满意率',
  166. minWidth: 120,
  167. render: ({ row }) => {
  168. return `${row.regardedAsSatisfiedRate}%`;
  169. },
  170. },
  171. { prop: 'defaultSatisfiedCount', label: '默认满意', minWidth: 120 },
  172. {
  173. prop: 'defaultSatisfiedRate',
  174. label: '默认满意率',
  175. minWidth: 120,
  176. render: ({ row }) => {
  177. return `${row.defaultSatisfiedRate}%`;
  178. },
  179. },
  180. { prop: 'noSatisfiedCount', label: '不满意', minWidth: 120 },
  181. {
  182. prop: 'noSatisfiedRate',
  183. label: '不满意率',
  184. minWidth: 120,
  185. render: ({ row }) => {
  186. return `${row.noSatisfiedRate}%`;
  187. },
  188. },
  189. { prop: 'noEvaluateCount', label: '未作评价', minWidth: 120 },
  190. {
  191. prop: 'noEvaluateRate',
  192. label: '未作评价率',
  193. minWidth: 120,
  194. render: ({ row }) => {
  195. return `${row.noEvaluateRate}%`;
  196. },
  197. },
  198. { prop: 'noPutThroughCount', label: '未接通', minWidth: 120 },
  199. {
  200. prop: 'noPutThroughRate',
  201. label: '未接通率',
  202. minWidth: 120,
  203. render: ({ row }) => {
  204. return `${row.noPutThroughRate}%`;
  205. },
  206. },
  207. ]);
  208. const ruleFormRef = ref<RefType>(); // 表单ref
  209. const state = reactive({
  210. queryParams: {
  211. // 查询条件
  212. crTime: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')], // 时间默认今天开始到今天结束
  213. TypeId: '1',
  214. },
  215. tableData: [],
  216. loading: false, // 加载
  217. total: 0, // 总数
  218. totalCount: {},
  219. });
  220. /** 搜索按钮操作 */
  221. const handleQuery = () => {
  222. // state.queryParams.PageIndex = 1;
  223. queryList();
  224. };
  225. /** 获取列表 */
  226. const queryList = () => {
  227. state.loading = true;
  228. let StartDate = null;
  229. let EndDate = null;
  230. if (state.queryParams?.crTime) {
  231. StartDate = state.queryParams?.crTime[0];
  232. EndDate = state.queryParams?.crTime[1];
  233. }
  234. const request = {
  235. StartDate,
  236. EndDate,
  237. TypeId: '1',
  238. };
  239. departmentSatisfaction(request)
  240. .then((res: any) => {
  241. state.tableData = res.result?.dataList ?? [];
  242. /* if (res.result.dataList.length) {
  243. state.tableData.push(res.result.citySumModel);
  244. state.tableData.push(res.result.countySumModel);
  245. }*/
  246. state.totalCount = res.result.sumModel;
  247. state.loading = false;
  248. })
  249. .catch(() => {
  250. state.loading = false;
  251. });
  252. };
  253. /** 重置按钮操作 */
  254. const resetQuery = (formEl: FormInstance | undefined) => {
  255. if (!formEl) return;
  256. formEl.resetFields();
  257. queryList();
  258. };
  259. // 合计
  260. const getSummaries = (param: any) => {
  261. const { columns } = param;
  262. const sums: string[] = [];
  263. columns.forEach((column: { property: string }, index: number) => {
  264. if (index === 0) {
  265. sums[index] = '合计';
  266. return;
  267. }
  268. switch (column.property) {
  269. case 'totalSumCount':
  270. sums[index] = state.totalCount?.totalSumCount;
  271. break;
  272. case 'totalSumRate':
  273. sums[index] = `${state.totalCount?.totalSumRate}%`;
  274. break;
  275. case 'verySatisfiedCount':
  276. sums[index] = state.totalCount?.verySatisfiedCount;
  277. break;
  278. case 'verySatisfiedRate':
  279. sums[index] = `${state.totalCount?.verySatisfiedRate}%`;
  280. break;
  281. case 'satisfiedCount':
  282. sums[index] = state.totalCount?.satisfiedCount;
  283. break;
  284. case 'satisfiedRate':
  285. sums[index] = `${state.totalCount?.satisfiedRate}%`;
  286. break;
  287. case 'regardedAsSatisfiedCount':
  288. sums[index] = state.totalCount?.regardedAsSatisfiedCount;
  289. break;
  290. case 'regardedAsSatisfiedRate':
  291. sums[index] = `${state.totalCount?.regardedAsSatisfiedRate}%`;
  292. break;
  293. case 'defaultSatisfiedCount':
  294. sums[index] = state.totalCount?.defaultSatisfiedCount;
  295. break;
  296. case 'defaultSatisfiedRate':
  297. sums[index] = `${state.totalCount?.defaultSatisfiedRate}%`;
  298. break;
  299. case 'noSatisfiedCount':
  300. sums[index] = state.totalCount?.noSatisfiedCount;
  301. break;
  302. case 'noSatisfiedRate':
  303. sums[index] = `${state.totalCount?.noSatisfiedRate}%`;
  304. break;
  305. case 'noEvaluateCount':
  306. sums[index] = state.totalCount?.noEvaluateCount;
  307. break;
  308. case 'noEvaluateRate':
  309. sums[index] = `${state.totalCount?.noEvaluateRate}%`;
  310. break;
  311. case 'noPutThroughCount':
  312. sums[index] = state.totalCount?.noPutThroughCount;
  313. break;
  314. case 'noPutThroughRate':
  315. sums[index] = `${state.totalCount?.noPutThroughRate}%`;
  316. break;
  317. default:
  318. sums[index] = '';
  319. break;
  320. }
  321. });
  322. return sums;
  323. };
  324. // 点击部门名称
  325. const onDetailOrg = (row: any) => {
  326. let StartDate = null;
  327. let EndDate = null;
  328. if (state.queryParams?.crTime) {
  329. StartDate = state.queryParams?.crTime[0];
  330. EndDate = state.queryParams?.crTime[1];
  331. }
  332. router.push({
  333. name: 'judicialStatisticsDetailSatisfiedOrg',
  334. state: {
  335. StartDate,
  336. EndDate,
  337. TypeId: state.queryParams.TypeId,
  338. },
  339. params: {
  340. id: row.orgCode,
  341. },
  342. });
  343. };
  344. // 点击数字
  345. const router = useRouter();
  346. const onDetail = (key: string, row, type: string) => {
  347. let StartDate = null;
  348. let EndDate = null;
  349. if (state.queryParams?.crTime) {
  350. StartDate = state.queryParams?.crTime[0];
  351. EndDate = state.queryParams?.crTime[1];
  352. }
  353. router.push({
  354. name: 'judicialStatisticsDetailSatisfied',
  355. params: {
  356. id: row.orgCode
  357. },
  358. state: {
  359. StartDate,
  360. EndDate,
  361. DateValue: key,
  362. TypeId: state.queryParams.TypeId,
  363. },
  364. });
  365. };
  366. onMounted(() => {
  367. queryList();
  368. });
  369. </script>