generanView.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <template>
  2. <PageMain class="vh100">
  3. <el-form v-model="form" label-width="100">
  4. <el-row :gutter="20">
  5. <el-col :span="8">
  6. <el-form-item label="业务员类型">
  7. <el-select v-model="form.attrType" clearable>
  8. <el-option value="1" label="前线人员"></el-option>
  9. <el-option value="2" label="后线人员"></el-option>
  10. <el-option value="3" label="合伙人"></el-option>
  11. <el-option value="4" label="工作室管理员"></el-option>
  12. <el-option value="5" label="团队"></el-option>
  13. <el-option value="6" label="个代"></el-option>
  14. <el-option value="7" label="电销"></el-option>
  15. <el-option value="8" label="渠道"></el-option>
  16. </el-select>
  17. </el-form-item>
  18. </el-col>
  19. <el-col :span="8">
  20. <el-form-item label="业务员">
  21. <el-input placeholder="请输入" v-model="form.salesman"></el-input>
  22. </el-form-item>
  23. </el-col>
  24. <el-col :span="8">
  25. <el-form-item label="业务员手机号">
  26. <el-input placeholder="请输入" v-model="form.mobile"></el-input>
  27. </el-form-item>
  28. </el-col>
  29. <el-col :offset="16" :span="8" style="display: flex; align-items: center; justify-content: flex-end">
  30. <el-button type="primary" @click="handleSearch">查询</el-button>
  31. <el-button type="primary" plain @click="handleReset">重置</el-button>
  32. </el-col>
  33. </el-row>
  34. </el-form>
  35. <el-row :gutter="20" justify="space-between" style="padding: 0 40px; margin-top: 20px">
  36. <el-col :span="4">
  37. <div class="count">{{ formData.salespersonCount ?? 0 }}人</div>
  38. <div class="name">业务员</div>
  39. </el-col>
  40. <el-col :span="5">
  41. <div class="count">¥{{ formData.payableSum ?? 0 }}</div>
  42. <div class="name">应付总计</div>
  43. </el-col>
  44. <el-col :span="5">
  45. <div class="count">{{ formData.paidSum ?? 0 }}</div>
  46. <div class="name">已付总计</div>
  47. </el-col>
  48. <el-col :span="5">
  49. <div class="count">{{ formData.payingAmountSum ?? 0 }}</div>
  50. <div class="name">支付中总计</div>
  51. </el-col>
  52. <el-col :span="5">
  53. <div class="count">¥{{ formData.notPaidSum ?? 0 }}</div>
  54. <div class="name">未付总计</div>
  55. </el-col>
  56. </el-row>
  57. <el-table :data="tableData" height="calc(100% - 232px)" style="margin-top: 20px">
  58. <el-table-column prop="attrType" label="业务员类型">
  59. <template #default="scope">
  60. {{ scope.row.attrType == '1' ? '前线人员' : scope.row.attrType == '2' ? '后线人员' : scope.row.attrType ==
  61. '3' ? '合伙人' : scope.row.attrType == '4' ? '工作室管理员' : scope.row.attrType == '5' ? '团队' : scope.row.attrType ==
  62. '6' ? '个代' : scope.row.attrType == '7' ? '电销' : scope.row.attrType == '8' ? '渠道' : '' }}
  63. </template>
  64. </el-table-column>
  65. <el-table-column prop="mobile" label="业务员手机号"></el-table-column>
  66. <el-table-column prop="name" label="业务员"></el-table-column>
  67. <el-table-column prop="leaderName" label="管理人"></el-table-column>
  68. <el-table-column prop="organizationName" label="归属"></el-table-column>
  69. <el-table-column prop="deptName" label="所属机构"></el-table-column>
  70. <el-table-column prop="sumAmount" label="应付总计"></el-table-column>
  71. <el-table-column prop="sumAmountPaid" label="已付金额"></el-table-column>
  72. <el-table-column prop="payingAmount" label="支付中金额"></el-table-column>
  73. <el-table-column prop="sumAmountUnpaid" label="未付金额"></el-table-column>
  74. <el-table-column label="操作" width="150" fixed="right">
  75. <template #default="scope">
  76. <div class="flex a-c ">
  77. <el-button type="primary" link @click="handleExport(scope.row)">导出收支明细</el-button>
  78. </div>
  79. </template>
  80. </el-table-column>
  81. </el-table>
  82. <div class="pagination">
  83. <el-pagination v-model:current-page="pages" v-model:page-size="size" :page-sizes="[10, 20, 30, 40]"
  84. layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"
  85. @current-change="handleCurrentChange"></el-pagination>
  86. </div>
  87. </PageMain>
  88. <el-dialog v-model="exportDialogVisible" title="导出收支明细" width="500">
  89. <el-form label-width="100">
  90. <el-form-item label="导出日期">
  91. <el-date-picker v-model="exportTime" clearable type="daterange" range-separator="至" start-placeholder="开始时间"
  92. end-placeholder="结束时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
  93. </el-form-item>
  94. </el-form>
  95. <template #footer>
  96. <div class="dialog-footer">
  97. <el-button @click="exportDialogVisible = false">取消</el-button>
  98. <el-button type="primary" @click="handleExportConfirm">
  99. 确认导出
  100. </el-button>
  101. </div>
  102. </template>
  103. </el-dialog>
  104. </template>
  105. <script setup lang="ts">
  106. import api from '@/api'
  107. import { ElMessage } from 'element-plus'
  108. let exportDialogVisible = ref(false)// 导出收支明细弹窗
  109. const exportTime = ref([])
  110. let form = ref({
  111. salesman: '',
  112. attrType: '',
  113. })
  114. let formData = ref({})
  115. let tableData = ref([])
  116. // 分页
  117. let pages = ref(1)
  118. let size = ref(10)
  119. let total = ref(0)
  120. const handleSizeChange = (e) => {
  121. size.value = e
  122. initData()
  123. }
  124. const handleCurrentChange = (e) => {
  125. pages.value = e
  126. initData()
  127. }
  128. const handleSearch = () => {
  129. pages.value = 1
  130. size.value = 10
  131. initData()
  132. }
  133. const handleReset = () => {
  134. pages.value = 1
  135. size.value = 10
  136. form.value = {
  137. salesman: '',
  138. attrType: '',
  139. }
  140. initData()
  141. }
  142. const initData = () => {
  143. api.financeApi.getPayableStatistics({
  144. ...form.value
  145. }).then((res: any) => {
  146. formData.value = res.data
  147. })
  148. api.financeApi.userAccountList({
  149. ...form.value,
  150. pages: pages.value,
  151. size: size.value,
  152. }).then((res: any) => {
  153. if (res.code == 200) {
  154. tableData.value = res.data.records
  155. total.value = res.data.total
  156. }
  157. })
  158. }
  159. const userId = ref('')
  160. const handleExport = (row: any) => {
  161. userId.value = row.userId
  162. exportDialogVisible.value = true
  163. }
  164. const handleExportConfirm = () => {
  165. if (exportTime.value.length == 0) {
  166. ElMessage.warning('请选择导出日期')
  167. return
  168. }
  169. api.financeApi.exportPayableStatisticsExcel({
  170. ywyUserId: userId.value,
  171. beginDate: exportTime.value?.[0],
  172. endDate: exportTime.value?.[1]
  173. }).then((res: any) => {
  174. if (res.code == 200) {
  175. ElMessage.success('导出成功')
  176. exportDialogVisible.value = false
  177. const link = document.createElement('a');
  178. link.href = res.msg;
  179. link.download = '';
  180. // 触发下载
  181. document.body.appendChild(link);
  182. link.click();
  183. }
  184. })
  185. }
  186. onMounted(() => {
  187. initData();
  188. })
  189. </script>
  190. <style scoped lang="scss">
  191. .pagination {
  192. margin-top: 10px;
  193. display: flex;
  194. justify-content: flex-end;
  195. }
  196. .count {
  197. font-size: 30px;
  198. }
  199. .name {
  200. color: #666666;
  201. }
  202. </style>