projectManageDetaile.jsx 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297
  1. import React from 'react';
  2. import { Icon, Table, Modal, message, Spin, Input, Select, Button, Form ,Upload,Popconfirm,AutoComplete} from 'antd';
  3. import ajax from 'jquery/src/ajax/xhr.js';
  4. import $ from 'jquery/src/ajax';
  5. import '../userMangagement.less';
  6. import {orderType} from '../../../../dataDic.js';
  7. import {getOrderType,getProjectState,getTaskStatus,getOrderChannel,getOrderState,getPaymentState ,getApprovedState} from '../../../../tools.js';
  8. const MySettlementDetaile = Form.create()(React.createClass({
  9. loadData(record) {
  10. this.setState({
  11. loading: true
  12. });
  13. $.ajax({
  14. method: "get",
  15. dataType: "json",
  16. crossDomain: false,
  17. url: globalConfig.context + '/api/admin/techproject/getProjectTask',
  18. data: {
  19. contractId:record?record.id:this.props.datauser.id
  20. },
  21. success: function (data) {
  22. let theArr =[];
  23. if (!data.data) {
  24. if (data.error && data.error.length) {
  25. message.warning(data.error[0].message);
  26. };
  27. } else {
  28. for (let i = 0; i < data.data.length; i++) {
  29. let thisdata = data.data[i];
  30. theArr.push({
  31. key:i,
  32. taskId:thisdata.taskId,
  33. commodityName:thisdata.commodityName,
  34. commodityQuantity:thisdata.commodityQuantity,
  35. technicianName:thisdata.technicianName,
  36. taskStatus:thisdata.taskStatus,
  37. deleteSign:thisdata.deleteSign,
  38. taskComment:thisdata.taskComment,
  39. });
  40. };
  41. }
  42. this.setState({
  43. dataSource: theArr,
  44. });
  45. }.bind(this),
  46. }).always(function () {
  47. this.setState({
  48. loading: false
  49. });
  50. }.bind(this));
  51. },
  52. getInitialState() {
  53. return {
  54. loading: false,
  55. visible: false,
  56. contractState:false,
  57. projectVisible:false,
  58. selectedRowKey:[],
  59. orderSelect:false,
  60. transferState:false,
  61. orgCodeUrl:[],
  62. customerArr:[],
  63. checkedKeys: [],
  64. //派单
  65. columns: [
  66. {
  67. title: '任务名称',
  68. dataIndex: 'commodityName',
  69. key: 'commodityName'
  70. },{
  71. title: '任务数量',
  72. dataIndex: 'commodityQuantity',
  73. key: 'commodityQuantity'
  74. }, {
  75. title: '任务负责人',
  76. dataIndex: 'technicianName',
  77. key: 'technicianName'
  78. }, {
  79. title: '任务状态',
  80. dataIndex: 'taskStatus',
  81. key: 'taskStatus',
  82. render:(text)=>{return getTaskStatus(text)}
  83. }, {
  84. title: '是否锁定',
  85. dataIndex: 'deleteSign',
  86. key: 'deleteSign',
  87. render:(text)=>{return text==2?'锁定':'未锁定'}
  88. },{
  89. title: '任务说明',
  90. dataIndex: 'taskComment',
  91. key: 'taskComment',
  92. render:(text) => {
  93. return(
  94. text&&text.length>6?text.substr(0,8)+'...':text
  95. )
  96. }
  97. },{
  98. title: '操作',
  99. dataIndex: 'rrtk',
  100. key: 'rrtk',
  101. render:(text,record,index)=>{
  102. return (
  103. <div>
  104. {record.taskStatus<=1&&<Popconfirm title={'您将删除项目任务 【'+record.commodityName+'】,系统将自动同步作废项目资料单,请确认!'} onConfirm={(e)=>{this.voidOperation(record)}} okText="确认" cancelText="取消">
  105. <Button style={{marginRight:'5px'}} onClick={(e) =>{ e.stopPropagation()}} type="danger">删除</Button>
  106. </Popconfirm>}
  107. {record.taskStatus<1&&<Button style={{marginRight:'5px'}} onClick={(e) =>{ e.stopPropagation(),this.confirmDelet(record)}} type="primary">派单</Button>}
  108. </div>
  109. )
  110. }
  111. }
  112. ],
  113. userList:[
  114. {
  115. title: '用户编号',
  116. dataIndex: 'userNo',
  117. key: 'userNo'
  118. }, {
  119. title: '用户姓名',
  120. dataIndex: 'name',
  121. key: 'name'
  122. },{
  123. title: '部门机构',
  124. dataIndex: 'departmentName',
  125. key: 'departmentName'
  126. }, {
  127. title: '职务',
  128. dataIndex: 'position',
  129. key: 'position'
  130. },{
  131. title: '联系手机',
  132. dataIndex: 'mobile',
  133. key: 'mobile'
  134. }, {
  135. title: '操作',
  136. dataIndex: 'abc',
  137. key: 'abc',
  138. render:(text,record,index)=>{
  139. return (
  140. <div>{this.state.transferState?<Popconfirm title={'您确认转交给【'+record.departmentName+'-'+record.name+'】'} onConfirm={(e)=>{this.transterSelect(record)}} okText="确认" cancelText="取消">
  141. <Button style={{marginRight:'5px'}} type="primary">转交</Button>
  142. </Popconfirm>:
  143. <Popconfirm title={'您确认将订单分配给【'+record.departmentName+'-'+record.name+'】进行业务跟进?'} onConfirm={(e)=>{this.confirmSelect(record)}} okText="确认" cancelText="取消">
  144. <Button style={{marginRight:'5px'}} type="primary">选定</Button>
  145. </Popconfirm>}
  146. </div>
  147. )
  148. }
  149. }
  150. ],
  151. contractList:[
  152. {
  153. title: '姓名',
  154. dataIndex: 'name',
  155. key: 'name'
  156. }, {
  157. title: '部门',
  158. dataIndex: 'depatrment',
  159. key: 'depatrment'
  160. },{
  161. title: '联系方式',
  162. dataIndex: 'mobile',
  163. key: 'mobile'
  164. },{
  165. title: '是否为主要联系人',
  166. dataIndex: 'major',
  167. key: 'major',
  168. render:(text) => {
  169. return text?'是':"否"
  170. }
  171. }, {
  172. title: '职务',
  173. dataIndex: 'position',
  174. key: 'position'
  175. },{
  176. title: '微信',
  177. dataIndex: 'wechat',
  178. key: 'wechat'
  179. },{
  180. title: 'QQ',
  181. dataIndex: 'qq',
  182. key: 'qq'
  183. },
  184. ],
  185. };
  186. },
  187. seeOrder(){
  188. this.seeOrderAjax();
  189. this.setState({
  190. seeState:true,
  191. orderVisible:true
  192. })
  193. },
  194. seeContract(){
  195. this.contract();
  196. this.setState({
  197. seeState:false,
  198. orderVisible:true
  199. })
  200. },
  201. orderCancel(){
  202. this.setState({
  203. orderVisible:false
  204. })
  205. },
  206. //查看联系人
  207. contract(){
  208. $.ajax({
  209. method: "get",
  210. dataType: "json",
  211. crossDomain: false,
  212. url: globalConfig.context + '/api/admin/customer/findAllContacts',
  213. data: {
  214. uid: this.state.buyerId
  215. },
  216. success: function (data) {
  217. let thisData = data.data;
  218. if (!thisData) {
  219. if (data.error && data.error.length) {
  220. message.warning(data.error[0].message);
  221. };
  222. thisData = {};
  223. };
  224. this.setState({
  225. contractArr:thisData,
  226. });
  227. }.bind(this),
  228. }).always(function () {
  229. this.setState({
  230. loading: false
  231. });
  232. }.bind(this));
  233. },
  234. //查看订单
  235. seeOrderAjax(){
  236. $.ajax({
  237. method: "get",
  238. dataType: "json",
  239. crossDomain: false,
  240. url: globalConfig.context + '/api/admin/order/getServiceOrderDetail',
  241. data: {
  242. orderNo: this.state.orderNok
  243. },
  244. success: function (data) {
  245. let thisData = data.data;
  246. if (!thisData) {
  247. if (data.error && data.error.length) {
  248. message.warning(data.error[0].message);
  249. };
  250. thisData = {};
  251. };
  252. this.setState({
  253. orderArr:thisData,
  254. });
  255. }.bind(this),
  256. }).always(function () {
  257. this.setState({
  258. loading: false
  259. });
  260. }.bind(this));
  261. },
  262. //查看详情
  263. loaduser(record){
  264. if(record){
  265. $.ajax({
  266. method: "get",
  267. dataType: "json",
  268. crossDomain: false,
  269. url: globalConfig.context + '/api/admin/techproject/getProjectDetail',
  270. data: {
  271. contractId: record.id,
  272. buyerType:record.buyerType
  273. },
  274. success: function (data) {
  275. let thisData = data.data;
  276. if (!thisData) {
  277. if (data.error && data.error.length) {
  278. message.warning(data.error[0].message);
  279. };
  280. thisData = {};
  281. };
  282. this.setState({
  283. buyerId:thisData.uid,
  284. id:record.id,
  285. orderNok:thisData.orderNo,
  286. orderList:thisData,
  287. technicianName:thisData.technicianName, //任务负责人
  288. });
  289. }.bind(this),
  290. }).always(function () {
  291. this.setState({
  292. loading: false
  293. });
  294. }.bind(this));
  295. }
  296. },
  297. //删除
  298. voidOperation(record){
  299. this.setState({
  300. loading: true
  301. });
  302. $.ajax({
  303. method: "get",
  304. dataType: "json",
  305. crossDomain: false,
  306. url: globalConfig.context + '/api/admin/techproject/deleteProjectTask',
  307. data: {
  308. taskId:record.taskId
  309. }
  310. }).done(function (data) {
  311. if (!data.error.length) {
  312. message.success('操作成功');
  313. this.setState({
  314. loading: false,
  315. });
  316. this.loadData();
  317. } else {
  318. message.warning(data.error[0].message);
  319. };
  320. }.bind(this));
  321. },
  322. //订单编辑保存
  323. handleOk(e) {
  324. this.setState({
  325. visible: false,
  326. });
  327. this.props.closeDesc(false, true);
  328. },
  329. handleCancel(e) {
  330. this.setState({
  331. visible: false,
  332. });
  333. this.props.closeDesc(false);
  334. },
  335. //新建项目
  336. projectOk(e) {
  337. this.setState({
  338. projectVisible: false,
  339. });
  340. this.props.closeDesc(false, true);
  341. },
  342. projectCancel(e) {
  343. this.setState({
  344. projectVisible: false,
  345. });
  346. this.props.closeDesc(false);
  347. },
  348. //选定订单
  349. orderOk() {
  350. this.setState({
  351. orderSelect: false,
  352. });
  353. },
  354. componentWillMount() {
  355. },
  356. nextCancel() {
  357. this.setState({
  358. addnextVisible: false
  359. })
  360. },
  361. //查看订单明细
  362. orderDetails(record){
  363. if(record){
  364. $.ajax({
  365. method: "get",
  366. dataType: "json",
  367. crossDomain: false,
  368. url: globalConfig.context + '/api/admin/techproject/getProjectTaskDetail',
  369. data: {
  370. taskId: record.taskId
  371. },
  372. success: function (data) {
  373. let thisData = data.data;
  374. if (!thisData) {
  375. if (data.error && data.error.length) {
  376. message.warning(data.error[0].message);
  377. };
  378. thisData = {};
  379. };
  380. this.setState({
  381. taskId:thisData.taskId,
  382. taskNo:thisData.taskNo,
  383. projectNo:thisData.projectNo,
  384. categoryId:thisData.categoryId,
  385. commodityName:thisData.commodityName,
  386. taskStatus:thisData.taskStatus,
  387. taskComment:thisData.taskComment,
  388. deletedSign:thisData.deletedSign,
  389. taskAllocatorName:thisData.taskAllocatorName,
  390. taskReceiverName:thisData.taskReceiverName,
  391. taskDistributionTime:thisData.taskDistributionTime,
  392. });
  393. }.bind(this),
  394. }).always(function () {
  395. this.setState({
  396. loading: false
  397. });
  398. }.bind(this));
  399. }
  400. },
  401. //创建项目保存
  402. admissibleOrder(){
  403. if(!this.state.autoId||!this.state.customerName){
  404. message.warning('客户名称不匹配');
  405. return false;
  406. };
  407. if(!this.state.projectName){
  408. message.warning('请选择项目负责人');
  409. return false;
  410. };
  411. if(!this.state.contractType){
  412. message.warning('请选择业务品类');
  413. return false;
  414. };
  415. if(this.state.signComment&&this.state.signComment.length>45){
  416. message.warning('项目说明字数不能超过45字');
  417. return false;
  418. };
  419. this.setState({
  420. loading: true
  421. });
  422. $.ajax({
  423. method: "POST",
  424. dataType: "json",
  425. crossDomain: false,
  426. url: globalConfig.context + '/api/admin/techproject/createProject',
  427. data: {
  428. uid:this.state.autoId,
  429. signComment:this.state.signComment,
  430. aid:this.state.aid,
  431. projectType:0,
  432. contractType:this.state.contractType
  433. }
  434. }).done(function(data) {
  435. this.setState({
  436. loading: false
  437. });
  438. if(!data.error.length) {
  439. message.success('创建成功!');
  440. this.projectOk()
  441. } else {
  442. message.warning(data.error[0].message);
  443. }
  444. }.bind(this));
  445. },
  446. //派单
  447. //操作分配
  448. confirmDelet(index){
  449. this.setState({
  450. taskIds:index.taskId,
  451. userDetaile:false,
  452. distributionVisible:true,
  453. transferState:false,
  454. });
  455. this.resetOrder();
  456. },
  457. distributionCancel(){
  458. this.setState({
  459. distributionVisible:false
  460. })
  461. },
  462. distributionOk(){
  463. this.setState({
  464. distributionVisible:false
  465. })
  466. },
  467. //分配对象列表
  468. contactList(){
  469. $.ajax({
  470. method: "get",
  471. dataType: "json",
  472. crossDomain: false,
  473. url: globalConfig.context + '/api/admin/superviser/adminList',
  474. data: {
  475. pageNo: 1,
  476. pageSize: 99,
  477. departmentId:this.state.departmenttList,
  478. name:this.state.financeNameSearch,
  479. },
  480. success: function (data) {
  481. let theArr = [];
  482. if (!data.data) {
  483. if (data.error && data.error.length) {
  484. message.warning(data.error[0].message);
  485. };
  486. } else {
  487. for (let i = 0; i < data.data.list.length; i++) {
  488. let thisdata = data.data.list[i];
  489. theArr.push({
  490. key: i,
  491. id: thisdata.id,
  492. userNo: thisdata.userNo,
  493. name:thisdata.name,
  494. departmentName:thisdata.departmentName,
  495. departmentId:thisdata.departmentId,
  496. position:thisdata.position,
  497. mobile:thisdata.mobile,
  498. });
  499. };
  500. };
  501. this.setState({
  502. distributionList: theArr,
  503. });
  504. }.bind(this),
  505. }).always(function () {
  506. this.setState({
  507. loading: false
  508. });
  509. }.bind(this));
  510. },
  511. //选定对象
  512. confirmSelect(record){
  513. if(this.state.projectVisible){
  514. this.setState({
  515. aid:record.id,
  516. projectName:record.name
  517. })
  518. this.distributionOk();
  519. return false
  520. }
  521. this.setState({
  522. loading: true
  523. });
  524. $.ajax({
  525. method: "POST",
  526. dataType: "json",
  527. crossDomain: false,
  528. url: globalConfig.context + "/api/admin/techproject/distributionTask",
  529. data: {
  530. taskId:this.state.taskIds,
  531. taskReceiverId:record.id
  532. }
  533. }).done(function (data) {
  534. if (!data.error.length) {
  535. message.success('分派成功!');
  536. this.setState({
  537. loading: false,
  538. });
  539. this.distributionOk();
  540. this.loadData();
  541. } else {
  542. message.warning(data.error[0].message);
  543. };
  544. }.bind(this));
  545. },
  546. //指派
  547. //选定对象
  548. transterSelect(record){
  549. this.setState({
  550. loading: true
  551. });
  552. $.ajax({
  553. method: "get",
  554. dataType: "json",
  555. crossDomain: false,
  556. url: globalConfig.context + "/api/admin/techproject/transferProject",
  557. data: {
  558. contractId:this.state.id,
  559. projectReceiveId:record.id,
  560. orderNo:this.state.orderNok||''
  561. }
  562. }).done(function (data) {
  563. if (!data.error.length) {
  564. message.success('转交成功!');
  565. this.setState({
  566. loading: false,
  567. });
  568. this.distributionOk();
  569. this.loaduser(this.props.datauser);
  570. } else {
  571. message.warning(data.error[0].message);
  572. };
  573. }.bind(this));
  574. },
  575. searchOrder(){
  576. this.contactList();
  577. },
  578. resetOrder(){
  579. this.state.departmenttList=undefined;
  580. this.state.financeNameSearch='';
  581. this.setState({
  582. distributionList:[]
  583. })
  584. },
  585. //添加任务
  586. addTask(){
  587. this.setState({
  588. commodityQuantity:'',
  589. commodityName:'',
  590. taskComment:'',
  591. kid:'',
  592. commodityId:undefined,
  593. addTaskState:true,
  594. addnextVisible:true,
  595. customerArr:[]
  596. });
  597. },
  598. //客户名称自动补全
  599. //加载(自动补全)
  600. supervisor(e,state){ //客户名称与服务名称自动补全
  601. let api=state?'/api/admin/customer/findCustomerByName':'/api/admin/order/getBusinessProjectByName';
  602. $.ajax({
  603. method: "get",
  604. dataType: "json",
  605. crossDomain: false,
  606. url: globalConfig.context + api,
  607. data:state?{
  608. name:e
  609. }:{
  610. businessName:e
  611. },
  612. success: function (data) {
  613. let thedata=data.data;
  614. if (!thedata) {
  615. if (data.error && data.error.length) {
  616. message.warning(data.error[0].message);
  617. };
  618. thedata = {};
  619. };
  620. this.setState({
  621. states:state,
  622. customerArr:thedata,
  623. });
  624. }.bind(this),
  625. }).always(function () {
  626. this.setState({
  627. loading: false
  628. });
  629. }.bind(this));
  630. },
  631. //服务值改变时请求客户名称
  632. httpChange(e){
  633. if(e.length>=2){
  634. this.supervisor(e,false);
  635. }
  636. this.setState({
  637. commodityName:e
  638. })
  639. },
  640. //上级主管输入框失去焦点是判断客户是否存在
  641. selectAuto(value){
  642. let kid=[];
  643. let fwList=this.state.customerArr;
  644. fwList.map(function(item){
  645. if(value==item.bname){
  646. kid=item.id
  647. }
  648. })
  649. this.setState({
  650. kid:kid,
  651. commodityName:value,
  652. })
  653. },
  654. customerChange(e){
  655. if(e.length>=2){
  656. this.supervisor(e,true);
  657. }
  658. this.setState({
  659. customerName:e
  660. })
  661. },
  662. //客户
  663. selectAutoCUT(value){
  664. let autoIds;
  665. let fwList=this.state.customerArr;
  666. fwList.map(function(item){
  667. if(value==item.name){
  668. autoIds=item.id
  669. }
  670. })
  671. this.setState({
  672. customerName:value,
  673. autoId:autoIds
  674. })
  675. },
  676. //任务新建、编辑保存
  677. taskSumbit(e) {
  678. e.preventDefault();
  679. if(this.state.addTaskState){
  680. if(!this.state.kid){
  681. message.warning('请输入服务项目名称');
  682. return false;
  683. };
  684. if(!this.state.commodityQuantity){
  685. message.warning('请输入数量');
  686. return false;
  687. };
  688. }
  689. this.props.form.validateFields((err, values) => {
  690. if(!err) {
  691. this.setState({
  692. loading: true
  693. });
  694. let api=this.state.addTaskState?'/api/admin/techproject/addProjectTask':'/api/admin/techproject/updateProjectTask';
  695. $.ajax({
  696. method: "POST",
  697. dataType: "json",
  698. crossDomain: false,
  699. url: globalConfig.context + api,
  700. data: this.state.addTaskState?{
  701. contractId:this.props.datauser.id,
  702. commodityId:this.state.kid,
  703. commodityName:this.state.commodityName,
  704. commodityQuantity:this.state.commodityQuantity,
  705. taskComment:this.state.taskComment,
  706. }:{
  707. taskId:this.state.taskId,
  708. commodityId:this.state.kid?this.state.kid:this.state.commodityId,
  709. taskComment:this.state.taskComment
  710. }
  711. }).done(function(data) {
  712. this.setState({
  713. loading: false
  714. });
  715. if(!data.error.length) {
  716. message.success('保存成功!');
  717. this.nextCancel();
  718. this.loadData();
  719. } else {
  720. message.warning(data.error[0].message);
  721. }
  722. }.bind(this));
  723. }
  724. });
  725. },
  726. //任务项目各种骚操作
  727. removeItem(){ //撤项
  728. this.removeList(0)
  729. },
  730. Knot(){ //结项
  731. this.removeList(1)
  732. },
  733. removeList(e){
  734. this.setState({
  735. loading: true
  736. });
  737. $.ajax({
  738. method: "get",
  739. dataType: "json",
  740. crossDomain: false,
  741. url: globalConfig.context + '/api/admin/techproject/revokeOrComplete',
  742. data: {
  743. contractId:this.props.datauser.id,
  744. operatorType:e
  745. }
  746. }).done(function(data) {
  747. this.setState({
  748. loading: false
  749. });
  750. if(!data.error.length) {
  751. message.success('操作成功!');
  752. this.handleOk()
  753. } else {
  754. message.warning(data.error[0].message);
  755. }
  756. }.bind(this));
  757. },
  758. //负责人转交
  759. transfer(){
  760. this.setState({
  761. distributionVisible:true,
  762. transferState:true,
  763. });
  764. this.resetOrder();
  765. },
  766. tableRowClick(record, index) {
  767. this.setState({
  768. addTaskState:false,
  769. addnextVisible:true,
  770. });
  771. this.orderDetails(record)
  772. },
  773. componentWillReceiveProps(nextProps) { //props改变时触发
  774. this.state.projectVisible = nextProps.newProject;
  775. this.state.visible = nextProps.showDesc;
  776. if(nextProps.userDetaile && nextProps.showDesc ) {
  777. if(nextProps.datauser && nextProps.datauser.id ) {
  778. this.loaduser(nextProps.datauser);
  779. this.loadData(nextProps.datauser);
  780. }
  781. }else{
  782. this.setState({
  783. customerArr:[],
  784. customerName:'',
  785. autoId:'',
  786. signComment:'',
  787. projectName:'',
  788. aid:'',
  789. contractType:undefined
  790. })
  791. }
  792. },
  793. render() {
  794. const FormItem = Form.Item
  795. const formItemLayout = {
  796. labelCol: { span: 8 },
  797. wrapperCol: { span: 14 },
  798. };
  799. const rowSelection = {
  800. selectedRowKey: this.state.selectedRowKey,
  801. onChange: (selectedRowKey, selectedRows) => {
  802. this.setState({
  803. selectedRows: selectedRows.slice(-1),
  804. selectedRowKey: selectedRowKey.slice(-1)
  805. });
  806. },
  807. onSelectAll: (selected, selectedRows, changeRows) => {
  808. this.setState({
  809. selectedRowKey:[]
  810. })
  811. },
  812. };
  813. const categoryList=this.props.categoryArr ||[];
  814. let departmentArr = this.props.departmentArr || [];
  815. const hasSelected = this.state.selectedRowKey.length > 0;
  816. const orderDetaiel=this.state.orderList || [];
  817. const dataSources=this.state.customerArr || [];
  818. const orderArr=this.state.orderArr ||[];
  819. const options = this.state.states?dataSources.map((group,index) =>
  820. <Select.Option key={index} value={group.name}>{group.name}</Select.Option>
  821. ):dataSources.map((group,index) =>
  822. <Select.Option key={index} value={group.bname}>{group.bname}</Select.Option>
  823. )
  824. return(
  825. <div>
  826. <Modal maskClosable={false} visible={this.state.visible}
  827. onOk={this.handleOk} onCancel={this.handleCancel}
  828. width='1000px'
  829. title={this.props.projectState?'项目管理':'项目详情' }
  830. footer=''
  831. className="admin-desc-content">
  832. <Form layout="horizontal" id="demand-form" style={{paddingBottom:'40px'}} onSubmit={this.handleSubmit}>
  833. <Spin spinning={this.state.loading}>
  834. <div className="clearfix">
  835. <div className="clearfix">
  836. <FormItem className="half-item"
  837. {...formItemLayout}
  838. label="订单编号" >
  839. <span>{orderDetaiel.orderNo}</span>
  840. {orderDetaiel.orderNo&&!this.props.queryProject?<Button onClick={this.seeOrder} style={{float:'right',fontSize:'12px'}}>查看订单</Button>:''}
  841. </FormItem>
  842. <FormItem className="half-item"
  843. {...formItemLayout}
  844. label="项目编号" >
  845. <span>{orderDetaiel.serialNumber}</span>
  846. </FormItem>
  847. <FormItem className="half-item"
  848. {...formItemLayout}
  849. label="客户名称" >
  850. <span>{orderDetaiel.buyerName}</span>
  851. {orderDetaiel.buyerName&&<Button onClick={this.seeContract} style={{float:'right',fontSize:'12px'}}>查看联系人</Button>}
  852. </FormItem>
  853. <FormItem className="half-item"
  854. {...formItemLayout}
  855. label="客户省份" >
  856. <span>{orderDetaiel.buyerProvince}</span>
  857. </FormItem>
  858. <FormItem className="half-item"
  859. {...formItemLayout}
  860. label="项目类型" >
  861. <span>{getOrderType(orderDetaiel.projectType)}</span>
  862. </FormItem>
  863. <FormItem className="half-item"
  864. {...formItemLayout}
  865. label="项目负责人" >
  866. <span>{orderDetaiel.principalName}</span>
  867. {!this.props.queryProject?<Button onClick={this.transfer} style={{'float':"right"}}>转交</Button>:''}
  868. </FormItem>
  869. <FormItem className="half-item"
  870. {...formItemLayout}
  871. label="项目状态" >
  872. <span>{getProjectState(orderDetaiel.projectStatus)}</span>
  873. </FormItem>
  874. <FormItem className="half-item"
  875. {...formItemLayout}
  876. label="是否锁定" >
  877. <span>{orderDetaiel.deleteSign==2?'锁定':'未锁定'}</span>
  878. </FormItem>
  879. <FormItem className="half-item"
  880. {...formItemLayout}
  881. label="立项时间" >
  882. <span>{orderDetaiel.signDate}</span>
  883. </FormItem>
  884. <FormItem className="half-item"
  885. {...formItemLayout}
  886. label="业务品类" >
  887. <span>{orderDetaiel.projectType}</span>
  888. </FormItem>
  889. <div className='clearfix'>
  890. <FormItem
  891. labelCol={{ span: 4 }}
  892. wrapperCol={{ span: 16 }}
  893. label="立项说明" >
  894. <span>{orderDetaiel.signComment}</span>
  895. </FormItem>
  896. </div>
  897. </div>
  898. <div className='clearfix'>
  899. <FormItem className="half-item"
  900. {...formItemLayout}
  901. label="结项日期" >
  902. <span>{orderDetaiel.completeDate}</span>
  903. </FormItem>
  904. </div>
  905. <div className='clearfix'>
  906. <FormItem
  907. labelCol={{ span: 4 }}
  908. wrapperCol={{ span: 16 }}
  909. label="结项说明" >
  910. <span>{orderDetaiel.completeComment}</span>
  911. </FormItem>
  912. </div>
  913. <div className='clearfix'>
  914. <FormItem className="half-item"
  915. {...formItemLayout}
  916. label="是否作废" >
  917. <span>{orderDetaiel.deleteSign==1?'作废':'未作废'}</span>
  918. </FormItem>
  919. </div>
  920. <div>
  921. <span style={{marginLeft:'50px',fontSize:'20px'}}>项目任务</span>
  922. {orderDetaiel.projectStatus<3&&!this.props.queryProject?<Button type='primary' onClick={this.addTask} style={{float:'right',marginRight:'100px'}}>添加任务</Button>:''}
  923. </div>
  924. <div className="patent-table">
  925. <Spin spinning={this.state.loading}>
  926. <Table columns={this.state.columns}
  927. dataSource={this.state.dataSource}
  928. pagination={false}
  929. onRowClick={this.tableRowClick}
  930. />
  931. </Spin>
  932. </div>
  933. {!this.props.projectState?<div>
  934. </div>:
  935. <div style={{marginTop:'30px',paddingLeft:'100px'}}>
  936. <Button type="danger" onClick={this.removeItem}>撤项</Button>
  937. <Button type="primary" onClick={this.Knot} style={{margin:'15px'}}>结项</Button>
  938. <Button type="ghost" onClick={this.handleCancel}>返回</Button>
  939. </div>}
  940. </div>
  941. </Spin>
  942. </Form >
  943. </Modal>
  944. <Modal maskClosable={false} visible={this.state.addnextVisible}
  945. onOk={this.nextCancel} onCancel={this.nextCancel}
  946. width='800px'
  947. title={this.state.addTaskState?'添加任务':'任务详情'}
  948. footer=''
  949. className="admin-desc-content">
  950. <Form layout="horizontal" id="demand-form" onSubmit={this.taskSumbit}>
  951. <Spin spinning={this.state.loading}>
  952. {this.state.addTaskState?<div className="clearfix">
  953. <FormItem className="half-item"
  954. {...formItemLayout}
  955. label="服务项目名称" >
  956. <AutoComplete
  957. className="certain-category-search"
  958. dropdownClassName="certain-category-search-dropdown"
  959. dropdownMatchSelectWidth={false}
  960. dropdownStyle={{ width: 200 }}
  961. style={{ width: '200px' }}
  962. dataSource={options}
  963. placeholder="输入服务名称"
  964. value={this.state.commodityName}
  965. onChange={this.httpChange}
  966. filterOption={true}
  967. onSelect={this.selectAuto}
  968. >
  969. <Input/>
  970. </AutoComplete>
  971. <span className="mandatory">*</span>
  972. </FormItem>
  973. <FormItem className="half-item"
  974. {...formItemLayout}
  975. label="数量" >
  976. <Input style={{ width: '200px' }} placeholder="输入数量"
  977. value={this.state.commodityQuantity}
  978. onChange={(e)=>{this.setState({commodityQuantity:e.target.value})}}/>
  979. <span className="mandatory">*</span>
  980. </FormItem>
  981. <div className='clearfix'>
  982. <FormItem
  983. labelCol={{ span: 4 }}
  984. wrapperCol={{ span: 16 }}
  985. label="任务说明" >
  986. <Input type="textarea" placeholder="请输入订单留言" rows={4}
  987. value={this.state.taskComment}
  988. onChange={(e)=>{this.setState({taskComment:e.target.value})}}/>
  989. </FormItem>
  990. </div>
  991. </div>:
  992. <div className="clearfix">
  993. <FormItem className="half-item"
  994. {...formItemLayout}
  995. label="项目编号" >
  996. <span>{this.state.projectNo}</span>
  997. </FormItem>
  998. <FormItem className="half-item"
  999. {...formItemLayout}
  1000. label="任务编号" >
  1001. <span>{this.state.taskNo}</span>
  1002. </FormItem>
  1003. {this.state.taskStatus<1?<FormItem className="half-item"
  1004. {...formItemLayout}
  1005. label="服务项目名称" >
  1006. <AutoComplete
  1007. className="certain-category-search"
  1008. dropdownClassName="certain-category-search-dropdown"
  1009. dropdownMatchSelectWidth={false}
  1010. dropdownStyle={{ width: 200 }}
  1011. style={{ width: '200px' }}
  1012. dataSource={options}
  1013. placeholder="输入服务名称"
  1014. value={this.state.commodityName}
  1015. onChange={this.httpChange}
  1016. filterOption={true}
  1017. onSelect={this.selectAuto}
  1018. >
  1019. <Input/>
  1020. </AutoComplete>
  1021. <span className="mandatory">*</span>
  1022. </FormItem>:
  1023. <FormItem className="half-item"
  1024. {...formItemLayout}
  1025. label="服务项目名称" >
  1026. <span>{this.state.commodityName}</span>
  1027. </FormItem>}
  1028. <FormItem className="half-item"
  1029. {...formItemLayout}
  1030. label="任务状态" >
  1031. <span>{getTaskStatus(this.state.taskStatus)}</span>
  1032. </FormItem>
  1033. <FormItem className="half-item"
  1034. {...formItemLayout}
  1035. label="是否锁定" >
  1036. <span>{this.state.deletedSign==2?'锁定':'未锁定'}</span>
  1037. </FormItem>
  1038. <div className='clearfix'>
  1039. {this.state.taskStatus<1?<FormItem
  1040. labelCol={{ span: 4 }}
  1041. wrapperCol={{ span: 16 }}
  1042. label="任务说明" >
  1043. <Input type="textarea" placeholder="请输入订单留言" rows={4} value={this.state.taskComment}
  1044. onChange={(e)=>{this.setState({taskComment:e.target.value})}}/>
  1045. </FormItem>:
  1046. <FormItem className="half-item"
  1047. {...formItemLayout}
  1048. label="任务说明" >
  1049. <span>{this.state.taskComment}</span>
  1050. </FormItem>}
  1051. </div>
  1052. <div className='clearfix'>
  1053. <FormItem className="half-item"
  1054. {...formItemLayout}
  1055. label="派单人" >
  1056. <span>{this.state.taskAllocatorName}</span>
  1057. </FormItem>
  1058. <FormItem className="half-item"
  1059. {...formItemLayout}
  1060. label="派单时间" >
  1061. <span>{this.state.taskDistributionTime}</span>
  1062. </FormItem>
  1063. <FormItem className="half-item"
  1064. {...formItemLayout}
  1065. label="资料负责人" >
  1066. <span>{this.state.taskReceiverName}</span>
  1067. </FormItem>
  1068. </div>
  1069. </div>}
  1070. {this.state.taskStatus<1||this.state.addTaskState?<div className="clearfix" style={{marginBottom:'20px'}}>
  1071. <Button className="setSave" type="primary" htmlType="submit">保存</Button>
  1072. <Button className="cancel" type="ghost" onClick={this.nextCancel}>返回</Button>
  1073. </div>:''}
  1074. </Spin>
  1075. </Form >
  1076. </Modal>
  1077. <Modal maskClosable={false} visible={this.state.projectVisible}
  1078. onOk={this.projectOk} onCancel={this.projectCancel}
  1079. width='600px'
  1080. title='创建项目'
  1081. footer=''
  1082. className="admin-desc-content">
  1083. <Form layout="horizontal" id="demand-form" style={{paddingBottom:'40px'}} >
  1084. <Spin spinning={this.state.loading}>
  1085. <div className="clearfix">
  1086. <div className='clearfix'>
  1087. <div className="clearfix">
  1088. <FormItem
  1089. {...formItemLayout}
  1090. label="客户名称" >
  1091. <AutoComplete
  1092. className="certain-category-search"
  1093. dropdownClassName="certain-category-search-dropdown"
  1094. dropdownMatchSelectWidth={false}
  1095. dropdownStyle={{ width: 200 }}
  1096. size="large"
  1097. style={{ width: '200px' }}
  1098. dataSource={options}
  1099. placeholder="输入客户名称"
  1100. value={this.state.customerName}
  1101. onChange={this.customerChange}
  1102. filterOption={true}
  1103. onBlur={this.blurCutor}
  1104. onSelect={this.selectAutoCUT}
  1105. >
  1106. <Input/>
  1107. </AutoComplete>
  1108. <span className="mandatory">*</span>
  1109. </FormItem>
  1110. </div>
  1111. <div className='clearfix'>
  1112. <FormItem
  1113. {...formItemLayout}
  1114. label="项目负责人" >
  1115. <span style={{width:'150px'}}>{this.state.projectName}</span>
  1116. <Button onClick={this.confirmDelet} style={{float:'right',marginRight:'50px'}}>选择</Button>
  1117. </FormItem>
  1118. </div>
  1119. <div className='clearfix'>
  1120. <FormItem
  1121. {...formItemLayout}
  1122. label="业务品类" >
  1123. <Select placeholder="请选择业务品类"
  1124. style={{ width:'200px'}}
  1125. value={this.state.contractType}
  1126. onChange={(e)=>{this.setState({contractType:e})}}>
  1127. {
  1128. categoryList.map(function (item) {
  1129. return <Select.Option key={item.id} >{item.name}</Select.Option>
  1130. })
  1131. }
  1132. </Select>
  1133. <span className="mandatory">*</span>
  1134. </FormItem>
  1135. </div>
  1136. <div className='clearfix'>
  1137. <FormItem
  1138. labelCol={{ span: 8 }}
  1139. wrapperCol={{ span: 12 }}
  1140. label="项目说明" >
  1141. <Input type="textarea" placeholder="请输入签单备注" rows={4} value={this.state.signComment}
  1142. onChange={(e)=>{this.setState({signComment:e.target.value})}}/>
  1143. </FormItem>
  1144. </div>
  1145. </div>
  1146. </div>
  1147. <FormItem wrapperCol={{ span: 12, offset: 4 }} className="half-middle">
  1148. <Button type="primary" onClick={this.admissibleOrder} style={{marginLeft:'55px'}}>保存</Button>
  1149. <Button className="submitSave" type="ghost" onClick={this.projectCancel}>返回</Button>
  1150. </FormItem>
  1151. </Spin>
  1152. </Form >
  1153. </Modal>
  1154. <Modal maskClosable={false} visible={this.state.distributionVisible}
  1155. onOk={this.distributionOk} onCancel={this.distributionCancel}
  1156. width='800px'
  1157. title={this.state.transferState?'转交责任人':'分派任务单' }
  1158. footer=''
  1159. className="admin-desc-content">
  1160. <Form layout="horizontal" id="demand-form" style={{paddingBottom:'40px'}} >
  1161. <Spin spinning={this.state.loading}>
  1162. <div>
  1163. <Select placeholder="部门"
  1164. style={{ width: 150 ,marginRight:'10px',marginLeft:'10px'}}
  1165. value={this.state.departmenttList}
  1166. onChange={(e) => { this.setState({ departmenttList: e }) }}>
  1167. {
  1168. departmentArr.map(function (item) {
  1169. return <Select.Option key={item.id} >{item.name}</Select.Option>
  1170. })
  1171. }
  1172. </Select>
  1173. <Input placeholder={this.state.transferState?"责任人":"咨询师"} style={{width:'150px',marginLeft:'10px'}}
  1174. value={this.state.financeNameSearch}
  1175. onChange={(e) => { this.setState({ financeNameSearch: e.target.value }); }} />
  1176. <Button type="primary" onClick={this.searchOrder} style={{marginLeft:'10px',marginRight:'10px'}}>搜索</Button>
  1177. <Button onClick={this.resetOrder}>重置</Button>
  1178. </div>
  1179. <div className="patent-table" style={{marginTop:'10px'}}>
  1180. <Spin spinning={this.state.loading}>
  1181. <Table columns={this.state.userList}
  1182. dataSource={this.state.distributionList}
  1183. pagination={false}
  1184. />
  1185. </Spin>
  1186. </div>
  1187. </Spin>
  1188. </Form>
  1189. </Modal>
  1190. <Modal maskClosable={false} visible={this.state.orderVisible}
  1191. onOk={this.orderCancel} onCancel={this.orderCancel}
  1192. width='800px'
  1193. title={this.state.seeState?'查看订单':'查看联系人'}
  1194. footer=''
  1195. className="admin-desc-content">
  1196. <Form layout="horizontal" id="demand-form" style={{paddingBottom:'40px'}} >
  1197. <Spin spinning={this.state.loading}>
  1198. <div className="patent-table" style={{marginTop:'10px'}}>
  1199. <Spin spinning={this.state.loading}>
  1200. {this.state.seeState?
  1201. <div className="clearfix">
  1202. <FormItem className="half-item"
  1203. {...formItemLayout}
  1204. label="订单编号" >
  1205. <span>{orderArr.orderNo}</span>
  1206. </FormItem>
  1207. <FormItem className="half-item"
  1208. {...formItemLayout}
  1209. label="下单时间" >
  1210. <span>{orderArr.createTime}</span>
  1211. </FormItem>
  1212. <FormItem className="half-item"
  1213. {...formItemLayout}
  1214. label="客户名称" >
  1215. <span>{orderArr.buyerName}</span>
  1216. </FormItem>
  1217. <FormItem className="half-item"
  1218. {...formItemLayout}
  1219. label="订单类型" >
  1220. <span>{getOrderType(orderArr.orderType)}</span>
  1221. </FormItem>
  1222. <FormItem className="half-item"
  1223. {...formItemLayout}
  1224. label="订单渠道" >
  1225. <span>{getOrderChannel(orderArr.orderChannel)}</span>
  1226. </FormItem>
  1227. <FormItem className="half-item"
  1228. {...formItemLayout}
  1229. label="订单状态" >
  1230. <span>{getOrderState(orderArr.orderStatus)}</span>
  1231. </FormItem>
  1232. <FormItem className="half-item"
  1233. {...formItemLayout}
  1234. label="已收款项" >
  1235. <span>{orderArr.actuallyTotalAmount+'万元'}</span>
  1236. </FormItem>
  1237. <FormItem className="half-item"
  1238. {...formItemLayout}
  1239. label="结算状态" >
  1240. <span>{getPaymentState(orderArr.liquidationStatus)}</span>
  1241. </FormItem>
  1242. <FormItem className="half-item"
  1243. {...formItemLayout}
  1244. label="市价订单金额" >
  1245. <span>{orderArr.orderAmount+'万元'}</span>
  1246. </FormItem>
  1247. <FormItem className="half-item"
  1248. {...formItemLayout}
  1249. label="市价首款金额" >
  1250. <span>{orderArr.firstPayment+'万元'}</span>
  1251. </FormItem>
  1252. <div className='clearfix'>
  1253. <FormItem className="half-item"
  1254. {...formItemLayout}
  1255. label="实签订单金额" >
  1256. <span>{orderArr.signTotalAmount+'万元'}</span>
  1257. </FormItem>
  1258. <FormItem className="half-item"
  1259. {...formItemLayout}
  1260. label="实签首款金额" >
  1261. <span>{orderArr.signFirstPayment+'万元'}</span>
  1262. </FormItem>
  1263. <FormItem className="half-item"
  1264. {...formItemLayout}
  1265. label="特批立项" >
  1266. <span>{getApprovedState(orderArr.approval)}</span>
  1267. </FormItem>
  1268. <div className='clearfix'>
  1269. <FormItem
  1270. labelCol={{ span: 4 }}
  1271. wrapperCol={{ span: 16 }}
  1272. label="订单留言" >
  1273. <span>{orderArr.orderRemarks}</span>
  1274. </FormItem>
  1275. </div>
  1276. </div>
  1277. </div>:
  1278. <Table columns={this.state.contractList}
  1279. dataSource={this.state.contractArr}
  1280. pagination={false}
  1281. />}
  1282. </Spin>
  1283. </div>
  1284. </Spin>
  1285. </Form>
  1286. </Modal>
  1287. </div>
  1288. )
  1289. }
  1290. }));
  1291. export default MySettlementDetaile;