shSatisfied.vue 12 KB

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