query.vue 16 KB

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