patentSchedule.jsx 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. import React,{ Component } from 'react';
  2. import {Button, DatePicker, Select, Table, Input, Modal, Spin, message} from "antd";
  3. import moment from "moment";
  4. import $ from "jquery";
  5. const { Option } = Select;
  6. const confirm = Modal.confirm;
  7. class PatentSchedule extends Component{
  8. constructor(props) {
  9. super(props);
  10. this.state={
  11. columns: [
  12. {
  13. title: '批次',
  14. dataIndex: 'key',
  15. key: 'key',
  16. render: (text, record,index) => {
  17. return index+1;
  18. }
  19. },
  20. {
  21. title: props.bpType === 6 ? '商标号' : '专利号',
  22. dataIndex: 'patentNo',
  23. key: 'patentNo',
  24. render: (text, record,index) => {
  25. return !record.isChange ? text : <Input
  26. value={text}
  27. size={'small'}
  28. style={{
  29. width: '100px'
  30. }}
  31. onChange={(e)=>{
  32. this.changeEvidence(e.target.value,index,'patentNo')
  33. }}/>
  34. }
  35. },
  36. {
  37. title: props.bpType === 6 ? '商标名称' : '专利名称',
  38. dataIndex: 'patentName',
  39. key: 'patentName',
  40. render: (text, record,index) => {
  41. return !record.isChange ? text : <Input
  42. value={text}
  43. style={{width: '100px'}}
  44. size={'small'}
  45. onChange={(e)=>{
  46. this.changeEvidence(e.target.value,index,'patentName')
  47. }}/>
  48. }
  49. },
  50. {
  51. title: '受理时间',
  52. dataIndex: 'acceptTimes',
  53. key: 'acceptTimes',
  54. render: (text, record,index) => {
  55. return !record.isChange ? text : <DatePicker
  56. value={
  57. text ? moment(text) : null
  58. }
  59. size={'small'}
  60. style={{
  61. marginTop: '4px',
  62. width: '100px'
  63. }}
  64. showTime
  65. format="YYYY-MM-DD"
  66. onChange={(data, dataString) => {
  67. this.changeEvidence(dataString,index,'acceptTimes')
  68. }}
  69. />
  70. }
  71. },
  72. {
  73. title: '下证时间',
  74. dataIndex: 'licenceTimes',
  75. key: 'licenceTimes',
  76. render: (text, record,index) => {
  77. return !record.isChange ? text : <DatePicker
  78. value={
  79. text ? moment(text) : null
  80. }
  81. size={'small'}
  82. style={{
  83. marginTop: '4px',
  84. width: '100px'
  85. }}
  86. showTime
  87. format="YYYY-MM-DD"
  88. onChange={(data, dataString) => {
  89. this.changeEvidence(dataString,index,'licenceTimes')
  90. }}
  91. />
  92. }
  93. },
  94. {
  95. title: '状态',
  96. dataIndex: 'status',
  97. key: 'status',
  98. render: (text, record,index) => {
  99. return !record.isChange ? text === 0 ? '待审核' : text === 1 ? '通过' : '驳回' : <Select style={{width:'80px'}} value={text} size={'small'} onChange={(v)=>{
  100. this.changeEvidence(v,index,'status')
  101. }}>
  102. <Option value={0}>待审核</Option>
  103. <Option value={1}>通过</Option>
  104. <option value={2}>驳回</option>
  105. </Select>
  106. }
  107. },
  108. {
  109. title: '操作',
  110. dataIndex: 'h',
  111. key: 'h',
  112. render: (text, record,index) => {
  113. return (
  114. !props.readOnly ? <span>
  115. <Button
  116. size={'small'}
  117. style={{
  118. marginRight:'10px',
  119. color: '#ffffff',
  120. background: '#f00',
  121. border: 'none',
  122. }}
  123. onClick={()=>{
  124. let _this = this;
  125. if(record.isChange){
  126. this.state.dataSource.splice(index,1)
  127. this.setState({
  128. dataSource: this.state.dataSource
  129. })
  130. }else{
  131. confirm({
  132. title: '提醒',
  133. content: '确定要删除吗?',
  134. onOk() {
  135. _this.delectTaskProgress(record.id)
  136. }
  137. })
  138. }
  139. }}
  140. >
  141. 删除
  142. </Button>
  143. {record.id && !record.isChange && <Button size={'small'} type='primary' onClick={()=>{
  144. this.state.dataSource[index]['isChange'] = true
  145. this.setState({
  146. dataSource: this.state.dataSource
  147. })
  148. }}>修改</Button>}
  149. {record.isChange &&<Button size={'small'} style={{
  150. marginLeft:'10px',
  151. color: '#ffffff',
  152. background: '#4ad028',
  153. border: 'none',
  154. }} onClick={()=>{
  155. if(record.id){
  156. this.changeTaskProgress(record);
  157. }else{
  158. this.createTaskProgress(record);
  159. }
  160. }}>保存</Button> }
  161. </span> : null
  162. )
  163. }
  164. }
  165. ],
  166. dataSource: [],
  167. visible: false,
  168. columnsA: [
  169. {
  170. title: '时间',
  171. dataIndex: 'createTime',
  172. key: 'createTime',
  173. },
  174. {
  175. title: '操作类型',
  176. dataIndex: 'status',
  177. key: 'status',
  178. render: (text, record) => {
  179. return text === 0 ? '新增' : text === 1 ? '删除' : '修改'
  180. }
  181. },
  182. {
  183. title: '专利号',
  184. dataIndex: 'patentName',
  185. key: 'patentName',
  186. }
  187. ],
  188. dataSourceA: [],
  189. progressLogLoading: false,
  190. acceptCount: props.acceptCount || 0,
  191. certificatesCount: props.certificatesCount || 0,
  192. rejectCount: props.rejectCount || 0,
  193. };
  194. this.changeEvidence = this.changeEvidence.bind(this);
  195. this.createTaskProgress = this.createTaskProgress.bind(this);
  196. this.selectTaskProgressLog = this.selectTaskProgressLog.bind(this);
  197. this.delectTaskProgress = this.delectTaskProgress.bind(this);
  198. this.changeTaskProgress = this.changeTaskProgress.bind(this);
  199. this.loaduserss = this.loaduserss.bind(this);
  200. }
  201. changeEvidence(value,index,key){
  202. this.state.dataSource[index][key] = value;
  203. this.setState({
  204. dataSource: this.state.dataSource
  205. })
  206. }
  207. //新增申报进度
  208. createTaskProgress(record) {
  209. if(!record.patentNo){
  210. message.warning('请填写专利号');
  211. return;
  212. }
  213. if(!record.patentName){
  214. message.warning('请填写专利名称');
  215. return;
  216. }
  217. if(typeof record.status !== 'number'){
  218. message.warning('请选择状态');
  219. return;
  220. }
  221. let _this = this;
  222. let data = Object.assign({},record);
  223. delete data.isChange;
  224. delete data.key;
  225. data.taskId = this.props.taskId;
  226. data.alreadyNumber = 1;
  227. data.type = this.props.bpType === 1 ? 1 : this.props.bpType === 6 ? 2 : '';//0软著 1专利 2商标
  228. $.ajax({
  229. method: 'post',
  230. dataType: 'json',
  231. crossDomain: false,
  232. url: globalConfig.context + '/api/admin/orderProject/createTaskProgress',
  233. data: data,
  234. success: function (data) {
  235. if (data.error.length) {
  236. if (data.error && data.error.length) {
  237. message.warning(data.error[0].message)
  238. }
  239. }else{
  240. message.success('添加成功');
  241. delete record.isChange;
  242. delete record.key;
  243. _this.props.refresh && _this.props.refresh();
  244. _this.loaduserss();
  245. }
  246. }.bind(this),
  247. }).always(
  248. function () {
  249. this.setState({
  250. loading: false,
  251. })
  252. }.bind(this)
  253. )
  254. }
  255. //申报进度日志
  256. selectTaskProgressLog() {
  257. this.setState({
  258. loading: true,
  259. })
  260. $.ajax({
  261. method: 'get',
  262. dataType: 'json',
  263. crossDomain: false,
  264. url: globalConfig.context + '/api/admin/orderProject/selectTaskProgressLog',
  265. data: {
  266. tid: this.props.taskId,
  267. },
  268. success: function (data) {
  269. let theArr = []
  270. if (data.error.length || data.data.list === '') {
  271. if (data.error && data.error.length) {
  272. message.warning(data.error[0].message)
  273. }
  274. } else {
  275. for (let i = 0; i < data.data.length; i++) {
  276. let thisdata = data.data[i];
  277. thisdata.key = i;
  278. theArr.push(thisdata)
  279. }
  280. }
  281. this.setState({
  282. dataSourceA: theArr,
  283. })
  284. }.bind(this),
  285. }).always(
  286. function () {
  287. this.setState({
  288. loading: false,
  289. })
  290. }.bind(this)
  291. )
  292. }
  293. //修改申报进度
  294. changeTaskProgress(record) {
  295. if(!record.patentNo){
  296. message.warning('请填写专利号');
  297. return;
  298. }
  299. if(!record.patentName){
  300. message.warning('请填写专利名称');
  301. return;
  302. }
  303. if(typeof record.status !== 'number'){
  304. message.warning('请选择状态');
  305. return;
  306. }
  307. let _this = this;
  308. let data = Object.assign({},record);
  309. delete data.isChange;
  310. delete data.key;
  311. data.taskId = this.props.taskId;
  312. data.alreadyNumber = 1;
  313. data.type = this.props.bpType === 1 ? 1 : this.props.bpType === 6 ? 2 : '';//0软著 1专利 2商标
  314. for(let i in data){
  315. if(typeof data[i] === 'object'){
  316. delete data[i]
  317. }
  318. }
  319. $.ajax({
  320. method: 'post',
  321. dataType: 'json',
  322. crossDomain: false,
  323. url: globalConfig.context + '/api/admin/orderProject/updateTaskProgress',
  324. data: data,
  325. success: function (data) {
  326. if (data.error.length) {
  327. if (data.error && data.error.length) {
  328. message.warning(data.error[0].message)
  329. }
  330. }else{
  331. message.success('修改成功');
  332. delete record.isChange;
  333. delete record.key;
  334. _this.props.refresh && _this.props.refresh();
  335. _this.loaduserss();
  336. }
  337. }.bind(this),
  338. }).always(
  339. function () {
  340. this.setState({
  341. loading: false,
  342. })
  343. }.bind(this)
  344. )
  345. }
  346. // 删除申报进度
  347. delectTaskProgress(id) {
  348. this.setState({
  349. loading: true,
  350. })
  351. let _this = this;
  352. $.ajax({
  353. method: 'post',
  354. dataType: 'json',
  355. crossDomain: false,
  356. url: globalConfig.context + '/api/admin/orderProject/delectTaskProgress',
  357. data: {
  358. id
  359. },
  360. success: function (data) {
  361. if (data.error.length) {
  362. if (data.error && data.error.length) {
  363. message.warning(data.error[0].message)
  364. }
  365. }else{
  366. message.success('删除成功');
  367. _this.loaduserss();
  368. _this.props.refresh && this.props.refresh();
  369. }
  370. }.bind(this),
  371. }).always(
  372. function () {
  373. this.setState({
  374. loading: false,
  375. })
  376. }.bind(this)
  377. )
  378. }
  379. //查看下证信息
  380. loaduserss() {
  381. $.ajax({
  382. method: 'get',
  383. dataType: 'json',
  384. crossDomain: false,
  385. url: globalConfig.context + '/api/admin/orderProject/selectTaskProgress',
  386. data: {
  387. tid: this.props.taskId,
  388. },
  389. success: function (data) {
  390. let thisData = []
  391. if (!thisData) {
  392. if (data.error && data.error.length) {
  393. message.warning(data.error[0].message)
  394. }
  395. } else {
  396. this.setState({
  397. dataSource: data.data,
  398. })
  399. }
  400. }.bind(this),
  401. }).always(
  402. function () {
  403. this.setState({
  404. loading: false,
  405. })
  406. }.bind(this)
  407. )
  408. }
  409. componentDidMount() {
  410. this.loaduserss();
  411. if(this.props.bpType === 1){
  412. this.state.columns.splice(-2,0,{
  413. title: '授权时间',
  414. dataIndex: 'authorizeTimes',
  415. key: 'authorizeTimes',
  416. render: (text, record,index) => {
  417. return !record.isChange ? text : <DatePicker
  418. size={'small'}
  419. style={{
  420. marginTop: '4px',
  421. width: '100px'
  422. }}
  423. value={
  424. text ? moment(text) : null
  425. }
  426. showTime
  427. format="YYYY-MM-DD"
  428. onChange={(data, dataString) => {
  429. this.changeEvidence(dataString,index,'authorizeTimes')
  430. }}
  431. />
  432. }
  433. });
  434. this.setState({
  435. columns:this.state.columns
  436. })
  437. }
  438. }
  439. render() {
  440. return (
  441. <div>
  442. <div style={{
  443. display:'flex',
  444. alignItems:'center',
  445. paddingLeft: '3%',
  446. paddingRight: '10%',
  447. color: '#000',
  448. fontWeight: 400,
  449. }}>
  450. <div style={{paddingRight:'10px'}}>派单项目数:{this.props.commodityQuantity}</div>
  451. <div style={{paddingRight:'10px'}}>
  452. 受理数:
  453. {this.props.readOnly ?
  454. this.props.acceptCount:
  455. <Input type='number' defaultValue={this.props.acceptCount || 0} value={this.state.acceptCount} style={{width:'70px'}} onChange={(e)=>{
  456. this.setState({
  457. acceptCount:e.target.value
  458. })
  459. this.props.onChange('acceptCount',e.target.value);
  460. }}/>
  461. }
  462. </div>
  463. <div style={{paddingRight:'10px'}}>
  464. 下证数(即授权数):
  465. {this.props.readOnly ?
  466. this.props.certificatesCount:
  467. <Input type='number' defaultValue={this.props.certificatesCount || 0} value={this.state.certificatesCount || (this.props.certificatesCount || 0)} style={{width:'70px'}} onChange={(e)=>{
  468. this.setState({
  469. certificatesCount:e.target.value
  470. })
  471. this.props.onChange('certificatesCount',e.target.value);
  472. }}/>
  473. }
  474. </div>
  475. <div>
  476. 驳回数:
  477. {this.props.readOnly ?
  478. this.props.rejectCount:
  479. <Input type='number' defaultValue={this.props.rejectCount || 0} value={this.state.rejectCount || (this.props.rejectCount || 0)} style={{width:'70px'}} onChange={(e)=>{
  480. this.setState({
  481. rejectCount:e.target.value
  482. })
  483. this.props.onChange('rejectCount',e.target.value);
  484. }}/>
  485. }
  486. </div>
  487. <div style={{display:'flex',alignItems:'center',marginLeft:'auto'}}>
  488. {!this.props.readOnly ? <Button
  489. type="primary"
  490. style={{ marginRight: '15px' }}
  491. onClick={()=>{
  492. let arr = this.state.dataSource.filter((v)=>v.isChange)
  493. if(arr.length > 0){
  494. message.warning('已存在未保存项,请先保存!')
  495. return;
  496. }
  497. this.state.dataSource.push({
  498. key: this.state.dataSource.length+1,
  499. isChange: true,
  500. })
  501. this.setState({
  502. dataSource: this.state.dataSource
  503. })
  504. }}
  505. >
  506. {/* bpType: 0 正常 1专利 2软著 3审计 4双软 5高新 6商标*/}
  507. {this.props.bpType === 1 ? '增加专利信息' : this.props.bpType === 6 ? '增加商标信息' : ''}
  508. </Button> : null}
  509. <Button
  510. type="primary"
  511. onClick={()=>{
  512. this.selectTaskProgressLog();
  513. this.setState({
  514. visible: true
  515. })
  516. }}
  517. >
  518. 操作日志
  519. </Button>
  520. </div>
  521. </div>
  522. <div style={{
  523. paddingTop:'10px'
  524. }}>
  525. <Spin spinning={this.state.progressLogLoading}>
  526. <Table
  527. columns={this.state.columns}
  528. scroll={{ x: 'max-content', y: 0 }}
  529. dataSource={this.state.dataSource}
  530. pagination={false}
  531. bordered
  532. size={'small'}
  533. />
  534. </Spin>
  535. </div>
  536. {this.state.visible ? <Modal
  537. maskClosable={false}
  538. width="800px"
  539. visible={this.state.visible}
  540. onCancel={()=>{
  541. this.setState({
  542. visible: false
  543. })
  544. }}
  545. title="操作日志"
  546. footer=""
  547. className="admin-desc-content"
  548. >
  549. <div className="patent-table patent-table-center">
  550. <Spin spinning={this.state.loading}>
  551. <Table
  552. columns={this.state.columnsA}
  553. dataSource={this.state.dataSourceA}
  554. pagination={false}
  555. bordered
  556. size="small"
  557. />
  558. </Spin>
  559. </div>
  560. </Modal> : null}
  561. </div>
  562. )
  563. }
  564. }
  565. export default PatentSchedule;