platformReport.vue 17 KB

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