index.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. <template>
  2. <div class="page-container list-container">
  3. <!-- 功能按钮区 -->
  4. <div class="list-btns-container">
  5. <el-button type="primary" size="small" icon="Download" @click="handleExport">导出</el-button>
  6. </div>
  7. <!-- 搜索区 -->
  8. <el-form class="list-search-container" :model="queryParams" ref="queryRef" :inline="true" label-width="68px">
  9. <el-form-item label="客户名称:" prop="companyName">
  10. <el-input v-model="queryParams.companyName" size="small" placeholder="请输入客户名称" style="width: 150px"
  11. clearable @keyup.enter="handleQuery" />
  12. </el-form-item>
  13. <el-form-item label="审核人:" prop="examineName">
  14. <el-input v-model="queryParams.examineName" size="small" placeholder="请输入审核人名称" style="width: 150px"
  15. clearable @keyup.enter="handleQuery" />
  16. </el-form-item>
  17. <el-form-item label="合同编号:" prop="contractNo">
  18. <el-input v-model="queryParams.contractNo" size="small" placeholder="请输入合同编号" style="width: 150px"
  19. clearable @keyup.enter="handleQuery" />
  20. </el-form-item>
  21. <el-form-item label="产品名称:">
  22. <el-select size="small" v-model="queryParams.taskTypeIds" placeholder="产品名称" clearable
  23. style="width: 150px" multiple>
  24. <el-option v-for="item in taskType " :key="item.id" :label="item.name" :value="item.id" />
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item prop="receiptDateFilter" label="到账时间:">
  28. <el-date-picker v-model="queryParams.receiptDateFilter" type="daterange" clearable size="small"
  29. format="YYYY - MM - DD " value-format="YYYY-MM-DD" range-separator="至" start-placeholder="业务日期"
  30. end-placeholder="业务日期" style="width: 100%;"></el-date-picker>
  31. </el-form-item>
  32. <el-form-item prop="examineTimeFilter" label="审核时间:">
  33. <el-date-picker v-model="queryParams.examineTimeFilter" size="small" type="daterange" clearable
  34. format="YYYY - MM - DD " value-format="YYYY-MM-DD" range-separator="至" start-placeholder="业务日期"
  35. end-placeholder="业务日期" style="width: 100%;"></el-date-picker>
  36. </el-form-item>
  37. <el-form-item label="确认所属时间:" label-width="95px">
  38. <el-date-picker v-model="queryParams.actuallyDateFilter" size="small" type="daterange" clearable
  39. format="YYYY - MM - DD " value-format="YYYY-MM-DD" range-separator="至" start-placeholder="业务日期"
  40. end-placeholder="业务日期" style="width: 100%;"></el-date-picker>
  41. </el-form-item>
  42. <el-form-item label="项目名称:" prop="projectName">
  43. <el-input v-model="queryParams.projectName" size="small" placeholder="请输入项目名称" style="width: 150px"
  44. clearable @keyup.enter="handleQuery" />
  45. </el-form-item>
  46. <div style="margin-top: 10px;">
  47. <el-form-item label="是否是项目:" prop="isProject" label-width="auto">
  48. <el-select size="small" v-model="queryParams.isProject" placeholder="是否是项目" clearable
  49. style="width: 145px">
  50. <el-option v-for="item in projectTypes" :key="item.value" :label="item.label"
  51. :value="item.value" />
  52. </el-select>
  53. </el-form-item>
  54. <el-form-item label="新签/续签:" prop="isNew">
  55. <el-select size="small" v-model="queryParams.isNew" placeholder="新签/续签" clearable
  56. style="width: 150px">
  57. <el-option v-for="item in contractTypes" :key="item.value" :label="item.label"
  58. :value="item.value" />
  59. </el-select>
  60. </el-form-item>
  61. <el-form-item style="margin-left: 40px;">
  62. <el-button type="primary" icon="Search" @click="handleQuery" size="small">搜索</el-button>
  63. <el-button icon="Refresh" @click="resetQuery" size="small">重置</el-button>
  64. </el-form-item>
  65. </div>
  66. </el-form>
  67. <!-- 列表区 -->
  68. <el-table v-loading="loading" :data="accountList" size="small" border height="100%"
  69. @selection-change="handleSelectionChange">
  70. <el-table-column type="index" width="55" align="center" />
  71. <el-table-column label="公司名称" align="center" prop="companyName" >
  72. </el-table-column>
  73. <el-table-column label="产品名称" align="center" prop="typeName">
  74. </el-table-column>
  75. <el-table-column label="合同编号" align="center" prop="contractNo">
  76. </el-table-column>
  77. <el-table-column label="开始月" align="center" prop="inputStartMonth">
  78. </el-table-column>
  79. <el-table-column label="结束月" align="center" prop="inputEndMonth">
  80. </el-table-column>
  81. <el-table-column label="服务月数" align="center" prop="serviceNum">
  82. </el-table-column>
  83. <el-table-column label="到账日期" align="center" prop="receiptDate">
  84. </el-table-column>
  85. <el-table-column label="确认所属时间" align="center" prop="actuallyDate">
  86. <template #default="scope">
  87. {{ actuallyDateFormat(scope.row.actuallyDate) }}
  88. </template>
  89. </el-table-column>
  90. <el-table-column label="提收款金额" align="center" prop="withdrawalAmount">
  91. </el-table-column>
  92. <el-table-column label="申请人" align="center" prop="applierName">
  93. <template #default="scope">
  94. <el-link type="primary" @click="openDetail(scope.row)" style="font-size: 12px;">
  95. {{scope.row.applierName}}</el-link>
  96. </template>
  97. </el-table-column>
  98. <el-table-column label="合同类型" align="center" prop="contractType">
  99. </el-table-column>
  100. <el-table-column label="是否是项目" align="center" prop="isProject">
  101. </el-table-column>
  102. <el-table-column label="项目名称" align="center">
  103. <template #default="scope">
  104. {{scope.row.projectName}}
  105. </template>
  106. </el-table-column>
  107. <el-table-column label="服务金额" align="center" prop="detailAllAmount">
  108. </el-table-column>
  109. <el-table-column label="实收" align="center" prop="reallyDetailAmount">
  110. <template #default="scope">
  111. <el-link type="primary" @click="openDetailIn(scope.row)" style="font-size: 12px;">
  112. {{scope.row.reallyDetailAmount}}</el-link>
  113. </template>
  114. </el-table-column>
  115. <el-table-column label="待收" align="center" prop="waitDetailAmount">
  116. </el-table-column>
  117. <el-table-column label="支出" align="center" prop="outAmount">
  118. <template #default="scope">
  119. <el-link type="primary" @click="openDetailOut(scope.row)" style="font-size: 12px;">
  120. {{scope.row.outAmount}}</el-link>
  121. </template>
  122. </el-table-column>
  123. <el-table-column label="审核人" align="center" prop="verifyName" >
  124. </el-table-column>
  125. <el-table-column label="审核时间" align="center" prop="examineTime" >
  126. </el-table-column>
  127. </el-table>
  128. <!-- 分页 -->
  129. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
  130. v-model:limit="queryParams.pageSize" @pagination="getList" />
  131. <el-dialog title="提收款详情" v-model="open" width="auto" append-to-body>
  132. <div v-if="inData.length > 0">
  133. <div>
  134. <span>收款情况</span>
  135. </div>
  136. <el-table v-loading="loading" :data="inData" size="small" border height="100%">
  137. <el-table-column label="序号" align="center" type="index" />
  138. <el-table-column label="公司名称" width="230" align="center" prop="companyName" />
  139. <el-table-column label="产品名称" width="180" align="center" prop="typeName" />
  140. <el-table-column label="合同编号" width="180" align="center" prop="contractNo" />
  141. <el-table-column label="到账日期" align="center" prop="receiptDate" />
  142. <el-table-column label="提收款金额" align="center" prop="withdrawalAmount" />
  143. <el-table-column label="申请人" width="100" align="center" prop="applierName" />
  144. <el-table-column label="合同类型" align="center" prop="contractType" />
  145. <el-table-column label="是否是项目" align="center" prop="isProject" />
  146. <el-table-column label="服务金额" align="center" prop="detailAllAmount" />
  147. <el-table-column label="实收" align="center" prop="reallyDetailAmount" />
  148. <el-table-column label="审核人" align="center" prop="verifyName" />
  149. <el-table-column label="确认所属时间" align="center" prop="actuallyDate" />
  150. <el-table-column label="审核时间" align="center" prop="examineTime">
  151. <template #default="scope">
  152. {{(scope.row.examineTime === '0000-00-00 00:00:00') ? '' : scope.row.examineTime}}
  153. </template>
  154. </el-table-column>
  155. </el-table>
  156. </div>
  157. <div v-if="outData.length > 0">
  158. <div style="margin-top: 20px;">
  159. <span>支付情况</span>
  160. </div>
  161. <el-table v-loading="loading" :data="outData" size="small" border height="100%">
  162. <el-table-column label="序号" align="center" type="index" />
  163. <el-table-column label="公司名称" width="230" align="center" prop="companyName" />
  164. <el-table-column label="产品名称" width="180" align="center" prop="typeName" />
  165. <el-table-column label="合同编号" width="180" align="center" prop="contractNo" />
  166. <el-table-column label="付款金额" align="center" prop="withdrawalAmount" />
  167. <el-table-column label="申请人" width="100" align="center" prop="applierName" />
  168. <el-table-column label="合同类型" align="center" prop="contractType" />
  169. <!-- <el-table-column label="是否是项目" align="center" prop="isProject" /> -->
  170. <el-table-column label="服务金额" align="center" prop="detailAllAmount" />
  171. <el-table-column label="实收" align="center" prop="reallyDetailAmount" />
  172. <!-- <el-table-column label="审核时间" align="center" prop="examineTime"/> -->
  173. <el-table-column label="审核时间" align="center" prop="examineTime">
  174. <template #default="scope">
  175. {{(scope.row.examineTime === '0000-00-00 00:00:00') ? '' : scope.row.examineTime}}
  176. </template>
  177. </el-table-column>
  178. </el-table>
  179. </div>
  180. <template #footer>
  181. <div class="dialog-footer">
  182. <el-button type="primary" icon="Finished" size="small" @click="open = false">确 定</el-button>
  183. <el-button icon="close" size="small" @click="open = false">取 消</el-button>
  184. </div>
  185. </template>
  186. </el-dialog>
  187. </div>
  188. </template>
  189. <script setup name="Collectcount">
  190. // import {
  191. // statistics
  192. // } from "@/api/business/account";
  193. import {
  194. statistics, listTask, exportStatistics, getByContract
  195. } from "@/api/business/financial/collection";
  196. import { getToken, getTenant } from "@/utils/auth";
  197. const { proxy } = getCurrentInstance();
  198. /** 字典数组区 */
  199. /** 查询 对象 */
  200. const accountList = ref([]);
  201. const inData = ref([]);
  202. const outData = ref([]);
  203. const loading = ref(true);
  204. const ids = ref([]);
  205. const single = ref(true);
  206. const multiple = ref(true);
  207. const total = ref(0);
  208. const open = ref(false);
  209. /** 查询对象 */
  210. const queryParams = ref({
  211. pageNum: 1,
  212. pageSize: 20,
  213. tenantId: getTenant(),
  214. });
  215. const taskType = ref([]);
  216. const contractTypes = ref([
  217. {
  218. label: "新签",
  219. value: 0,
  220. },
  221. {
  222. label: "续签",
  223. value: 1,
  224. },
  225. ]);
  226. const projectTypes = ref([
  227. {
  228. label: "是",
  229. value: 0,
  230. },
  231. {
  232. label: "否",
  233. value: 1,
  234. },
  235. ]);
  236. onActivated(() => {
  237. // 你的逻辑
  238. getList();
  239. });
  240. /*********************** 方法区 ****************************/
  241. listTasks()
  242. /** 查询报表列表 */
  243. function getList() {
  244. loading.value = true;
  245. statistics(queryParams.value).then((response) => {
  246. accountList.value = response.rows;
  247. total.value = response.total;
  248. loading.value = false;
  249. });
  250. }
  251. function listTasks() {
  252. listTask().then(res => {
  253. taskType.value = res;
  254. })
  255. }
  256. /** 搜索按钮操作 */
  257. function handleQuery() {
  258. queryParams.value.pageNum = 1;
  259. getList();
  260. }
  261. /** 重置按钮操作 */
  262. function resetQuery() {
  263. proxy.resetForm("queryRef");
  264. queryParams.value.taskTypeIds = [];
  265. queryParams.value.receiptDateFilter = []
  266. queryParams.value.examineTimeFilter = []
  267. queryParams.value.actuallyDateFilter = []
  268. handleQuery();
  269. }
  270. // 多选框选中数据
  271. function handleSelectionChange(selection) {
  272. ids.value = selection.map((item) => item.id);
  273. single.value = selection.length != 1;
  274. multiple.value = !selection.length;
  275. }
  276. function openDetail(item) {
  277. loading.value = true;
  278. let data = JSON.parse(JSON.stringify(queryParams.value));
  279. data.contractId = item.contractId
  280. data.taskTypeIds.push(item.taskTypeId)
  281. getByContract(data).then((res) => {
  282. if (res.code == 200) {
  283. inData.value = res.data.data.inList
  284. inData.value.forEach(element => {
  285. element.withdrawalAmount = item.withdrawalAmount
  286. });
  287. outData.value = res.data.data.outList
  288. outData.value.forEach(element => {
  289. element.contractType = item.contractType
  290. });
  291. loading.value = false;
  292. open.value = true;
  293. } else {
  294. proxy.$modal.msgError(res.msg);
  295. }
  296. });
  297. }
  298. function openDetailIn(item) {
  299. loading.value = true;
  300. let data = JSON.parse(JSON.stringify(queryParams.value));
  301. data.contractId = item.contractId
  302. data.taskTypeIds.push(item.taskTypeId)
  303. getByContract(data).then((res) => {
  304. if (res.code == 200) {
  305. inData.value = res.data.data.inList
  306. inData.value.forEach(element => {
  307. element.withdrawalAmount = item.withdrawalAmount
  308. });
  309. outData.value = []
  310. loading.value = false;
  311. open.value = true;
  312. } else {
  313. proxy.$modal.msgError(res.msg);
  314. }
  315. });
  316. }
  317. function openDetailOut(item) {
  318. loading.value = true;
  319. let data = JSON.parse(JSON.stringify(queryParams.value));
  320. data.contractId = item.contractId
  321. data.taskTypeIds.push(item.taskTypeId)
  322. getByContract(data).then((res) => {
  323. if (res.code == 200) {
  324. outData.value = res.data.data.outList
  325. outData.value.forEach(element => {
  326. element.contractType = item.contractType
  327. });
  328. inData.value = []
  329. loading.value = false;
  330. open.value = true;
  331. } else {
  332. proxy.$modal.msgError(res.msg);
  333. }
  334. });
  335. }
  336. /** 保存按钮操作 */
  337. function handleSave(row) {
  338. if (row.name == null || row.name == "") {
  339. proxy.$modal.msgError("账户名称不能为空!");
  340. return;
  341. }
  342. if (row.accountNum == null || row.accountNum == "") {
  343. proxy.$modal.msgError("账号不能为空!");
  344. return;
  345. }
  346. if (row.isAdd) {
  347. addAccount(row).then((response) => {
  348. proxy.$modal.msgSuccess("添加成功");
  349. visible.value = false;
  350. getList.value();
  351. });
  352. row.isAdd = false;
  353. getList();
  354. getList();
  355. }
  356. if (row.isEdit) {
  357. updateAccount(row).then((response) => {
  358. proxy.$modal.msgSuccess("修改成功");
  359. visible.value = false;
  360. getList.value();
  361. });
  362. queryParams.isEdit = false;
  363. getList();
  364. }
  365. getList();
  366. }
  367. /** 新增按钮操作 */
  368. function handleAdd() {
  369. // 此处必须进行深拷贝,否则添加的明细,将都指向了一个对象
  370. const _newSource = JSON.parse(JSON.stringify(queryParams.value));
  371. accountList.value.push(_newSource);
  372. handleSourceCurrentChange(_newSource);
  373. }
  374. /** 取消按钮操作 */
  375. function handCancel(row) {
  376. if (row.isEdit) row.isEdit = false;
  377. else accountList.value.length = accountList.value.length - 1;
  378. }
  379. /** 修改按钮操作 */
  380. function handleSourceCurrentChange(row) {
  381. row.isAdd = true;
  382. }
  383. /** 修改按钮操作 */
  384. function handleUpdate(row) {
  385. row.isEdit = true;
  386. }
  387. /** 删除按钮操作 */
  388. function handleDelete(row) {
  389. const _ids = row.id || ids.value;
  390. proxy.$modal
  391. .confirm("是否确认删除选中的数据项?")
  392. .then(function () {
  393. return delAccount(_ids);
  394. })
  395. .then(() => {
  396. getList();
  397. proxy.$modal.msgSuccess("删除成功!");
  398. })
  399. .catch(() => { });
  400. }
  401. /** 导出按钮操作 */
  402. function handleExport() {
  403. exportStatistics(queryParams.value);
  404. }
  405. const actuallyDateFormat = (actuallyDate) => {
  406. let str = "";
  407. actuallyDate.split(",").forEach((s)=>{
  408. if(s !== "0000-00-00"){
  409. str+=s+",";
  410. }
  411. })
  412. str = str.substring(0,str.length-1);
  413. return str;
  414. }
  415. getList();
  416. </script>