query.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. <template>
  2. <div class="paddingLeft">
  3. <!-- <TitleBar propTitle="经营数据查询" /> -->
  4. <el-form :model="form" ref="form" class="marginTop">
  5. <el-form-item label="查询类别" :label-width="formLabelWidth">
  6. <el-radio-group
  7. v-model="form.type"
  8. placeholder="请选择类别"
  9. size="medium"
  10. :rules="[{ required: true, message: '必选'}]"
  11. style="width:100%"
  12. @change="radioChange"
  13. >
  14. <el-row :gutter="10">
  15. <el-col :span="4">
  16. <el-radio border style="width:100%;" label="INCOME">收入</el-radio>
  17. </el-col>
  18. <el-col :span="4">
  19. <el-radio border style="width:100%;" label="COST">成本</el-radio>
  20. </el-col>
  21. </el-row>
  22. </el-radio-group>
  23. </el-form-item>
  24. <el-form-item label="时间范围" v-if="form.type!==''" :label-width="formLabelWidth">
  25. <el-row :gutter="10">
  26. <el-col :span="4">
  27. <el-date-picker placeholder="起始时间" style="width:100%" value-format="yyyy-MM-dd" v-model="form.startTime"></el-date-picker>
  28. </el-col>
  29. <el-col :span="4">
  30. <el-date-picker placeholder="结束时间" style="width:100%" value-format="yyyy-MM-dd" v-model="form.endTime"></el-date-picker>
  31. </el-col>
  32. </el-row>
  33. </el-form-item>
  34. <!-- <el-form-item label="金额范围" v-if="form.type!==''" :label-width="formLabelWidth">
  35. <el-row :gutter="10">
  36. <el-col :span="4">
  37. <el-input placeholder="起始金额" style="width:100%" v-model="form.minAmount" clearable></el-input>
  38. </el-col>
  39. <el-col :span="4">
  40. <el-input placeholder="结束金额" style="width:100%" v-model="form.maxAmount" clearable></el-input>
  41. </el-col>
  42. </el-row>
  43. </el-form-item>-->
  44. <el-form-item
  45. label="成本类型"
  46. v-if="form.type==='COST'"
  47. prop="costTypeId"
  48. :label-width="formLabelWidth"
  49. >
  50. <el-select v-model="form.costTypeId" multiple placeholder="全选" ref="select">
  51. <el-option
  52. v-for="item in costTypeSelectData"
  53. :key="item.id"
  54. :label="item.name"
  55. :value="item.id"
  56. ></el-option>
  57. </el-select>
  58. </el-form-item>
  59. <el-form-item label="收入状态" v-if="form.type==='INCOME'" :label-width="formLabelWidth">
  60. <el-select v-model="form.incomeStatus" multiple placeholder="全选">
  61. <el-option
  62. v-for="item in incomeStatus"
  63. :key="item.id"
  64. :label="item.name"
  65. :value="item.id"
  66. ></el-option>
  67. </el-select>
  68. </el-form-item>
  69. <el-form-item
  70. label="归属产品"
  71. v-if="form.type==='INCOME'"
  72. prop="productId"
  73. :label-width="formLabelWidth"
  74. >
  75. <el-select v-model="form.productId" multiple placeholder="全选">
  76. <el-option
  77. v-for="item in productSelectData"
  78. :key="item.id"
  79. :label="item.code +'--'+ item.name"
  80. :value="item.id"
  81. ></el-option>
  82. </el-select>
  83. </el-form-item>
  84. <el-form-item
  85. label="归属项目"
  86. v-if="form.type!==''"
  87. prop="projectId"
  88. :label-width="formLabelWidth"
  89. >
  90. <el-select v-model="form.projectId" multiple placeholder="全选">
  91. <el-option
  92. v-for="item in projectSelectData"
  93. :key="item.id"
  94. :label="item.code +'--'+ item.name"
  95. :value="item.id"
  96. ></el-option>
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item
  100. label="归属部门"
  101. prop="deptId"
  102. multiple
  103. v-if="form.type!==''"
  104. :label-width="formLabelWidth"
  105. >
  106. <el-select v-model="form.deptId" multiple placeholder="全选" ref="select">
  107. <el-option
  108. v-for="item in teamSelectData"
  109. :key="item.id"
  110. :label="item.code +'--'+ item.name"
  111. :value="item.id"
  112. ></el-option>
  113. </el-select>
  114. </el-form-item>
  115. <!-- <el-form-item
  116. label="来源项目"
  117. prop="toProjectId"
  118. v-if="form.type==='INCOME'"
  119. :label-width="formLabelWidth"
  120. >
  121. <el-select v-model="form.toProjectId" multiple placeholder="全选">
  122. <el-option
  123. v-for="item in projectSelectData"
  124. :key="item.id"
  125. :label="item.code +'--'+ item.name"
  126. :value="item.id"
  127. ></el-option>
  128. </el-select>
  129. </el-form-item>-->
  130. <el-form-item
  131. label="客户名称"
  132. prop="toDeptId"
  133. v-if="form.type==='INCOME'"
  134. :label-width="formLabelWidth"
  135. >
  136. <el-select v-model="form.toDeptId" multiple placeholder="全选" ref="select">
  137. <el-option
  138. v-for="item in customerSelectData"
  139. :key="item.id"
  140. :label="item.code +'--'+ item.name"
  141. :value="item.id"
  142. ></el-option>
  143. </el-select>
  144. </el-form-item>
  145. <!-- <el-form-item
  146. label="接收项目"
  147. prop="toProjectId"
  148. v-if="form.type==='COST'"
  149. :label-width="formLabelWidth"
  150. >
  151. <el-select v-model="form.toProjectId" multiple placeholder="全选">
  152. <el-option
  153. v-for="item in projectSelectData"
  154. :key="item.id"
  155. :label="item.code +'--'+ item.name"
  156. :value="item.id"
  157. ></el-option>
  158. </el-select>
  159. </el-form-item>-->
  160. <el-form-item
  161. label="供应商名称"
  162. prop="toDeptId"
  163. v-if="form.type==='COST'"
  164. :label-width="formLabelWidth"
  165. >
  166. <el-select v-model="form.toDeptId" multiple placeholder="全选" ref="select">
  167. <el-option
  168. v-for="item in providerSelectData"
  169. :key="item.id"
  170. :label="item.code +'--'+ item.name"
  171. :value="item.id"
  172. ></el-option>
  173. </el-select>
  174. </el-form-item>
  175. <el-form-item style="position: absolute; width:23%; left:300px;">
  176. <el-button type="primary" @click="onSubmit">查询</el-button>
  177. <!-- <el-button type="info" @click="onReset">重置</el-button> -->
  178. </el-form-item>
  179. <!-- <el-form-item>
  180. <el-button type="info" @click="reset">重置</el-button>
  181. </el-form-item>-->
  182. </el-form>
  183. <!-- 查询结果收入表 -->
  184. <div class="inline-btn">
  185. <div class="totalSumDiv">全部金额合计:{{totalSum}}</div>
  186. <div class="downloadBtn" v-if="searchResult.length !== 0">
  187. <el-button type="primary" @click="onDownload">下载本表</el-button>
  188. </div>
  189. </div>
  190. <el-table
  191. :data="searchResult"
  192. style="margin-top:30px;"
  193. :summary-method="tableSummary"
  194. show-summary
  195. v-if="tableType === 'INCOME'"
  196. border
  197. >
  198. <el-table-column
  199. prop="happenTime"
  200. width="120px"
  201. align="right"
  202. :formatter="dateFormat"
  203. label="发生日期"
  204. ></el-table-column>
  205. <el-table-column
  206. :formatter="moneyFormat"
  207. prop="amount"
  208. width="130px"
  209. align="right"
  210. label="金额"
  211. ></el-table-column>
  212. <el-table-column
  213. label="收入状态"
  214. width="130px"
  215. align="right"
  216. prop="incomeStatus"
  217. :formatter="incomeTypeFormat"
  218. ></el-table-column>
  219. <el-table-column label="产品" width="200px" align="right" prop="product.name"></el-table-column>
  220. <el-table-column label="归属项目" width="235px" align="right" prop="project.name"></el-table-column>
  221. <el-table-column label="归属部门" width="250px" align="right" prop="department.name"></el-table-column>
  222. <!-- <el-table-column label="来源项目" width="235px" align="right" prop="toProject.name"></el-table-column> -->
  223. <el-table-column label="客户名称" width="300px" align="right" prop="toDepartment.name"></el-table-column>
  224. <el-table-column prop="remark" min-width="300px" align="right" label="备注"></el-table-column>
  225. <el-table-column
  226. width="120px"
  227. align="right"
  228. label="录入日期"
  229. :formatter="recordTimeFormat"
  230. prop="gmtModife"
  231. ></el-table-column>
  232. </el-table>
  233. <!-- 查询结果成本表 -->
  234. <el-table
  235. :data="searchResult"
  236. style="margin-top:30px;"
  237. show-summary
  238. :summary-method="tableSummary"
  239. v-if="tableType === 'COST'"
  240. border
  241. >
  242. <el-table-column
  243. prop="happenTime"
  244. width="120px"
  245. align="right"
  246. :formatter="dateFormat"
  247. label="发生日期"
  248. ></el-table-column>
  249. <el-table-column
  250. :formatter="moneyFormat"
  251. prop="amount"
  252. width="130px"
  253. align="right"
  254. label="金额"
  255. ></el-table-column>
  256. <el-table-column label="成本类别" width="270px" align="right" prop="costType.name"></el-table-column>
  257. <el-table-column label="发生部门" width="240px" align="right" prop="department.name"></el-table-column>
  258. <el-table-column label="发生项目/人" width="245px" align="right" prop="project.name"></el-table-column>
  259. <!-- <el-table-column label="接收项目" width="235px" align="right" prop="toProject.name"></el-table-column> -->
  260. <el-table-column label="供应商名称" width="310px" align="right" prop="toDepartment.name"></el-table-column>
  261. <el-table-column label="备注" min-width="300px" align="right" prop="remark"></el-table-column>
  262. <el-table-column
  263. width="120px"
  264. align="right"
  265. label="录入日期"
  266. :formatter="recordTimeFormat"
  267. prop="gmtModife"
  268. ></el-table-column>
  269. </el-table>
  270. <!-- 分页 -->
  271. <el-pagination
  272. background
  273. @current-change="handlePageChange"
  274. :page-size="50"
  275. :current-page.sync="pageNo"
  276. layout="prev, pager, next"
  277. v-if="searchResult && searchResult.length!==0"
  278. :total="totalNumber"
  279. ></el-pagination>
  280. </div>
  281. </template>
  282. <script>
  283. import {
  284. getTeamSelect,
  285. getProjectSelect,
  286. getProductSelect,
  287. getCostTeamSelect,
  288. getCostTypeSelect,
  289. addManage,
  290. getManageList,
  291. setManage,
  292. downloadData
  293. } from "@/api/manageApi";
  294. import TitleBar from "../layout/titleBar/TitleBar.vue";
  295. import { formatTime } from "../../utils/common";
  296. const statusOptions = ["INVOICE", "ARRIVAL", "INTERNAL"];
  297. export default {
  298. components: {
  299. TitleBar
  300. },
  301. data() {
  302. return {
  303. type: "",
  304. dialogFormVisible: false,
  305. addFlag: false,
  306. id: "",
  307. searchResult: [],
  308. form: {
  309. type: "INCOME",
  310. productId: [],
  311. projectId: [],
  312. toDeptId: "",
  313. toProjectId: "",
  314. deptId: [],
  315. incomeStatus: [],
  316. status: "NORMAL",
  317. costTypeId: [],
  318. startTime: "",
  319. endTime: "",
  320. minAmount: "",
  321. maxAmount: "",
  322. isEntry: false,
  323. pageNo: 1,
  324. pageSize: 50
  325. },
  326. pageNo: 1,
  327. pageSize: 50,
  328. totalNumber: 0,
  329. formLabelWidth: "120px",
  330. teamSelectData: [],
  331. projectSelectData: [],
  332. productSelectData: [],
  333. costTeamSelectData: [],
  334. costTypeSelectData: [],
  335. providerSelectData: [],
  336. customerSelectData: [],
  337. manageData: [],
  338. companyData: [],
  339. tableType: "",
  340. isIndeterminate: true,
  341. checkAll: false,
  342. totalSum: 0, // 后台返回的合计
  343. incomeStatus: [
  344. { name: "开票/应收", id: "INVOICE" },
  345. { name: "到账", id: "ARRIVAL" },
  346. { name: "内部核算", id: "INTERNAL" }
  347. ]
  348. };
  349. },
  350. created() {
  351. // 获取部门下拉框
  352. getTeamSelect("COMPANY").then(res => {
  353. this.teamSelectData = res.data;
  354. });
  355. // 获取项目下拉框
  356. getProjectSelect().then(res => {
  357. this.projectSelectData = res.data;
  358. });
  359. //获取产品下拉框
  360. getProductSelect().then(res => {
  361. this.productSelectData = res.data;
  362. });
  363. //获取供应商下拉
  364. getTeamSelect("OTHERS").then(res => {
  365. this.providerSelectData = res.data;
  366. });
  367. //获取客户下拉
  368. getTeamSelect("PARTNER").then(res => {
  369. this.customerSelectData = res.data;
  370. });
  371. //获取成本类型下拉
  372. getCostTypeSelect().then(res => {
  373. this.costTypeSelectData = res.data;
  374. });
  375. },
  376. methods: {
  377. // 收入或成本变化时 清空一些条件
  378. radioChange() {
  379. this.form.toDeptId = "";
  380. this.form.incomeStatus = [];
  381. this.form.productId = [];
  382. this.form.costTypeId = [];
  383. },
  384. // 下载表格
  385. onDownload() {
  386. // this.form.startTime = this.form.startTime === null ? '' : typeof this.form.startTime === 'object' ? this.form.startTime.toString() : this.form.startTime;
  387. // this.form.endTime = this.form.endTime === null ? '' : typeof this.form.endTime === 'object' ? this.form.endTime.toString() : this.form.endTime;
  388. let url = "http://manage.ai160.com/manageBase/manage/export?";
  389. for (let key in this.form) {
  390. let str = key + "=" + this.form[key] + "&";
  391. url += str;
  392. }
  393. window.open(url.slice(0, -1));
  394. },
  395. // 自定义合计
  396. tableSummary(param) {
  397. const { columns, data } = param;
  398. const sums = [];
  399. columns.forEach((column, index) => {
  400. switch (column.property) {
  401. case "happenTime":
  402. sums[index] = "本页合计";
  403. break;
  404. // case "happenTime":
  405. // sums[index] = "";
  406. // break;
  407. case "amount":
  408. const amountNum = data.map(item => Number(item["amount"]));
  409. let amountTemp = amountNum.reduce((prev, cur) => {
  410. // const sum = prev.toFixed(2) + cur.toFixed(2);
  411. return (parseFloat(prev) + parseFloat(cur)).toFixed(2);
  412. }, 0);
  413. sums[index] = this.moneyFormatNew(amountTemp);
  414. break;
  415. case "remark":
  416. sums[index] = "全部合计:";
  417. break;
  418. case "gmtModife":
  419. sums[index] = this.totalSum;
  420. break;
  421. default:
  422. break;
  423. }
  424. });
  425. return sums;
  426. },
  427. // 金额格式化
  428. moneyFormat(row) {
  429. let num = row.amount.toFixed(2);
  430. num += "";
  431. return num.replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) {
  432. return $1 + ",";
  433. });
  434. },
  435. // 重写一遍 方便接收参数
  436. moneyFormatNew(amount) {
  437. let num = parseFloat(amount).toFixed(2);
  438. num += "";
  439. num = num.replace(/^-/,'');
  440. return num.replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) {
  441. return $1 + ",";
  442. });
  443. },
  444. // 全选
  445. handleCheckAllChange(val) {
  446. this.form.incomeStatus = val ? statusOptions : [];
  447. this.isIndeterminate = false;
  448. this.checkAll = val;
  449. },
  450. handlePageChange(val) {
  451. this.form.pageNo = val;
  452. this.$post("manageBase/manage/search", this.form).then(response => {
  453. this.searchResult = response.data.content;
  454. this.totalNumber = parseInt(response.data.totalElements);
  455. this.pageNo = parseInt(response.data.number) + 1;
  456. if (response.data && response.data.length == 0) {
  457. this.$message("未找到相应数据");
  458. }
  459. });
  460. },
  461. onSubmit() {
  462. // this.totalNumber = 0;
  463. this.searchResult = [];
  464. if (this.form.type === "INCOME") {
  465. this.tableType = "INCOME";
  466. }
  467. if (this.form.type === "COST") {
  468. this.tableType = "COST";
  469. }
  470. this.form.pageNo = 1;
  471. this.$post("manageBase/manage/search", this.form).then(response => {
  472. if (response.data && response.data.length == 0) {
  473. this.totalSum = 0;
  474. this.$message("未找到相应数据");
  475. return;
  476. }
  477. this.searchResult = response.data.content;
  478. this.totalNumber = parseInt(response.data.totalElements);
  479. this.pageNo = parseInt(response.data.number) + 1;
  480. this.totalSum = this.moneyFormatNew(
  481. response.data.content[0].totalAmount
  482. );
  483. });
  484. },
  485. onReset() {
  486. this.form.type = "";
  487. this.form.costTypeId = "";
  488. this.tableType = "";
  489. this.searchResult = "";
  490. this.$refs.form.resetFields();
  491. },
  492. tableRowClassName({ row, rowIndex }) {
  493. if (row.type === "COST") {
  494. return "cost-row-search";
  495. } else {
  496. return "income-row-search";
  497. }
  498. // return "";
  499. },
  500. //获取部门名称
  501. getName(val) {
  502. let obj = {};
  503. obj = this.teamSelectData.find(item => {
  504. return item.id === val;
  505. });
  506. let getName = "";
  507. this.form.deptName = obj.name;
  508. },
  509. // 添加
  510. append(type) {
  511. this.type = type;
  512. this.dialogFormVisible = true;
  513. this.addFlag = true;
  514. },
  515. // 格式化时间
  516. dateFormat(row, column) {
  517. return formatTime(row.happenTime);
  518. },
  519. recordTimeFormat(row) {
  520. return formatTime(row.gmtModified);
  521. },
  522. incomeTypeFormat(row) {
  523. return row.incomeStatus == "INVOICE"
  524. ? "开票/应收"
  525. : row.incomeStatus == "ARRIVAL"
  526. ? "到账"
  527. : "内部核算";
  528. }
  529. }
  530. };
  531. </script>
  532. <style scope>
  533. .paddingLeft {
  534. padding: 0 20px 0 20px;
  535. }
  536. .marginTop {
  537. margin-top: 20px;
  538. }
  539. .el-table .cost-row-search {
  540. /* color: green; */
  541. /* background: #f0f9eb; */
  542. color: green;
  543. }
  544. .el-table .income-row-search {
  545. /* color: red; */
  546. /* background: rgba(248, 181, 172, 0.267); */
  547. color: red;
  548. /* color: #f0f9eb; */
  549. }
  550. .totalSumDiv {
  551. width: 100%;
  552. /* text-align: right; */
  553. padding-left: 120px;
  554. display: block;
  555. /* margin-top: 80px; */
  556. }
  557. .inline-btn {
  558. display: flex;
  559. flex-direction: row;
  560. align-items: center;
  561. margin-top: 80px;
  562. width: 500px;
  563. }
  564. </style>