dialog.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. <style scoped lang="scss">
  2. /* td{
  3. height: 42px;
  4. padding-left: 3px;
  5. }*/
  6. table {
  7. border-collapse: separate;
  8. border-top: 1px solid #000;
  9. border-left: 1px solid #000;
  10. }
  11. thead tr th {
  12. background-color: #f8f8f9;
  13. padding: 6px;
  14. text-align: center;
  15. border-bottom: 1px solid #000;
  16. border-right: 1px solid #000;
  17. }
  18. tbody tr td {
  19. padding: 6px;
  20. height: 34px; //设置单元格最小高度
  21. border-bottom: 1px solid #000;
  22. border-right: 1px solid #000;
  23. }
  24. </style>
  25. <template>
  26. <div class="system-dialog-container">
  27. <el-dialog
  28. :title="state.ruleForm.roleName+'对账单'"
  29. v-model="state.dialog.isShowDialog"
  30. width="1000px"
  31. draggable
  32. destroy-on-close
  33. :close-on-click-modal="false"
  34. @close="onClose"
  35. align-center>
  36. <template v-if="state.ruleForm.roleName==='投资者'">
  37. <table border="0" cellspacing="0" :id="'settle-table-'+state.ruleForm.roleDesc" class="w100">
  38. <tr style="background-color: lightsteelblue;font-weight: bold">
  39. <td colspan="9" style="height: 34px;text-align: center;">深圳市快与慢充电桩服务有限公司—{{ state.ruleForm.stationName }}对账单</td>
  40. </tr>
  41. <tbody>
  42. <tr class="text-align-center">
  43. <td>客户名称</td>
  44. <td :colspan="8">{{ state.ruleForm.adminUserName }}</td>
  45. </tr>
  46. <tr class="text-align-center">
  47. <td>所属期间</td>
  48. <td :colspan="8">{{ state.ruleForm.statMonth }}</td>
  49. </tr>
  50. <tr style="background-color: lightsteelblue;">
  51. <td colspan="9" style="padding-left: 15px;">一、APP后台数据(含税,订单总金额为电费金额,实际电费为快与慢代收代付)(电量单位为“度”,电费和服务费以及金额单位为“元”)</td>
  52. </tr>
  53. <tr style="text-align: center">
  54. <td>站点名称</td>
  55. <td>订单电量</td>
  56. <td>①订单电费</td>
  57. <td>电表电量</td>
  58. <td>②电表电费</td>
  59. <td>电损金额=②-①</td>
  60. <td>实收对账服务费</td>
  61. <td>订单实收总金额</td>
  62. </tr>
  63. <tr style="text-align: center">
  64. <td>{{ state.ruleForm.stationName }}</td>
  65. <td>{{ state.ruleForm.totalPower }}</td>
  66. <td>{{ u.fmt.fmtMoney(state.ruleForm.elecMoney) }}</td>
  67. <td>{{ state.ruleForm.actualPower }}</td>
  68. <td>{{ u.fmt.fmtMoney(state.ruleForm.actualPower) }}</td>
  69. <td>{{ u.fmt.fmtMoney(state.ruleForm.elecLossMoney) }}</td>
  70. <td>{{ u.fmt.fmtMoney(state.ruleForm.serviceMoney - state.ruleForm.discountAmount) }}</td>
  71. <td>{{ u.fmt.fmtMoney(state.ruleForm.totalMoney - state.ruleForm.discountAmount) }}</td>
  72. </tr>
  73. <tr style="background-color: lightsteelblue">
  74. <td colspan="9" style="padding-left: 15px;">二、客户结算数据(含税)(电费和服务费以及金额单位为“元”)</td>
  75. </tr>
  76. <tr style="text-align: center">
  77. <td>站点名称</td>
  78. <td>①对账服务费</td>
  79. <td>②服务费分成比例</td>
  80. <td>③服务费分成</td>
  81. <td>④电损金额</td>
  82. <td>⑤电损承担比例</td>
  83. <td>⑥电损承担金额</td>
  84. <td>⑦分成金额=③-⑥</td>
  85. </tr>
  86. <tr style="text-align: center">
  87. <td>{{ state.ruleForm.stationName }}</td>
  88. <td>{{ u.fmt.fmtMoney(state.ruleForm.actualServiceMoney) }}</td>
  89. <td>{{ (state.ruleForm.splittingProportion * 100).toFixed(2) }}%</td>
  90. <td>{{ u.fmt.fmtMoney(state.ruleForm.actualServiceMoney * state.ruleForm.splittingProportion) }}</td>
  91. <td>{{ u.fmt.fmtMoney(state.ruleForm.elecLossMoney) }}</td>
  92. <td>{{ (state.ruleForm.elecLossProportion * 100).toFixed(2) }}%</td>
  93. <td>{{ u.fmt.fmtMoney(state.ruleForm.elecLossAmount) }}</td>
  94. <td>{{ u.fmt.fmtMoney(state.ruleForm.actualServiceMoney * state.ruleForm.splittingProportion - state.ruleForm.elecLossAmount) }}</td>
  95. </tr>
  96. <tr style="background-color: lightsteelblue">
  97. <td colspan="9" style="padding-left: 15px;">三、客户结算数据(不含税)(税额和金额单位为“元”)</td>
  98. </tr>
  99. <tr style="text-align: center">
  100. <td colspan="2">①分成金额</td>
  101. <td colspan="2"> 增值税率</td>
  102. <td colspan="2">②应纳增值税额</td>
  103. <td colspan="3">应付金额=①-②</td>
  104. </tr>
  105. <tr style="text-align: center">
  106. <td colspan="2">{{ u.fmt.fmtMoney(state.ruleForm.actualServiceMoney * state.ruleForm.splittingProportion - state.ruleForm.elecLossAmount) }}</td>
  107. <td colspan="2">{{ (state.ruleForm.vatRate * 100).toFixed(2) }}%</td>
  108. <td colspan="2">{{ u.fmt.fmtMoney(state.ruleForm.vatAmount) }}</td>
  109. <td colspan="2">{{ u.fmt.fmtMoney(state.ruleForm.actualSplittingAmount) }}</td>
  110. </tr>
  111. <tr style="background-color: lightsteelblue">
  112. <td colspan="9" style="padding-left: 15px;">备注:</td>
  113. </tr>
  114. <tr>
  115. <td colspan="9" style="padding-left: 15px;">
  116. 分成金额=实际服务费收入*分成比例<br>
  117. 注意:乙方通过运营平台收取扣除相应费用以后的“实际收取的充电服务费收益”*甲方分成比例,甲方收益分成比例为{{ (state.ruleForm.splittingProportion * 100).toFixed(2) }}%。<br>
  118. 结算账户:{{ state.ruleForm.accountName }} &nbsp;&nbsp; 联系电话:{{ state.ruleForm.telephone }} <br>
  119. 开户行:{{ state.ruleForm.bankName }} &nbsp;&nbsp; 银行账号:{{ state.ruleForm.bankCardNo }} <br>
  120. </td>
  121. </tr>
  122. </tbody>
  123. </table>
  124. </template>
  125. <template v-else>
  126. <table border="0" cellspacing="0" :id="'settle-table-'+state.ruleForm.roleDesc" class="w100">
  127. <tr style="background-color: lightsteelblue;font-weight: bold">
  128. <td colspan="8" style="height: 34px;text-align: center;">深圳市快与慢充电桩服务有限公司—{{ state.ruleForm.stationName }}对账单</td>
  129. </tr>
  130. <tbody>
  131. <tr class="text-align-center">
  132. <td>客户名称</td>
  133. <td :colspan="7">{{ state.ruleForm.adminUserName }}</td>
  134. </tr>
  135. <tr class="text-align-center">
  136. <td>所属期间</td>
  137. <td :colspan="7">{{ state.ruleForm.statMonth }}</td>
  138. </tr>
  139. <tr style="background-color: lightsteelblue;">
  140. <td colspan="8" style="padding-left: 15px;">一、APP后台数据(含税,订单总金额为电费金额,实际电费为快与慢代收代付)(电量单位为“度”,电费和服务费以及金额单位为“元”)</td>
  141. </tr>
  142. <tr style="text-align: center">
  143. <td colspan="2">站点名称</td>
  144. <td colspan="2">充电电量(度)</td>
  145. <td colspan="2">订单电费(元)</td>
  146. <td >实收服务费(元)</td>
  147. <td>订单总金额(元)</td>
  148. </tr>
  149. <tr style="text-align: center">
  150. <td colspan="2">{{ state.ruleForm.stationName }}</td>
  151. <td colspan="2">{{ state.ruleForm.totalPower }}</td>
  152. <td colspan="2">{{ u.fmt.fmtMoney(state.ruleForm.actualElecMoney) }}</td>
  153. <td>{{ u.fmt.fmtMoney(state.ruleForm.serviceMoney ) }}</td>
  154. <td>{{ u.fmt.fmtMoney(state.ruleForm.totalMoney ) }}</td>
  155. </tr>
  156. <tr style="background-color: lightsteelblue">
  157. <td colspan="8" style="padding-left: 15px;">二、物业结算数据(含税)</td>
  158. </tr>
  159. <tr style="text-align: center">
  160. <td colspan="2">站点名称</td>
  161. <td colspan="2">实付服务费(元)</td>
  162. <td colspan="2">物业/场地方分成比例</td>
  163. <td colspan="2">物业/场地方分成金额(元)</td>
  164. </tr>
  165. <tr style="text-align: center">
  166. <td colspan="2">{{ state.ruleForm.stationName }}</td>
  167. <td colspan="2">{{ u.fmt.fmtMoney(state.ruleForm.actualServiceMoney) }}</td>
  168. <td colspan="2">{{ (state.ruleForm.splittingProportion * 100).toFixed(2) }}%</td>
  169. <td colspan="2">{{ u.fmt.fmtMoney(state.ruleForm.splittingAmount) }}</td>
  170. </tr>
  171. <tr style="background-color: lightsteelblue">
  172. <td colspan="8" style="padding-left: 15px;">备注:</td>
  173. </tr>
  174. <tr>
  175. <td colspan="4" style="padding-left: 15px;">
  176. 甲方账户信息:<br>
  177. 结算账户:{{ state.ruleForm.accountName }} &nbsp;&nbsp;<br>
  178. 纳税人识别号:{{ state.ruleForm.taxNo }} <br>
  179. 开户行:{{ state.ruleForm.bankName }} &nbsp;&nbsp; <br>
  180. 银行账号:{{ state.ruleForm.bankCardNo }} <br>
  181. 物业确认(盖公章或财务章):
  182. </td>
  183. <td colspan="3" style="padding-left: 15px;">
  184. 乙方账户信息:<br>
  185. 结算账户:深圳市快与慢充电桩服务有限公司&nbsp;&nbsp;<br>
  186. 纳税人识别号:91440300MA5HJNDG14<br>
  187. 开户行:平安银行深圳深大支行&nbsp;&nbsp; <br>
  188. 银行账号:15419629160031<br>
  189. 乙方确认(盖公章或财务章):
  190. </td>
  191. <td style="padding-left: 15px;">
  192. 应付账款:{{ u.fmt.fmtMoney(state.ruleForm.splittingAmount) }}元
  193. </td>
  194. </tr>
  195. </tbody>
  196. </table>
  197. </template>
  198. <template #footer>
  199. <div class="dialog-footer">
  200. <el-button @click="onCancel" size="default">关 闭</el-button>
  201. <el-button :loading="state.btnLoading" type="primary" @click="onSubmit" size="default">下 载PDF</el-button>
  202. </div>
  203. </template>
  204. </el-dialog>
  205. </div>
  206. </template>
  207. <script setup lang="ts" name="StationDialog">
  208. import {defineAsyncComponent, reactive, onMounted, ref} from 'vue';
  209. import {$body, $get} from "/@/utils/request";
  210. import u from "/@/utils/u";
  211. import html2canvas from 'html2canvas';
  212. import jsPDF from 'jspdf'
  213. // 引入组件
  214. // 定义子组件向父组件传值/事件
  215. const emit = defineEmits(['refresh']);
  216. const formRef = ref();
  217. //定义初始变量,重置使用
  218. const initState = () => ({
  219. ruleForm: {
  220. id: 0,
  221. roleName: '投资者',
  222. roleDesc:'investor'
  223. },
  224. btnLoading: false,
  225. dialog: {
  226. isShowDialog: false,
  227. type: '',
  228. title: '',
  229. submitTxt: '',
  230. },
  231. form: {}
  232. })
  233. // 定义变量内容
  234. const state = reactive(initState());
  235. // 打开弹窗
  236. const open = (action: string = 'add', row: any) => {
  237. state.dialog.isShowDialog = true;
  238. loadData(row.id);
  239. };
  240. // 关闭弹窗
  241. const onClose = () => {
  242. state.dialog.isShowDialog = false;
  243. Object.assign(state, initState())
  244. };
  245. // 取消
  246. const onCancel = () => {
  247. onClose();
  248. };
  249. const loadData = (id: number) => {
  250. $get(`statements/preview/${id}`).then(res => {
  251. state.ruleForm = res;
  252. })
  253. }
  254. const onSubmit = () => {
  255. htmlToPDF(`settle-table-${state.ruleForm.roleDesc}`)
  256. }
  257. const htmlToPDF = async (htmlId: string, title: string = "对账单", bgColor = "#fff") => {
  258. let pdfDom: HTMLElement | null = document.getElementById(htmlId) as HTMLElement
  259. pdfDom.style.padding = '0 10px !important'
  260. //纵向打印
  261. // const A4Width = 595.28;
  262. // const A4Height = 841.89;
  263. const A4Width = 841.89;
  264. const A4Height = 595.28;
  265. let canvas = await html2canvas(pdfDom, {
  266. scale: 2,
  267. useCORS: true,
  268. backgroundColor: bgColor,
  269. });
  270. let pageHeight = (canvas.width / A4Width) * A4Height;
  271. let leftHeight = canvas.height;
  272. let position = 0;
  273. let imgWidth = A4Width;
  274. let imgHeight = (A4Width / canvas.width) * canvas.height;
  275. /*
  276. 根据自身业务需求 是否在此处键入下方水印代码
  277. */
  278. let pageData = canvas.toDataURL("image/jpeg", 1.0);
  279. let PDF = new jsPDF("l", 'pt', 'a4');
  280. if (leftHeight < pageHeight) {
  281. PDF.addImage(pageData, "JPEG", 0, 0, imgWidth, imgHeight);
  282. } else {
  283. while (leftHeight > 0) {
  284. PDF.addImage(pageData, "JPEG", 0, position, imgWidth, imgHeight);
  285. leftHeight -= pageHeight;
  286. position -= A4Height;
  287. if (leftHeight > 0) PDF.addPage();
  288. }
  289. }
  290. PDF.save(title + ".pdf");
  291. }
  292. // 初始化表格数据
  293. /*const loadData = (id: number) => {
  294. $get(`station/detail/${id}`).then((res: any) => {
  295. state.ruleForm = res;
  296. })
  297. }*/
  298. // 暴露变量
  299. defineExpose({
  300. open
  301. });
  302. </script>