platformReport.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. <template>
  2. <PageMain class="vh100">
  3. <el-tabs v-model="activeName" style="height: 100%" class="demo-tabs" @tab-click="handleClick">
  4. <!-- <el-tab-pane style="height: 100%" name="1" label="保险公司报表">
  5. <el-form v-model="recordForm" label-width="120">
  6. <el-row :gutter="20">
  7. <el-col :span="8">
  8. <el-form-item prop="a" label="保险公司">
  9. <el-select v-model="recordForm.companyId" placeholder="请选择" clearable filterable>
  10. <el-option v-for="item in companyList" :key="item.id" :value="item.id" :label="item.name"></el-option>
  11. </el-select>
  12. </el-form-item>
  13. </el-col>
  14. <el-col :span="8">
  15. <el-form-item prop="contactPerson" label="对接人">
  16. <el-input v-model="recordForm.contactPerson" placeholder="请输入"></el-input>
  17. </el-form-item>
  18. </el-col>
  19. <el-col :span="8">
  20. <el-form-item prop="contactPersonPhone" label="对接人手机号">
  21. <el-input v-model="recordForm.contactPersonPhone" placeholder="请输入"></el-input>
  22. </el-form-item>
  23. </el-col>
  24. <el-col :span="8">
  25. <el-form-item prop="time" label="创建时间">
  26. <el-date-picker v-model="recordForm.time" type="daterange" format="YYYY-MM-DD"
  27. value-format="YYYY-MM-DD" />
  28. </el-form-item>
  29. </el-col>
  30. <el-col :span="8">
  31. <el-form-item prop="time" label="结算时间">
  32. <el-date-picker v-model="recordForm.settlementTime" type="daterange" format="YYYY-MM-DD"
  33. value-format="YYYY-MM-DD" />
  34. </el-form-item>
  35. </el-col>
  36. <el-col :span="8">
  37. <el-form-item prop="status" label="结算状态">
  38. <el-select v-model="recordForm.status">
  39. <el-option v-for="item in optionObj['settlement_status']" :key="item.value" :value="item.value"
  40. :label="item.label"></el-option>
  41. </el-select>
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="24" style="height: 50px; display: flex; align-items: start; justify-content: flex-end">
  45. <el-button type="primary" @click="initData1()">查询</el-button>
  46. <el-button plain type="primary" @click="handleReset(1)">重置</el-button>
  47. </el-col>
  48. </el-row>
  49. </el-form>
  50. <el-table height="calc(100% - 190px)" :data="recordData" row-key="companyId"
  51. :summary-method="val => getSummaries(val)" show-summary>
  52. <el-table-column prop="companyName" label="保险公司" width="240"></el-table-column>
  53. <el-table-column prop="contactPerson" label="对接人" width="240"></el-table-column>
  54. <el-table-column prop="contactPersonPhone" label="对接人手机号" width="240"></el-table-column>
  55. <el-table-column prop="totalReceivable" label="应收金额" width="240"></el-table-column>
  56. <el-table-column prop="totalSettlementAmount" label="已结算" width="200"></el-table-column>
  57. <el-table-column prop="totalUnSettlementAmount" label="未结算" width="200"></el-table-column>
  58. <el-table-column prop="totalPaymentDifference" label="回款差额" width="200"></el-table-column>
  59. <el-table-column label="操作" fixed="right" width="120">
  60. <template #default="scope">
  61. <el-button link type="primary" @click="handleSettlementDetail(scope.row)">查看明细</el-button>
  62. </template>
  63. </el-table-column>
  64. </el-table>
  65. </el-tab-pane> -->
  66. <el-tab-pane style="height: 100%" name="2" label="对接人结算报表">
  67. <el-form v-model="recordForm1" label-width="120">
  68. <el-row :gutter="20">
  69. <el-col :span="8">
  70. <el-form-item prop="receiver" label="对接人">
  71. <el-input v-model="recordForm1.receiver"></el-input>
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="8">
  75. <el-form-item prop="settlementTime" label="结算时间">
  76. <el-date-picker v-model="recordForm1.settlementTime" type="daterange" format="YYYY-MM-DD"
  77. value-format="YYYY-MM-DD" />
  78. </el-form-item>
  79. </el-col>
  80. <el-col :span="8">
  81. <el-form-item prop="settlementStatus" label="结算状态">
  82. <el-select v-model="recordForm1.settlementStatus" placeholder="请选择">
  83. <el-option :value="0" label="未结清"></el-option>
  84. <el-option :value="1" label="已结清"></el-option>
  85. </el-select>
  86. </el-form-item>
  87. </el-col>
  88. <el-col :span="24" style="height: 50px; display: flex; align-items: start; justify-content: flex-end">
  89. <el-button type="primary" @click="initData2()">查询</el-button>
  90. <el-button plain type="primary" @click="handleReset(2)">重置</el-button>
  91. <el-button type="primary" @click="handleExport">导出结算记录</el-button>
  92. </el-col>
  93. </el-row>
  94. </el-form>
  95. <el-table height="calc(100% - 142px)" :data="recordData1" show-summary
  96. :summary-method="val => getSummaries(val, ['totalReceivable', 'settledAmount', 'unSettledAmount'])">
  97. <el-table-column prop="receiver" label="对接人"></el-table-column>
  98. <el-table-column prop="totalReceivable" label="应收总计"></el-table-column>
  99. <el-table-column prop="settledAmount" label="已结算总计"></el-table-column>
  100. <el-table-column prop="unSettledAmount" label="未结算总计"></el-table-column>
  101. <el-table-column prop="totalPaymentDifference" label="回款差额"></el-table-column>
  102. </el-table>
  103. <div class="pagination">
  104. <el-pagination v-model:current-page="pages" v-model:page-size="size" :page-sizes="[10, 20, 30, 40]"
  105. layout="total, sizes, prev, pager, next, jumper" :total="total1" @size-change="handleSizeChange"
  106. @current-change="handleCurrentChange"></el-pagination>
  107. </div>
  108. </el-tab-pane>
  109. <el-tab-pane style="height: 100%" name="3" label="车险结算明细">
  110. <el-form v-model="recordForm2" label-width="120">
  111. <el-row :gutter="20">
  112. <el-col :span="8">
  113. <el-form-item prop="settlementId" label="结算记录编号">
  114. <el-input v-model="recordForm2.settlementId"></el-input>
  115. </el-form-item>
  116. </el-col>
  117. <el-col :span="8">
  118. <el-form-item prop="contactPerson" label="对接人">
  119. <el-input v-model="recordForm2.contactPerson"></el-input>
  120. </el-form-item>
  121. </el-col>
  122. <el-col :span="8">
  123. <el-form-item prop="companyId" label="保险公司">
  124. <el-select v-model="recordForm2.companyId" placeholder="请选择" clearable filterable>
  125. <el-option v-for="item in companyList" :key="item.id" :value="item.id" :label="item.name"></el-option>
  126. </el-select>
  127. </el-form-item>
  128. </el-col>
  129. <el-col :span="8">
  130. <el-form-item prop="settlementPerson" label="结算人">
  131. <el-input v-model="recordForm2.settlementPerson"></el-input>
  132. </el-form-item>
  133. </el-col>
  134. <el-col :span="8">
  135. <el-form-item prop="settlementTime" label="结算时间">
  136. <el-date-picker v-model="recordForm.settlementTime" type="daterange" format="YYYY-MM-DD"
  137. value-format="YYYY-MM-DD" />
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="8">
  141. <el-form-item prop="status" label="状态">
  142. <el-select v-model="recordForm2.status">
  143. <el-option value="0" label="未结算"></el-option>
  144. <el-option value="1" label="已结算"></el-option>
  145. <el-option value=" " label="全部"></el-option>
  146. </el-select>
  147. </el-form-item>
  148. </el-col>
  149. <el-col :span="24" style="height: 50px; display: flex; align-items: start; justify-content: flex-end">
  150. <el-button type="primary" @click="initData3(['1'])">查询</el-button>
  151. <el-button plain type="primary" @click="handleReset(3)">重置</el-button>
  152. <el-button type="primary" @click="handleExport1">导出明细</el-button>
  153. </el-col>
  154. </el-row>
  155. </el-form>
  156. <el-table height="calc(100% - 192px)" :data="recordData2" show-summary
  157. :summary-method="val => getSummaries(val, ['receivableSuperviseCosts', 'jqPremium', 'syPremium', 'jyPremium', 'taxPremium', 'jqSuperviseCostsProportion', 'sySuperviseCostsProportion', 'jySuperviseCostsProportion'])">
  158. <el-table-column prop="settlementId" label="结算记录编号" width="200"></el-table-column>
  159. <el-table-column prop="companyName" label="保险公司" width="200"></el-table-column>
  160. <el-table-column prop="contactPerson" label="对接人" width="150"></el-table-column>
  161. <el-table-column prop="signingTime" label="签单时间" width="150"></el-table-column>
  162. <el-table-column prop="licenseNo" label="车牌号" width="150"></el-table-column>
  163. <el-table-column prop="productName" label="险种" width="150"></el-table-column>
  164. <el-table-column prop="receivableSuperviseCosts" label="应收金额" width="150"></el-table-column>
  165. <el-table-column prop="jqPremium" label="交强险保费" width="150"></el-table-column>
  166. <el-table-column prop="taxPremium" label="车船税" width="150"></el-table-column>
  167. <el-table-column prop="jqSuperviseCostsProportion" label="交强险手续费比例" width="150"></el-table-column>
  168. <el-table-column prop="jqOtherCostsProportion" label="交强险跟单费比例" width="150"></el-table-column>
  169. <el-table-column prop="syPremium" label="商业险保费" width="150"></el-table-column>
  170. <el-table-column prop="sySuperviseCostsProportion" label="商业险手续费比例" width="150"></el-table-column>
  171. <el-table-column prop="syOtherCostsProportion" label="商业险跟单费比例" width="150"></el-table-column>
  172. <el-table-column prop="jyPremium" label="非车险保费" width="150"></el-table-column>
  173. <el-table-column prop="jySuperviseCostsProportion" label="非车险手续费比例" width="150"></el-table-column>
  174. <el-table-column prop="jyOtherCostsProportion" label="非车险跟单费比例" width="150"></el-table-column>
  175. <el-table-column prop="a" label="交强险保单号" width="150"></el-table-column>
  176. <el-table-column prop="a" label="商业险保单号" width="150"></el-table-column>
  177. <el-table-column prop="settlementPerson" label="结算人" width="150"></el-table-column>
  178. <el-table-column prop="settlementTime" label="结算时间" width="150"></el-table-column>
  179. </el-table>
  180. <div class="pagination">
  181. <el-pagination v-model:current-page="pages" v-model:page-size="size" :page-sizes="[10, 20, 30, 40]"
  182. layout="total, sizes, prev, pager, next, jumper" :total="total2" @size-change="handleSizeChange"
  183. @current-change="handleCurrentChange"></el-pagination>
  184. </div>
  185. </el-tab-pane>
  186. </el-tabs>
  187. </PageMain>
  188. </template>
  189. <script setup lang="ts">
  190. import api from '@/api'
  191. import { useRoute, useRouter } from 'vue-router';
  192. const route = useRoute();
  193. const router = useRouter();
  194. // 结算记录
  195. let recordForm = ref({})
  196. let recordForm1 = ref({
  197. settlementStatus: '',
  198. })
  199. let recordForm2 = ref({})
  200. let recordData = ref([])
  201. let recordData1 = ref([])
  202. let recordData2 = ref([])
  203. let activeName = ref('2')
  204. const handleClick = (e) => {
  205. pages.value = 1
  206. size.value = 10
  207. switch (e.props.name) {
  208. case '1':
  209. initData1()
  210. break;
  211. case '2':
  212. initData2()
  213. break;
  214. case '3':
  215. initData3()
  216. break;
  217. }
  218. }
  219. // 保险公司
  220. let companyList = ref([])
  221. const initCompany = () => {
  222. api.insuranceApi.leftList('').then((res: any) => {
  223. if (res.code == 200) {
  224. companyList.value = res.data
  225. }
  226. })
  227. }
  228. // 分页
  229. let pages = ref(1)
  230. let size = ref(10)
  231. let total = ref(0)
  232. let total1 = ref(0)
  233. let total2 = ref(0)
  234. const handleSizeChange = (size) => {
  235. size.value = size
  236. }
  237. const handleCurrentChange = (page) => {
  238. pages.value = page
  239. }
  240. const getSummaries = (param, list) => {
  241. console.log(param)
  242. const { columns, data } = param
  243. const sums: (string | VNode)[] = []
  244. // 指定需要计算的字段列表(可根据需求添加字段名)
  245. const specifiedFields = list || [] // 替换为您需要的字段名
  246. columns.forEach((column, index) => {
  247. if (index === 0) {
  248. sums[index] = h('div', { style: { textDecoration: 'underline' } }, [
  249. '',
  250. ])
  251. return
  252. }
  253. // 计算数字类型字段和指定字段
  254. const values = data.map((item) => {
  255. const val = item[column.property]
  256. // 排除空值
  257. if (val === '' || val === null || val === undefined) {
  258. return NaN
  259. }
  260. // 如果是数字类型,直接参与计算
  261. if (typeof val === 'number') {
  262. return val
  263. }
  264. // 如果字段在指定列表中,尝试转换为数字
  265. if (specifiedFields.includes(column.property)) {
  266. const num = Number(val)
  267. return Number.isNaN(num) ? NaN : num
  268. }
  269. // 其他情况不参与计算
  270. return NaN
  271. })
  272. if (!values.every((value) => Number.isNaN(value))) {
  273. const total = values.reduce((prev, curr) => {
  274. if (!Number.isNaN(curr)) {
  275. return prev + curr
  276. } else {
  277. return prev
  278. }
  279. }, 0)
  280. // 保留五位小数
  281. sums[index] = ` ${total.toFixed(5)}`
  282. } else {
  283. sums[index] = '-'
  284. }
  285. })
  286. return sums
  287. }
  288. const initData1 = () => {
  289. api.settlementApi.platformCompanySuperviseSettlementReport({
  290. companyId: recordForm.value.companyId,
  291. startTime: recordForm.value.time?.[0],
  292. endTime: recordForm.value.time?.[1],
  293. settlementStartTime: recordForm.value.settlementTime?.[0],
  294. settlementEndTime: recordForm.value.settlementTime?.[1],
  295. status: recordForm.value.status,
  296. contactPerson: recordForm.value.contactPerson,
  297. contactPersonPhone: recordForm.value.contactPersonPhone,
  298. agreementType: '1'
  299. }).then((res: any) => {
  300. if (res.code == 200) {
  301. recordData.value = res.data
  302. }
  303. })
  304. }
  305. const initData2 = () => {
  306. api.settlementApi.receiverSettlementReport({
  307. receiver: recordForm1.value.receiver,
  308. companyId: recordForm1.value.companyId,
  309. invoiceParty: recordForm1.value.invoiceParty,
  310. invoiceType: recordForm1.value.invoiceType,
  311. status: recordForm1.value.status,
  312. settlementPerson: recordForm1.value.settlementPerson,
  313. invoiceId: recordForm1.value.invoiceId,
  314. startTime: recordForm1.value.settlementTime?.[0],
  315. endTime: recordForm1.value.settlementTime?.[1],
  316. pages: pages.value,
  317. size: size.value,
  318. settlementStatus: recordForm1.value.settlementStatus,
  319. invoiceTypes: ['5', '6']
  320. }).then((res: any) => {
  321. if (res.code == 200) {
  322. recordData1.value = res.data.records
  323. total1.value = res.data.total
  324. }
  325. })
  326. }
  327. const initData3 = () => {
  328. api.settlementApi.superviseSettlementDetailExcel({
  329. ...recordForm2.value,
  330. settlementTimeStart: recordForm2.value.settlementTime?.[0],
  331. settlementTimeEnd: recordForm2.value.settlementTime?.[1],
  332. pages: pages.value,
  333. size: size.value,
  334. status: recordForm2.value.status,
  335. invoiceTypes: ['5', '6'],
  336. agreementType: '1'
  337. }).then((res: any) => {
  338. if (res.code == 200) {
  339. recordData2.value = res.data.records
  340. total2.value = res.data.total
  341. }
  342. })
  343. }
  344. const handleSearch = (type) => {
  345. switch (type) {
  346. case 1:
  347. recordForm.value = {
  348. companyId: '',
  349. time: [],
  350. status: ''
  351. }
  352. break;
  353. case 2:
  354. recordForm1.value = {
  355. settlementId: '',
  356. companyId: '',
  357. invoiceParty: '',
  358. invoiceType: '',
  359. status: '',
  360. settlementPerson: '',
  361. settlementTime: [],
  362. invoiceId: ''
  363. }
  364. break;
  365. case 3:
  366. recordForm2.value = {
  367. invoiceId: '',
  368. companyId: '',
  369. invoiceParty: '',
  370. settlementPerson: '',
  371. settlementTime: [],
  372. status: ''
  373. }
  374. break;
  375. }
  376. }
  377. const handleReset = (type) => {
  378. }
  379. const handleExport = () => {
  380. api.settlementApi.exportReceiverSettlementReportExcel({
  381. }).then((res: any) => {
  382. const blob = new Blob([res], { type: 'application/vnd.ms-excel' });
  383. const fileName = '平台对接人结算报表' + new Date().getTime() + '.xlsx';
  384. if ('download' in document.createElement('a')) {
  385. const elink = document.createElement('a');
  386. elink.download = fileName;
  387. elink.style.display = 'none';
  388. elink.href = URL.createObjectURL(blob);
  389. document.body.appendChild(elink);
  390. elink.click();
  391. URL.revokeObjectURL(elink.href);
  392. document.body.removeChild(elink);
  393. } else {
  394. navigator.msSaveBlob(blob, fileName);
  395. }
  396. })
  397. }
  398. const handleExport1 = () => {
  399. api.financeApi.exportSuperviseExcel({
  400. agreementType: '1'
  401. }).then((res: any) => {
  402. const blob = new Blob([res], { type: 'application/vnd.ms-excel' });
  403. const fileName = '平台协议应收明细' + new Date().getTime() + '.xlsx';
  404. if ('download' in document.createElement('a')) {
  405. const elink = document.createElement('a');
  406. elink.download = fileName;
  407. elink.style.display = 'none';
  408. elink.href = URL.createObjectURL(blob);
  409. document.body.appendChild(elink);
  410. elink.click();
  411. URL.revokeObjectURL(elink.href);
  412. document.body.removeChild(elink);
  413. } else {
  414. navigator.msSaveBlob(blob, fileName);
  415. }
  416. })
  417. }
  418. const optionObj = ref({})
  419. const initOption = () => {
  420. let list = ['settlement_status']
  421. list.forEach(item => {
  422. api.additionalApi.dictDetails(item).then((res: any) => {
  423. if (res.code == 200) {
  424. if (res.data) {
  425. optionObj.value[item] = res.data
  426. }
  427. }
  428. })
  429. })
  430. }
  431. const handleSettlementDetail = (row) => {
  432. activeName.value = '3'
  433. recordForm2.value.companyId = row.companyId
  434. initData3()
  435. }
  436. onMounted(() => {
  437. if (route.query.activeName === '3') {
  438. recordForm2.value.settlementId = route.query.settlementId
  439. activeName.value = '3'
  440. initData3();
  441. } else {
  442. initData2();
  443. }
  444. initCompany();
  445. initOption();
  446. })
  447. </script>
  448. <style scoped lang="scss">
  449. .pagination {
  450. margin-top: 10px;
  451. display: flex;
  452. justify-content: flex-end;
  453. }
  454. :deep(.subTable .el-table__header-wrapper) {
  455. display: none;
  456. }
  457. </style>