documentaryReport.vue 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  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-cascader filterable clearable placeholder="请选择" v-model="recordForm.companyId"
  10. :options="companyList" :props="companyIdprops" style="width: 100%;" @change="handleCompanyChange" />
  11. </el-form-item>
  12. </el-col>
  13. <el-col :span="8">
  14. <el-form-item prop="time" label="创建时间">
  15. <el-date-picker v-model="recordForm.time" type="daterange" format="YYYY-MM-DD"
  16. value-format="YYYY-MM-DD" />
  17. </el-form-item>
  18. </el-col>
  19. <el-col :span="8">
  20. <el-form-item prop="time" label="开票时间">
  21. <el-date-picker v-model="recordForm.invoiceTime" type="daterange" format="YYYY-MM-DD"
  22. value-format="YYYY-MM-DD" />
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="8">
  26. <el-form-item prop="time" label="结算时间">
  27. <el-date-picker v-model="recordForm.settlementTime" type="daterange" format="YYYY-MM-DD"
  28. value-format="YYYY-MM-DD" />
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="8">
  32. <el-form-item prop="status" label="结算状态">
  33. <el-select v-model="recordForm.status" clearable>
  34. <el-option v-for="item in settlement_status" :key="item.value" :value="item.value"
  35. :label="item.label"></el-option>
  36. </el-select>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="8">
  40. <el-form-item prop="invoiceRiskType" label="应收项">
  41. <el-select v-model="recordForm.invoiceRiskType" clearable>
  42. <el-option value="2" label="车险"></el-option>
  43. <el-option value="4" label="非车险"></el-option>
  44. </el-select>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="8">
  48. <el-form-item prop="signingTime" label="签单时间">
  49. <el-date-picker v-model="recordForm.signingTime" type="monthrange" format="YYYY-MM"
  50. value-format="YYYY-MM" />
  51. </el-form-item>
  52. </el-col>
  53. <el-col :span="24" style="height: 50px; display: flex; align-items: start; justify-content: flex-end">
  54. <el-button type="primary" @click="handleSearch(1)">查询</el-button>
  55. <el-button plain type="primary" @click="handleReset(1)">重置</el-button>
  56. </el-col>
  57. </el-row>
  58. </el-form>
  59. <el-table height="500px" :data="recordData" row-key="id"
  60. :summary-method="val => getSummaries(val, ['totalSettlementAmount'])" show-summary>
  61. <el-table-column prop="companyName" label="保险公司" width="300"></el-table-column>
  62. <el-table-column prop="totalReceivable" label="跟单费金额"></el-table-column>
  63. <el-table-column prop="totalReconciliationAmount" label="对账金额"></el-table-column>
  64. <el-table-column prop="year" label="年"></el-table-column>
  65. <el-table-column prop="month" label="月"></el-table-column>
  66. <el-table-column prop="totalInvoiced" label="已开票"></el-table-column>
  67. <el-table-column prop="totalSettlementAmount" label="已结算"></el-table-column>
  68. <el-table-column prop="totalUnSettlementAmount" label="未结算"></el-table-column>
  69. <el-table-column prop="totalUnInvoiced" label="未开票"></el-table-column>
  70. <el-table-column prop="invoiceRiskType" label="应收项">
  71. <template #default="scope">
  72. {{ scope.row.invoiceType == 2 ? '车险' : '非车险' }}
  73. </template>
  74. </el-table-column>
  75. <el-table-column prop="totalPaymentDifference" label="回款差额"></el-table-column>
  76. <el-table-column label="操作" fixed="right" width="120">
  77. <template #default="scope">
  78. <div class="flex a-c">
  79. <el-dropdown placement="bottom-start" trigger="click">
  80. <span class="el-dropdown-link">
  81. 查看明细
  82. </span>
  83. <template #dropdown>
  84. <el-dropdown-menu>
  85. <el-dropdown-item @click="handleSettlementDetail(scope.row)">结算明细</el-dropdown-item>
  86. <el-dropdown-item @click="handleInvoiceRecord(scope.row)">开票明细</el-dropdown-item>
  87. </el-dropdown-menu>
  88. </template>
  89. </el-dropdown>
  90. </div>
  91. </template>
  92. </el-table-column>
  93. </el-table>
  94. </el-tab-pane>
  95. <el-tab-pane style="height: 100%" name="2" label="结算记录">
  96. <el-form v-model="recordForm1" label-width="120">
  97. <el-row :gutter="20">
  98. <el-col :span="8">
  99. <el-form-item prop="settlementId" label="结算记录编号">
  100. <el-input v-model="recordForm1.settlementId"></el-input>
  101. </el-form-item>
  102. </el-col>
  103. <el-col :span="8">
  104. <el-form-item prop="a" label="保险公司">
  105. <el-cascader filterable clearable placeholder="请选择" v-model="recordForm1.partnerCompanyId"
  106. :options="companyList" :props="companyIdprops" style="width: 100%;" @change="handleCompanyChange" />
  107. </el-form-item>
  108. </el-col>
  109. <el-col :span="8">
  110. <el-form-item prop="invoiceParty" label="开票方">
  111. <el-select v-model="recordForm1.invoiceParty" clearable>
  112. <el-option v-for="item in optionObj['invoice_party']" :key="item.value" :value="item.value"
  113. :label="item.label"></el-option>
  114. </el-select>
  115. </el-form-item>
  116. </el-col>
  117. <el-col :span="8">
  118. <el-form-item prop="invoiceRiskType" label="应收项">
  119. <el-select v-model="recordForm1.invoiceRiskType" clearable>
  120. <el-option v-for="item in optionObj['invoice_risk_type']" :key="item.value" :value="item.value"
  121. :label="item.label"></el-option>
  122. </el-select>
  123. </el-form-item>
  124. </el-col>
  125. <el-col :span="8">
  126. <el-form-item prop="status" label="结算状态">
  127. <el-select v-model="recordForm1.status" clearable>
  128. <el-option v-for="item in settlement_status" :key="item.value" :value="item.value"
  129. :label="item.label"></el-option>
  130. </el-select>
  131. </el-form-item>
  132. </el-col>
  133. <el-col :span="8">
  134. <el-form-item prop="settlementPerson" label="结算人">
  135. <el-input v-model="recordForm1.settlementPerson"></el-input>
  136. </el-form-item>
  137. </el-col>
  138. <el-col :span="8">
  139. <el-form-item prop="settlementTime" label="结算时间">
  140. <el-date-picker v-model="recordForm1.settlementTime" type="daterange" format="YYYY-MM-DD"
  141. value-format="YYYY-MM-DD" />
  142. </el-form-item>
  143. </el-col>
  144. <el-col :span="8">
  145. <el-form-item prop="invoiceId" label="开票记录编号">
  146. <el-input v-model="recordForm1.invoiceId"></el-input>
  147. </el-form-item>
  148. </el-col>
  149. <el-col :span="8">
  150. <el-form-item prop="signMonth" label="月份">
  151. <el-date-picker v-model="recordForm1.signMonth" style="width: 100%;" type="month" format="YYYY-MM" value-format="YYYY-MM" />
  152. </el-form-item>
  153. </el-col>
  154. <el-col :span="8" style="display: flex; justify-content: flex-end">
  155. <el-button type="primary" @click="handleSearch(2)">查询</el-button>
  156. <el-button plain type="primary" @click="handleReset(2)">重置</el-button>
  157. <el-button type="primary" @click="handleExport(2)">导出结算记录</el-button>
  158. </el-col>
  159. </el-row>
  160. </el-form>
  161. <el-table height="calc(100% - 192px)" :data="recordData1" show-summary
  162. :summary-method="val => getSummaries(val, ['taxPoint', 'actualReceivedAmount', 'settlementPaymentDifference'])">
  163. <el-table-column prop="settlementId" label="结算记录编号" width="200"></el-table-column>
  164. <el-table-column prop="companyName" label="保险公司" width="200"></el-table-column>
  165. <el-table-column prop="invoiceParty" label="开票方" width="150"></el-table-column>
  166. <el-table-column prop="invoiceRiskTypeName" label="应收项" width="100"></el-table-column>
  167. <el-table-column prop="taxPoint" label="税点" width="100"></el-table-column>
  168. <el-table-column prop="actualReceivedAmount" label="实收金额" width="100"></el-table-column>
  169. <el-table-column prop="settlementPaymentDifference" label="回款差额" width="100"></el-table-column>
  170. <el-table-column prop="settlementPaymentReason" label="差额原因" width="100"></el-table-column>
  171. <el-table-column prop="receivePaymentDate" label="收款日期" width="150"></el-table-column>
  172. <el-table-column label="收款凭证" width="100">
  173. <template #default="scope">
  174. <el-button link type="primary" @click="view(scope.row)">查看凭证(1)</el-button>
  175. </template>
  176. </el-table-column>
  177. <el-table-column prop="createBy" label="结算人" width="100"></el-table-column>
  178. <el-table-column prop="createTime" label="结算时间" width="200"></el-table-column>
  179. <el-table-column prop="invoiceId" label="开票记录编号" width="200"></el-table-column>
  180. <el-table-column label="操作" width="160" fixed="right">
  181. <template #default="scope">
  182. <el-button link type="primary" @click="handleDetail(scope.row)">删除</el-button>
  183. <el-button link type="primary" @click="handleAssociateInvoice(scope.row)">关联发票</el-button>
  184. </template>
  185. </el-table-column>
  186. </el-table>
  187. <div class="pagination">
  188. <el-pagination v-model:current-page="pages" v-model:page-size="size" :page-sizes="[10, 20, 30, 40]"
  189. layout="total, sizes, prev, pager, next, jumper" :total="total1"
  190. @size-change="handleSizeChange($event, '2')"
  191. @current-change="handleCurrentChange($event, '2')"></el-pagination>
  192. </div>
  193. </el-tab-pane>
  194. <!-- <el-tab-pane style="height: 100%" name="3" label="车险结算明细">
  195. <el-form v-model="recordForm2" label-width="120">
  196. <el-row :gutter="20">
  197. <el-col :span="8">
  198. <el-form-item prop="invoiceId" label="开票记录编号">
  199. <el-input v-model="recordForm2.invoiceId"></el-input>
  200. </el-form-item>
  201. </el-col>
  202. <el-col :span="8">
  203. <el-form-item prop="partnerCompanyId" label="保险公司">
  204. <el-cascader filterable clearable placeholder="请选择" v-model="recordForm2.partnerCompanyId"
  205. :options="companyList" :props="companyIdprops" style="width: 100%;" @change="handleCompanyChange" />
  206. </el-form-item>
  207. </el-col>
  208. <el-col :span="8">
  209. <el-form-item prop="invoiceParty" label="开票方">
  210. <el-select v-model="recordForm2.invoiceParty">
  211. <el-option v-for="item in optionObj['invoice_party']" :key="item.value" :value="item.value"
  212. :label="item.label"></el-option>
  213. </el-select>
  214. </el-form-item>
  215. </el-col>
  216. <el-col :span="8">
  217. <el-form-item prop="settlementPerson" label="结算人">
  218. <el-input v-model="recordForm2.settlementPerson"></el-input>
  219. </el-form-item>
  220. </el-col>
  221. <el-col :span="8">
  222. <el-form-item prop="settlementTime" label="结算时间">
  223. <el-date-picker v-model="recordForm.settlementTime" type="daterange" format="YYYY-MM-DD"
  224. value-format="YYYY-MM-DD" />
  225. </el-form-item>
  226. </el-col>
  227. <el-col :span="8">
  228. <el-form-item prop="status" label="状态">
  229. <el-select v-model="recordForm.status">
  230. <el-option value="1" label="1"></el-option>
  231. </el-select>
  232. </el-form-item>
  233. </el-col>
  234. <el-col :span="24" style="height: 50px; display: flex; align-items: start; justify-content: flex-end">
  235. <el-button type="primary" @click="handleSearch(3)">查询</el-button>
  236. <el-button plain type="primary" @click="handleReset(3)">重置</el-button>
  237. <el-button type="primary" @click="handleExport(3)">导出明细</el-button>
  238. </el-col>
  239. </el-row>
  240. </el-form>
  241. <el-table height="calc(100% - 192px)" :data="recordData2">
  242. <el-table-column prop="id" label="开票记录编号" width="200"></el-table-column>
  243. <el-table-column prop="companyAllName" label="保险公司" width="100"></el-table-column>
  244. <el-table-column prop="partnerCompanyName" label="支公司" width="350" align="center"></el-table-column>
  245. <el-table-column prop="companyNameSimple" label="保险机构" width="150"></el-table-column>
  246. <el-table-column prop="invoiceNo" label="发票号" width="150"></el-table-column>
  247. <el-table-column prop="year" label="年份" width="150"></el-table-column>
  248. <el-table-column prop="month" label="月份" width="150"></el-table-column>
  249. <el-table-column prop="invoiceParty" label="开票方" width="150"></el-table-column>
  250. <el-table-column prop="remainSettlementAmount" label="未结算金额" width="100"></el-table-column>
  251. <el-table-column prop="accountsReceivable" label="应收项" width="100"></el-table-column>
  252. <el-table-column prop="receivableAmount" label="应收金额" width="120"></el-table-column>
  253. <el-table-column prop="paymentReason" label="差额原因" width="120"></el-table-column>
  254. <el-table-column prop="taxPoint" label="税点" width="120"></el-table-column>
  255. <el-table-column prop="receivableSupervisePremium" label="开票金额" width="120"></el-table-column>
  256. <el-table-column prop="settlementStatus" label="结算状态" width="120">
  257. </el-table-column>
  258. <el-table-column prop="settlementAmount" label="已结算金额" width="120"></el-table-column>
  259. <el-table-column prop="createBy" label="开票人" width="120"></el-table-column>
  260. <el-table-column prop="createTime" label="开票时间" width="150"></el-table-column>
  261. </el-table>
  262. <div class="pagination">
  263. <el-pagination v-model:current-page="pages" v-model:page-size="size" :page-sizes="[10, 20, 30, 40]"
  264. layout="total, sizes, prev, pager, next, jumper" :total="total2"
  265. @size-change="handleSizeChange($event, '3')"
  266. @current-change="handleCurrentChange($event, '3')"></el-pagination>
  267. </div>
  268. </el-tab-pane>
  269. <el-tab-pane style="height: 100%" name="4" label="非车结算明细">
  270. <el-form v-model="recordForm3" label-width="120">
  271. <el-row :gutter="20">
  272. <el-col :span="8">
  273. <el-form-item prop="invoiceId" label="开票记录编号">
  274. <el-input v-model="recordForm3.invoiceId"></el-input>
  275. </el-form-item>
  276. </el-col>
  277. <el-col :span="8">
  278. <el-form-item prop="companyId" label="保险公司">
  279. <el-cascader filterable clearable placeholder="请选择" v-model="recordForm3.companyId"
  280. :options="companyList" :props="companyIdprops" style="width: 100%;" @change="handleCompanyChange" />
  281. </el-form-item>
  282. </el-col>
  283. <el-col :span="8">
  284. <el-form-item prop="invoiceParty" label="开票方">
  285. <el-select v-model="recordForm3.invoiceParty">
  286. <el-option v-for="item in optionObj['invoice_party']" :key="item.value" :value="item.value"
  287. :label="item.label"></el-option>
  288. </el-select>
  289. </el-form-item>
  290. </el-col>
  291. <el-col :span="8">
  292. <el-form-item prop="settlementPerson" label="结算人">
  293. <el-input v-model="recordForm3.settlementPerson"></el-input>
  294. </el-form-item>
  295. </el-col>
  296. <el-col :span="8">
  297. <el-form-item prop="settlementTime" label="结算时间">
  298. <el-date-picker v-model="recordForm3.settlementTime" type="daterange" format="YYYY-MM-DD"
  299. value-format="YYYY-MM-DD" />
  300. </el-form-item>
  301. </el-col>
  302. <el-col :span="8">
  303. <el-form-item prop="status" label="状态">
  304. <el-select v-model="recordForm3.status">
  305. <el-option value="1" label="1"></el-option>
  306. </el-select>
  307. </el-form-item>
  308. </el-col>
  309. <el-col :span="24" style="height: 50px; display: flex; align-items: start; justify-content: flex-end">
  310. <el-button type="primary" @click="handleSearch(4)">查询</el-button>
  311. <el-button plain type="primary" @click="handleReset(4)">重置</el-button>
  312. <el-button type="primary" @click="handleExport(4)">导出明细</el-button>
  313. </el-col>
  314. </el-row>
  315. </el-form>
  316. <el-table height="calc(100% - 192px)" :data="recordData3">
  317. <el-table-column prop="invoiceId" label="开票记录编号" width="200"></el-table-column>
  318. <el-table-column prop="companyName" label="保险公司" width="200"></el-table-column>
  319. <el-table-column prop="invoiceParty" label="开票方" width="100"></el-table-column>
  320. <el-table-column prop="signingTime" label="签单时间" width="150"></el-table-column>
  321. <el-table-column prop="status" label="状态" width="100"></el-table-column>
  322. <el-table-column prop="licenseNo" label="车牌号" width="120"></el-table-column>
  323. <el-table-column prop="productName" label="险种" width="120"></el-table-column>
  324. <el-table-column prop="receivableSuperviseCosts" label="应收跟单费" width="100"></el-table-column>
  325. <el-table-column prop="jyPremium" label="非车险保费" width="100"></el-table-column>
  326. <el-table-column prop="jySuperviseCostsProportion" label="非车险跟单费比例" width="100"></el-table-column>
  327. <el-table-column prop="jyPolicyNo" label="非车险保单号" width="200"></el-table-column>
  328. <el-table-column prop="invoicePerson" label="开票人" width="100"></el-table-column>
  329. <el-table-column prop="invoiceTime" label="开票时间" width="150"></el-table-column>
  330. </el-table>
  331. <div class="pagination">
  332. <el-pagination v-model:current-page="pages" v-model:page-size="size" :page-sizes="[10, 20, 30, 40]"
  333. layout="total, sizes, prev, pager, next, jumper" :total="total3"
  334. @size-change="handleSizeChange($event, '4')"
  335. @current-change="handleCurrentChange($event, '4')"></el-pagination>
  336. </div>
  337. </el-tab-pane> -->
  338. </el-tabs>
  339. </PageMain>
  340. <el-dialog v-model="viewCredential" title="查看凭证" width="400">
  341. <div class="text-center text-[14px] text-[#999] pb-[20px]">点击图片放大预览</div>
  342. <el-image style="width: 100%; height: 300px" :src="CredentialList[0]" :zoom-rate="1.2" :max-scale="7"
  343. :min-scale="0.2" :preview-src-list="CredentialList" show-progress :initial-index="4" alt="凭证图片" fit="cover" />
  344. </el-dialog>
  345. </template>
  346. <script setup lang="ts">
  347. import { ElMessage, ElMessageBox } from 'element-plus'
  348. import api from '@/api'
  349. import { useRouter, useRoute } from 'vue-router'
  350. const router = useRouter()
  351. const route = useRoute()
  352. const activeName = ref('1')
  353. const handleClick = (e) => {
  354. activeName.value = e.props.name
  355. pages.value = 1
  356. size.value = 10
  357. switch (e.props.name) {
  358. case '1':
  359. initData1()
  360. break;
  361. case '2':
  362. initData2()
  363. break;
  364. case '3':
  365. initData3(['2'])
  366. break;
  367. case '4':
  368. initData3(['4'])
  369. break;
  370. }
  371. }
  372. const settlement_status = ref([
  373. {
  374. value: '0',
  375. label: '已开票未结清'
  376. },
  377. {
  378. value: '1',
  379. label: '已结清'
  380. },
  381. {
  382. value: '2',
  383. label: '未开票'
  384. },
  385. ])
  386. // 保险公司
  387. let companyList = ref([])
  388. const initCompany = () => {
  389. api.agreementApi.findTree({ name: "", systemCode: localStorage.getItem('login_system') }).then((res: any) => {
  390. if (res.code == 200) {
  391. companyList.value = res.data
  392. }
  393. })
  394. }
  395. const companyIdprops = {
  396. expandTrigger: 'hover' as const,
  397. value: 'id',
  398. label: 'name',
  399. checkStrictly: true,
  400. }
  401. // 保险公司选择器改变时触发
  402. const handleCompanyChange = (e) => {
  403. switch (activeName.value) {
  404. case '1':
  405. recordForm.value.companyId = e[e.length - 1] || ''
  406. break;
  407. case '2':
  408. recordForm1.value.companyId = e[e.length - 1] || ''
  409. break;
  410. case '3':
  411. recordForm2.value.companyId = e[e.length - 1] || ''
  412. break;
  413. case '4':
  414. recordForm3.value.companyId = e[e.length - 1] || ''
  415. break;
  416. }
  417. }
  418. // 分页
  419. let pages = ref(1)
  420. let size = ref(10)
  421. let total = ref(0)
  422. let total1 = ref(0)
  423. let total2 = ref(0)
  424. let total3 = ref(0)
  425. const handleSizeChange = (size, type) => {
  426. size.value = size
  427. switch (type) {
  428. case 2:
  429. initData2()
  430. break;
  431. case 3:
  432. initData3('2')
  433. break;
  434. case 4:
  435. initData3('4')
  436. break;
  437. }
  438. }
  439. const handleCurrentChange = (page, type) => {
  440. pages.value = page
  441. switch (type) {
  442. case 2:
  443. initData2()
  444. break;
  445. case 3:
  446. initData3('2')
  447. break;
  448. case 4:
  449. initData3('4')
  450. break;
  451. }
  452. }
  453. const getSummaries = (param, list) => {
  454. console.log(param)
  455. const { columns, data } = param
  456. const sums: (string | VNode)[] = []
  457. // 指定需要计算的字段列表(可根据需求添加字段名)
  458. const specifiedFields = list // 替换为您需要的字段名
  459. columns.forEach((column, index) => {
  460. if (index === 0) {
  461. sums[index] = h('div', { style: { textDecoration: 'underline' } }, [
  462. '',
  463. ])
  464. return
  465. }
  466. // 计算数字类型字段和指定字段
  467. const values = data.map((item) => {
  468. const val = item[column.property]
  469. // 排除空值
  470. if (val === '' || val === null || val === undefined) {
  471. return NaN
  472. }
  473. // 如果是数字类型,直接参与计算
  474. if (typeof val === 'number') {
  475. return val
  476. }
  477. // 如果字段在指定列表中,尝试转换为数字
  478. if (specifiedFields.includes(column.property)) {
  479. const num = Number(val)
  480. return Number.isNaN(num) ? NaN : num
  481. }
  482. // 其他情况不参与计算
  483. return NaN
  484. })
  485. if (!values.every((value) => Number.isNaN(value))) {
  486. const total = values.reduce((prev, curr) => {
  487. if (!Number.isNaN(curr)) {
  488. return prev + curr
  489. } else {
  490. return prev
  491. }
  492. }, 0)
  493. // 保留五位小数
  494. sums[index] = ` ${total.toFixed(5)}`
  495. } else {
  496. sums[index] = '-'
  497. }
  498. })
  499. return sums
  500. }
  501. // 结算记录
  502. let recordForm = ref({})
  503. let recordForm1 = ref({})
  504. let recordForm2 = ref({})
  505. let recordForm3 = ref({})
  506. let recordData = ref([])
  507. let recordData1 = ref([])
  508. let recordData2 = ref([])
  509. let recordData3 = ref([])
  510. const viewCredential = ref(false)//查看凭证弹窗
  511. const CredentialList = ref([])//凭证图片
  512. const view = (scope) => {
  513. CredentialList.value = scope.fileUrl.split(',')
  514. viewCredential.value = true
  515. }
  516. const initData1 = () => {
  517. api.settlementApi.followCompanySuperviseSettlementReport({
  518. ...recordForm.value,
  519. companyId: recordForm.value.companyId,
  520. signingStartTime: recordForm.value.signingTime?.[0],
  521. signingEndTime: recordForm.value.signingTime?.[1],
  522. startTime: recordForm.value.time?.[0],
  523. endTime: recordForm.value.time?.[1],
  524. invoiceStartTime: recordForm.value.invoiceTime?.[0],
  525. invoiceEndTime: recordForm.value.invoiceTime?.[1],
  526. settlementStartTime: recordForm.value.settlementTime?.[0],
  527. settlementEndTime: recordForm.value.settlementTime?.[1],
  528. status: recordForm.value.status,
  529. invoiceType: recordForm.value.invoiceRiskType,
  530. invoiceTypes: ['2', '4'],
  531. agreementType: '2'
  532. }).then((res: any) => {
  533. if (res.code == 200) {
  534. recordData.value = res.data
  535. }
  536. })
  537. }
  538. const initData2 = () => {
  539. api.settlementApi.followSettlementExcel({
  540. ...recordForm1.value,
  541. agreementType: '2',
  542. settlementId: recordForm1.value.settlementId,
  543. partnerCompanyId: recordForm1.value.partnerCompanyId,
  544. invoiceParty: recordForm1.value.invoiceParty,
  545. invoiceRiskType: recordForm1.value.invoiceRiskType,
  546. status: recordForm1.value.status,
  547. settlementPerson: recordForm1.value.settlementPerson,
  548. invoiceId: recordForm1.value.invoiceId,
  549. settlementTimeStart: recordForm1.value.settlementTime?.[0],
  550. settlementTimeEnd: recordForm1.value.settlementTime?.[1],
  551. pages: pages.value,
  552. size: size.value,
  553. invoiceTypes: ['2', '4']
  554. }).then((res: any) => {
  555. if (res.code == 200) {
  556. recordData1.value = res.data.records
  557. total1.value = res.data.total
  558. }
  559. })
  560. }
  561. const initData3 = (invoiceTypes) => {
  562. let params = invoiceTypes.includes('2') ?
  563. {
  564. invoiceId: recordForm2.value.invoiceId,
  565. partnerCompanyId: recordForm2.value.partnerCompanyId,
  566. invoiceParty: recordForm2.value.invoiceParty,
  567. settlementPerson: recordForm2.value.settlementPerson,
  568. status: recordForm2.value.status,
  569. settlementTimeStart: recordForm2.value.settlementTime?.[0],
  570. settlementTimeEnd: recordForm2.value.settlementTime?.[1],
  571. pages: pages.value,
  572. size: size.value,
  573. invoiceTypes: invoiceTypes
  574. } :
  575. invoiceTypes.includes('4') ?
  576. {
  577. invoiceId: recordForm3.value.invoiceId,
  578. partnerCompanyId: recordForm3.value.partnerCompanyId,
  579. invoiceParty: recordForm3.value.invoiceParty,
  580. settlementPerson: recordForm3.value.settlementPerson,
  581. status: recordForm3.value.status,
  582. settlementTimeStart: recordForm3.value.settlementTime?.[0],
  583. settlementTimeEnd: recordForm3.value.settlementTime?.[1],
  584. pages: pages.value,
  585. size: size.value,
  586. invoiceTypes: invoiceTypes
  587. } :
  588. {}
  589. api.settlementApi.followSettlementDetailExcel({
  590. ...params
  591. }).then((res: any) => {
  592. if (res.code == 200) {
  593. recordData2.value = res.data.records
  594. recordData3.value = res.data.records
  595. total2.value = res.data.total
  596. }
  597. })
  598. }
  599. const handleAssociateInvoice = (row) => {
  600. router.push({
  601. path: '/receivable/documentary/documentaryRecord',
  602. query: {
  603. invoiceId: row.invoiceId
  604. }
  605. })
  606. }
  607. const handleSearch = (type) => {
  608. pages.value = 1
  609. size.value = 10
  610. switch (type) {
  611. case 1:
  612. initData1()
  613. break;
  614. case 2:
  615. initData2()
  616. break;
  617. }
  618. }
  619. const handleReset = (type) => {
  620. switch (type) {
  621. case 1:
  622. recordForm.value = {
  623. companyId: '',
  624. time: [],
  625. status: ''
  626. },
  627. initData1()
  628. break;
  629. case 2:
  630. recordForm1.value = {
  631. signMonth: '',
  632. settlementId: '',
  633. companyId: '',
  634. invoiceParty: '',
  635. invoiceType: '',
  636. status: '',
  637. settlementPerson: '',
  638. settlementTime: [],
  639. invoiceId: ''
  640. },
  641. initData2()
  642. break;
  643. }
  644. }
  645. // 结算明细
  646. const handleSettlementDetail = (row) => {
  647. activeName.value = '2'
  648. recordForm1.value.partnerCompanyId = row.partnerCompanyId
  649. recordForm1.value.signMonth = row.signMonth
  650. if (row.invoiceType == '2') {
  651. recordForm1.value.invoiceRiskType = '10'
  652. } else {
  653. recordForm1.value.invoiceRiskType = '20'
  654. }
  655. initData2()
  656. }
  657. // 开票明细
  658. const handleInvoiceRecord = (row) => {
  659. router.push({
  660. path: '/receivable/documentary/documentaryRecord',
  661. query: {
  662. partnerCompanyId: row.partnerCompanyId,
  663. invoiceType: row.invoiceType,
  664. signMonth: row.signMonth,
  665. }
  666. })
  667. }
  668. const handleExport = (type) => {
  669. switch (type) {
  670. case 2:
  671. exportOtherSettlementExcel()
  672. break;
  673. case 3:
  674. exportOtherSettlementDetailExcel()
  675. break;
  676. case 4:
  677. exportOtherSettlementDetailJyExcel()
  678. break;
  679. }
  680. }
  681. const exportOtherSettlementExcel = () => {
  682. api.settlementApi.exportOtherSettlementExcel({
  683. agreementType: '2',
  684. settlementId: recordForm1.value.settlementId,
  685. partnerCompanyId: recordForm1.value.partnerCompanyId,
  686. invoiceParty: recordForm1.value.invoiceParty,
  687. invoiceType: recordForm1.value.invoiceType,
  688. status: recordForm1.value.status,
  689. settlementPerson: recordForm1.value.settlementPerson,
  690. invoiceId: recordForm1.value.invoiceId,
  691. settlementTimeStart: recordForm1.value.settlementTime?.[0],
  692. settlementTimeEnd: recordForm1.value.settlementTime?.[1],
  693. invoiceTypes: ['2', '4']
  694. }).then((res: any) => {
  695. const blob = new Blob([res], { type: 'application/vnd.ms-excel' });
  696. const fileName = '跟单费应收结算报表明细' + new Date().getTime() + '.xlsx';
  697. if ('download' in document.createElement('a')) {
  698. const elink = document.createElement('a');
  699. elink.download = fileName;
  700. elink.style.display = 'none';
  701. elink.href = URL.createObjectURL(blob);
  702. document.body.appendChild(elink);
  703. elink.click();
  704. URL.revokeObjectURL(elink.href);
  705. document.body.removeChild(elink);
  706. } else {
  707. navigator.msSaveBlob(blob, fileName);
  708. }
  709. })
  710. }
  711. const exportOtherSettlementDetailExcel = () => {
  712. api.settlementApi.exportOtherSettlementDetailExcel({
  713. }).then((res: any) => {
  714. const blob = new Blob([res], { type: 'application/vnd.ms-excel' });
  715. const fileName = '跟单费应收结算报表明细' + new Date().getTime() + '.xlsx';
  716. if ('download' in document.createElement('a')) {
  717. const elink = document.createElement('a');
  718. elink.download = fileName;
  719. elink.style.display = 'none';
  720. elink.href = URL.createObjectURL(blob);
  721. document.body.appendChild(elink);
  722. elink.click();
  723. URL.revokeObjectURL(elink.href);
  724. document.body.removeChild(elink);
  725. } else {
  726. navigator.msSaveBlob(blob, fileName);
  727. }
  728. })
  729. }
  730. const exportOtherSettlementDetailJyExcel = () => {
  731. api.settlementApi.exportOtherSettlementDetailJyExcel({
  732. }).then((res: any) => {
  733. const blob = new Blob([res], { type: 'application/vnd.ms-excel' });
  734. const fileName = '跟单费应收结算报表明细' + new Date().getTime() + '.xlsx';
  735. if ('download' in document.createElement('a')) {
  736. const elink = document.createElement('a');
  737. elink.download = fileName;
  738. elink.style.display = 'none';
  739. elink.href = URL.createObjectURL(blob);
  740. document.body.appendChild(elink);
  741. elink.click();
  742. URL.revokeObjectURL(elink.href);
  743. document.body.removeChild(elink);
  744. } else {
  745. navigator.msSaveBlob(blob, fileName);
  746. }
  747. })
  748. }
  749. const handleDetail = (type) => {
  750. ElMessageBox.confirm(
  751. '确定删除该记录吗?',
  752. '删除',
  753. {
  754. confirmButtonText: '确定删除',
  755. type: 'error',
  756. center: true,
  757. confirmButtonClass: 'el-button--danger',
  758. }
  759. )
  760. .then(() => {
  761. api.settlementApi.deleteFollowSettlement(type.settlementId).then((res: any) => {
  762. if (res.code == 200) {
  763. ElMessage({
  764. message: '删除成功',
  765. type: 'success'
  766. })
  767. initData2()
  768. }
  769. })
  770. })
  771. .catch(() => {
  772. })
  773. }
  774. const optionObj = ref({})
  775. const initOption = () => {
  776. let list = ['invoice_risk_type', 'invoice_party']
  777. list.forEach(item => {
  778. api.additionalApi.dictDetails(item).then((res: any) => {
  779. if (res.code == 200) {
  780. if (res.data) {
  781. optionObj.value[item] = res.data
  782. }
  783. }
  784. })
  785. })
  786. }
  787. onMounted(() => {
  788. if (route.query.activeName) {
  789. activeName.value = route.query.activeName;
  790. }
  791. if (route.query.activeName == "2") {
  792. recordForm1.value.invoiceId = route.query.id
  793. initData2();
  794. } else if (route.query.activeName == "3") {
  795. recordForm2.value.invoiceId = route.query.id
  796. initData3(['2']);
  797. }
  798. initData1();
  799. initCompany();
  800. initOption();
  801. })
  802. </script>
  803. <style scoped lang="scss">
  804. .pagination {
  805. margin-top: 10px;
  806. display: flex;
  807. justify-content: flex-end;
  808. }
  809. :deep(.subTable .el-table__header-wrapper) {
  810. display: none;
  811. }
  812. :deep(.el-dropdown-link) {
  813. display: flex;
  814. align-items: center;
  815. margin-left: 15px;
  816. color: var(--el-color-primary);
  817. cursor: pointer;
  818. }
  819. </style>