shouKuang.jsx 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. import React from "react";
  2. import $ from "jquery/src/ajax";
  3. import moment from "moment";
  4. import "./public.less";
  5. import {
  6. Button,
  7. Form,
  8. Input,
  9. Spin,
  10. Table,
  11. Select,
  12. message,
  13. DatePicker,
  14. Modal
  15. } from "antd";
  16. import OrderDesc from "../orderDetail/orderDesc";
  17. import Receivable from "./receivable";
  18. import Assign from "@/manageCenter/publicComponent/assign";
  19. import { getLiquidationStatus, getProcessStatus, getApproval } from "@/tools";
  20. const FormItem = Form.Item;
  21. const ShouKuang = React.createClass({
  22. departmentList() {
  23. this.setState({
  24. loading: true
  25. });
  26. $.ajax({
  27. method: "get",
  28. dataType: "json",
  29. crossDomain: false,
  30. url: globalConfig.context + "/api/admin/organization/selectSuperId",
  31. data: {},
  32. success: function(data) {
  33. let thedata = data.data;
  34. let theArr = [];
  35. if (!thedata) {
  36. if (data.error && data.error.length) {
  37. message.warning(data.error[0].message);
  38. }
  39. } else {
  40. thedata.map(function(item, index) {
  41. theArr.push({
  42. key: index,
  43. name: item.name,
  44. id: item.id
  45. });
  46. });
  47. }
  48. this.setState({
  49. departmentArr: theArr
  50. });
  51. }.bind(this)
  52. }).always(
  53. function() {
  54. this.setState({
  55. loading: false
  56. });
  57. }.bind(this)
  58. );
  59. },
  60. loadData(pageNo) {
  61. this.state.data = [];
  62. this.setState({
  63. selectedRowKeys: [],
  64. selectedRowKey: [],
  65. page: pageNo,
  66. loading: true
  67. });
  68. $.ajax({
  69. method: "get",
  70. dataType: "json",
  71. crossDomain: false,
  72. url: globalConfig.context + "/api/admin/financial/financeList",
  73. data: {
  74. pageNo: pageNo || 1,
  75. pageSize: this.state.pagination.pageSize,
  76. buyerName: this.state.nameSearch, //客户名称
  77. orderNo: this.state.orderNoSearch,
  78. startTime: this.state.releaseDate[0],
  79. endTime: this.state.releaseDate[1],
  80. departmentId: this.state.departmenttList,
  81. processStatus: this.state.processStatusSearch,
  82. contractNo: this.state.contractNoSearch
  83. },
  84. success: function(data) {
  85. let theArr = [];
  86. if (!data.data || !data.data.list) {
  87. if (data.error && data.error.length) {
  88. message.warning(data.error[0].message);
  89. }
  90. } else {
  91. for (let i = 0; i < data.data.list.length; i++) {
  92. let thisdata = data.data.list[i];
  93. theArr.push({
  94. key: i,
  95. orderNo: thisdata.orderNo,
  96. orderType: thisdata.orderType,
  97. orderStatus: thisdata.orderStatus,
  98. sellerName: thisdata.sellerName,
  99. processStatus: thisdata.processStatus,
  100. liquidationStatus: thisdata.liquidationStatus,
  101. approval: thisdata.approval,
  102. buyerName: thisdata.buyerName,
  103. actuallyTotalAmount: thisdata.actuallyTotalAmount,
  104. signTime: thisdata.signTime,
  105. companyId: thisdata.companyId,
  106. companyName: thisdata.companyName,
  107. buyerId: thisdata.buyerId,
  108. buyerName: thisdata.buyerName,
  109. contractNo: thisdata.contractNo,
  110. createTime: thisdata.createTime,
  111. departmentName: thisdata.departmentName
  112. });
  113. }
  114. }
  115. this.state.pagination.current = data.data.pageNo;
  116. this.state.pagination.total = data.data.totalCount;
  117. if (data.data && data.data.list && !data.data.list.length) {
  118. this.state.pagination.current = 0;
  119. this.state.pagination.total = 0;
  120. }
  121. this.setState({
  122. totalPage: data.data.totalPage,
  123. dataSource: theArr,
  124. pagination: this.state.pagination
  125. });
  126. }.bind(this)
  127. }).always(
  128. function() {
  129. this.setState({
  130. loading: false
  131. });
  132. }.bind(this)
  133. );
  134. },
  135. getInitialState() {
  136. return {
  137. searchMore: true,
  138. assignVisibleX: false,
  139. assignVisibleY: false,
  140. releaseDate: [],
  141. assignDataX: [],
  142. assignDataY: [],
  143. totalPage: 0,
  144. processStatusSearch: "3",
  145. boHuivisible: false,
  146. selectedRowKeys: [],
  147. selectedRows: [],
  148. loading: false,
  149. pagination: {
  150. defaultCurrent: 1,
  151. defaultPageSize: 10,
  152. showQuickJumper: true,
  153. pageSize: 10,
  154. onChange: function(page) {
  155. this.loadData(page);
  156. }.bind(this),
  157. showTotal: function(total) {
  158. return "共" + total + "条数据";
  159. }
  160. },
  161. columns: [
  162. {
  163. title: "订单编号",
  164. dataIndex: "orderNo",
  165. key: "orderNo",
  166. fixed: "left"
  167. },
  168. {
  169. title: "签单日期",
  170. dataIndex: "signTime",
  171. key: "signTime"
  172. },
  173. {
  174. title: "下单日期",
  175. dataIndex: "createTime",
  176. key: "createTime"
  177. },
  178. {
  179. title: "已收款(万元)",
  180. dataIndex: "actuallyTotalAmount",
  181. key: "actuallyTotalAmount"
  182. },
  183. {
  184. title: "客户名称",
  185. dataIndex: "buyerName",
  186. key: "buyerName"
  187. },
  188. {
  189. title: "流程状态",
  190. dataIndex: "processStatus",
  191. key: "processStatus",
  192. render: text => {
  193. return getProcessStatus(text);
  194. }
  195. },
  196. {
  197. title: "订单部门",
  198. dataIndex: "departmentName",
  199. key: "departmentName"
  200. },
  201. {
  202. title: "特批状态",
  203. dataIndex: "approval",
  204. key: "approval",
  205. render: text => {
  206. return getApproval(text);
  207. }
  208. },
  209. {
  210. title: "合同编号",
  211. dataIndex: "contractNo",
  212. key: "contractNo"
  213. },
  214. // {
  215. // title: '订单状态',
  216. // dataIndex: 'orderStatus',
  217. // key: 'orderStatus',
  218. // render: text => { return getNewOrderStatus(text)}
  219. // },
  220. {
  221. title: "订单负责人",
  222. dataIndex: "sellerName",
  223. key: "sellerName"
  224. },
  225. {
  226. title: "结算状态",
  227. dataIndex: "liquidationStatus",
  228. key: "liquidationStatus",
  229. render: text => {
  230. return getLiquidationStatus(text);
  231. }
  232. },
  233. {
  234. title: "操作",
  235. dataIndex: "caozuo",
  236. key: "caouzo",
  237. render: (text, recard) => {
  238. return (
  239. <div>
  240. {recard.liquidationStatus < 2 &&
  241. (recard.approval === 1 || recard.approval === 2) ? (
  242. <Button
  243. style={{ background: "rgb(192,192,192)" }}
  244. onClick={e => {
  245. e.stopPropagation(), this.evaluateX(recard);
  246. }}
  247. >
  248. 收款
  249. </Button>
  250. ) : (
  251. <Button
  252. type="primary"
  253. onClick={e => {
  254. e.stopPropagation(), this.evaluateX(recard);
  255. }}
  256. >
  257. 收款
  258. </Button>
  259. )}
  260. {recard.approval === 2 && recard.processStatus < 4 ? (
  261. <Button
  262. type="primary"
  263. onClick={e => {
  264. e.stopPropagation(), this.evaluateZ(recard);
  265. }}
  266. style={{ marginLeft: "5px" }}
  267. >
  268. 通过
  269. </Button>
  270. ) : (
  271. ""
  272. )}
  273. {!(
  274. recard.actuallyTotalAmount &&
  275. Number(recard.actuallyTotalAmount) > 0
  276. ) && (
  277. <Button
  278. type="danger"
  279. style={{ marginLeft: "5px" }}
  280. onClick={e => {
  281. e.stopPropagation(), this.reject(recard);
  282. }}
  283. >
  284. 驳回
  285. </Button>
  286. )}
  287. {
  288. <Button
  289. type="primary"
  290. style={{ marginLeft: "5px" }}
  291. onClick={e => {
  292. e.stopPropagation(), this.evaluateY(recard, "财务专员");
  293. }}
  294. >
  295. 转交
  296. </Button>
  297. }
  298. </div>
  299. );
  300. }
  301. }
  302. ],
  303. dataSource: [],
  304. searchTime: [,]
  305. };
  306. },
  307. // 特批通过
  308. evaluateZ(record) {
  309. $.ajax({
  310. method: "POST",
  311. dataType: "json",
  312. crossDomain: false,
  313. url: globalConfig.context + "/api/admin/financial/financeApproval",
  314. data: {
  315. orderNo: record.orderNo
  316. }
  317. }).done(
  318. function(data) {
  319. if (!data.error.length) {
  320. message.success("通过成功!");
  321. this.setState({
  322. loading: false
  323. });
  324. this.loadData();
  325. } else {
  326. message.warning(data.error[0].message);
  327. }
  328. }.bind(this)
  329. );
  330. },
  331. /* 收款 */
  332. evaluateX(recard) {
  333. this.state.assignDataX = recard;
  334. this.setState({
  335. assignVisibleX: true
  336. });
  337. },
  338. /* 转交 */
  339. evaluateY(recard, nub) {
  340. this.state.assignDataY = recard;
  341. this.setState({
  342. nub,
  343. assignVisibleY: true
  344. });
  345. },
  346. /* 驳回 */
  347. reject(recard) {
  348. this.setState({
  349. bohuiData: recard,
  350. boHuiVisible: true,
  351. content: ""
  352. });
  353. },
  354. boHuiOk() {
  355. this.setState({
  356. boHuiVisible: false
  357. });
  358. if (
  359. this.state.pagination.current == this.state.totalPage &&
  360. this.state.pagination.total % 10 == 1
  361. ) {
  362. this.loadData(this.state.page - 1);
  363. } else {
  364. this.loadData(this.state.page);
  365. }
  366. },
  367. boHuiCancel() {
  368. this.setState({
  369. boHuiVisible: false
  370. });
  371. },
  372. componentWillMount() {
  373. this.loadData();
  374. this.departmentList();
  375. },
  376. tableRowClick(record) {
  377. this.state.RowData = record;
  378. this.setState({
  379. showDesc: true
  380. });
  381. },
  382. closeDesc(e, s) {
  383. this.state.showDesc = e;
  384. if (s) {
  385. this.loadData(this.state.page);
  386. }
  387. },
  388. closeAssignX(e, s) {
  389. this.state.assignDataX = {};
  390. this.state.assignVisibleX = e;
  391. if (s) {
  392. this.loadData(this.state.page);
  393. }
  394. },
  395. closeAssignY(e, s) {
  396. this.state.assignDataY = {};
  397. this.state.assignVisibleY = e;
  398. if (s) {
  399. this.loadData(this.state.page);
  400. }
  401. },
  402. search() {
  403. this.loadData();
  404. },
  405. reset() {
  406. this.state.nameSearch = "";
  407. this.state.releaseDate = [];
  408. this.state.orderNoSearch = "";
  409. this.state.departmenttList = undefined;
  410. this.state.processStatus = [];
  411. this.state.contractNoSearch = "";
  412. this.loadData();
  413. },
  414. //驳回
  415. boHuiSubmit(e) {
  416. e.preventDefault();
  417. if (!this.state.content) {
  418. message.warning("请填写驳回原因");
  419. return false;
  420. }
  421. this.setState({
  422. loading: true
  423. });
  424. $.ajax({
  425. method: "POST",
  426. dataType: "json",
  427. crossDomain: false,
  428. url: globalConfig.context + "/api/admin/financial/reject",
  429. data: {
  430. orderNo: this.state.bohuiData.orderNo,
  431. reason: this.state.content
  432. }
  433. }).done(
  434. function(data) {
  435. if (!data.error.length) {
  436. message.success("驳回成功!");
  437. this.setState({
  438. loading: false
  439. });
  440. this.boHuiOk();
  441. } else {
  442. message.warning(data.error[0].message);
  443. }
  444. }.bind(this)
  445. );
  446. },
  447. searchSwitch() {
  448. this.setState({
  449. searchMore: !this.state.searchMore
  450. });
  451. },
  452. render() {
  453. const { RangePicker } = DatePicker;
  454. var departmentArr = this.state.departmentArr || [];
  455. return (
  456. <div className="user-content">
  457. <div className="content-title">
  458. <span>收款结算</span>
  459. </div>
  460. <div className="user-search">
  461. <Input
  462. placeholder="订单编号"
  463. value={this.state.orderNoSearch}
  464. onChange={e => {
  465. this.setState({ orderNoSearch: e.target.value });
  466. }}
  467. />
  468. <Input
  469. placeholder="客户名称"
  470. value={this.state.nameSearch}
  471. onChange={e => {
  472. this.setState({ nameSearch: e.target.value });
  473. }}
  474. />
  475. <Select
  476. placeholder="订单部门"
  477. style={{ width: 150, marginRight: 10 }}
  478. value={this.state.departmenttList}
  479. onChange={e => {
  480. this.setState({ departmenttList: e });
  481. }}
  482. >
  483. {departmentArr.map(function(item) {
  484. return <Select.Option key={item.id}>{item.name}</Select.Option>;
  485. })}
  486. </Select>
  487. <Input
  488. placeholder="合同编号"
  489. value={this.state.contractNoSearch}
  490. onChange={e => {
  491. this.setState({
  492. contractNoSearch: e.target.value
  493. });
  494. }}
  495. />
  496. <Select
  497. placeholder="流程状态"
  498. onChange={e => {
  499. this.setState({ processStatusSearch: e });
  500. }}
  501. style={{ width: 160, marginRight: 5 }}
  502. value={this.state.processStatusSearch}
  503. >
  504. <Option value="3">未分配</Option>
  505. <Option value="4">已分配</Option>
  506. </Select>
  507. <span style={{ marginRight: 10 }}>下单日期:</span>
  508. <RangePicker
  509. value={[
  510. this.state.releaseDate[0]
  511. ? moment(this.state.releaseDate[0])
  512. : null,
  513. this.state.releaseDate[1]
  514. ? moment(this.state.releaseDate[1])
  515. : null
  516. ]}
  517. onChange={(data, dataString) => {
  518. this.setState({ releaseDate: dataString });
  519. }}
  520. />
  521. <Button
  522. type="primary"
  523. onClick={this.search}
  524. style={{ marginLeft: 10 }}
  525. >
  526. 搜索
  527. </Button>
  528. <Button onClick={this.reset}>重置</Button>
  529. </div>
  530. <div className="patent-table">
  531. <Spin spinning={this.state.loading}>
  532. <Table
  533. columns={this.state.columns}
  534. dataSource={this.state.dataSource}
  535. rowSelection={false}
  536. scroll={{ x: true, y: 0 }}
  537. pagination={this.state.pagination}
  538. onRowClick={this.tableRowClick.bind(this)}
  539. />
  540. </Spin>
  541. </div>
  542. <Assign
  543. title="任务"
  544. selApi={"/api/admin/newOrder/updateFinance"}
  545. data={this.state.assignDataY}
  546. showDesc={this.state.assignVisibleY}
  547. closeDesc={this.closeAssignY.bind(this)}
  548. // fenpaiData={8}
  549. specially={0}
  550. roleName={this.state.nub}
  551. requestMethod={"get"}
  552. />
  553. <OrderDesc
  554. data={this.state.RowData}
  555. showDesc={this.state.showDesc}
  556. closeDesc={this.closeDesc.bind(this)}
  557. />
  558. <Receivable
  559. title="收款记录"
  560. api="/api/admin/financial/addReceiptsFlow"
  561. data={this.state.assignDataX}
  562. showDesc={this.state.assignVisibleX}
  563. closeDesc={this.closeAssignX.bind(this)}
  564. />
  565. <Modal
  566. visible={this.state.boHuiVisible}
  567. width="400px"
  568. title="驳回备注"
  569. footer=""
  570. onOk={this.boHuiOk}
  571. onCancel={this.boHuiCancel}
  572. >
  573. <Form layout="horizontal" onSubmit={this.boHuiSubmit}>
  574. <Spin spinning={this.state.loading}>
  575. <FormItem
  576. labelCol={{ span: 5 }}
  577. wrapperCol={{ span: 16 }}
  578. label={
  579. <span>
  580. <strong style={{ color: "#f00" }}>*</strong>驳回原因
  581. </span>
  582. }
  583. >
  584. <Input
  585. type="textarea"
  586. rows={4}
  587. placeholder="请输入驳回原因"
  588. value={this.state.content}
  589. onChange={e => {
  590. this.setState({ content: e.target.value });
  591. }}
  592. />
  593. </FormItem>
  594. <FormItem wrapperCol={{ span: 12, offset: 5 }}>
  595. <Button
  596. type="primary"
  597. htmlType="submit"
  598. style={{ marginRight: 20 }}
  599. >
  600. 驳回
  601. </Button>
  602. <Button
  603. type="default"
  604. onClick={() => {
  605. this.boHuiCancel();
  606. }}
  607. >
  608. 取消
  609. </Button>
  610. </FormItem>
  611. </Spin>
  612. </Form>
  613. </Modal>
  614. </div>
  615. );
  616. }
  617. });
  618. export default ShouKuang;