goods_check_lists_title.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. /*
  2. * 商品管理——待审核商品
  3. * */
  4. import { connect } from 'dva/index';
  5. import React, { Component, Fragment } from 'react';
  6. import { Form, Spin } from 'antd';
  7. import Link from 'umi/link';
  8. import {
  9. failTip,
  10. sucTip,
  11. list_com_page_size_10,
  12. dragSldTableColumn,
  13. getTableNum,
  14. sldComLanguage,
  15. sldPopConfirm,
  16. dateFormat,
  17. sldHandlePaginationData,
  18. sldtbaleOpeBtnText,
  19. sldIconBtn,
  20. formItemLayoutModal,
  21. getSldListGoodsImg80,
  22. list_com_page_more,
  23. sldLlineRtextAddGoodsAddMargin,
  24. quillEscapeToHtml,
  25. } from '@/utils/utils';
  26. import global from '@/global.less';
  27. import styles from './product.less';
  28. import StandardTable from '@/components/StandardTable';
  29. import Search from '@/components/Search/Search';
  30. import SldModal from '@/components/SldModal/SldModal';
  31. let pageSize = list_com_page_size_10;
  32. @connect(({ product }) => ({
  33. product,
  34. }))
  35. @Form.create()
  36. export default class GoodsCheckLists extends Component {
  37. constructor(props) {
  38. super(props);
  39. this.state = {
  40. search_height:0,
  41. modal_width:700,
  42. modalVisibleDetail: false,
  43. initLoading: false,
  44. submiting: false,
  45. show_foot: false,
  46. modalVisible: false,//是否显示规格弹框
  47. data: {},//列表数据
  48. selectedRows: [],
  49. selectedRowKeys: [],//selectedRows的key
  50. title: `${sldComLanguage('商品规格')}`,
  51. type: 'add',//'add'新增 'edit'编辑
  52. params: { pageSize: pageSize },//搜索条件
  53. search_data: [{
  54. type: 'input',
  55. label: `${sldComLanguage('商品名称')}`,
  56. name: 'goodsName',
  57. placeholder: `${sldComLanguage('请输入商品名称')}`,
  58. },{
  59. type: 'input',
  60. label: `${sldComLanguage('商品货号')}`,
  61. name: 'goodsCode',
  62. placeholder: `${sldComLanguage('请输入商品货号')}`,
  63. },{
  64. type: 'input',
  65. label: `${sldComLanguage('条形码')}`,
  66. name: 'barCode',
  67. placeholder: `${sldComLanguage('请输入商品条形码')}`,
  68. },{
  69. type: 'tree_select',
  70. label: `${sldComLanguage('店铺分类')}`,
  71. name: 'StoreCategoryId',
  72. placeholder: `${sldComLanguage('请选择店铺分类')}`,
  73. data: [],
  74. },/*{
  75. type: 'select',
  76. label: `${sldComLanguage('商品类型')}`,
  77. name: 'isVirtualGoods',
  78. placeholder: `${sldComLanguage('请选择商品类型')}`,
  79. sel_data: [
  80. { key: '', name: `${sldComLanguage('全部')}` },
  81. { key: 1, name: `${sldComLanguage('实物商品')}` },
  82. { key: 2, name: `${sldComLanguage('虚拟商品')}` },
  83. ],
  84. },*/ {
  85. type: 'select',
  86. label: `${sldComLanguage('审核状态')}`,
  87. name: 'auditState',
  88. placeholder: `${sldComLanguage('请选择会员状态')}`,
  89. sel_data: [
  90. { key: '', name: `${sldComLanguage('全部')}`},
  91. { key: '2', name: `${sldComLanguage('待审核')}` },
  92. { key: '4', name: `${sldComLanguage('审核拒绝')}` },
  93. ],
  94. }],
  95. view_spec_data: [{
  96. type: 'scroll_table',
  97. name: '',
  98. label: ``,
  99. width: 740,
  100. content: '',
  101. data: [],
  102. columns: this.goods_spec_columns,
  103. rowKey: 'productId',
  104. }],//查看规格
  105. formValues: {},//搜索条件
  106. addData:[{
  107. type: 'select',
  108. label: `${sldComLanguage('顶部版式')}`,
  109. name: 'topTemplateId',
  110. placeholder: `${sldComLanguage('请选择顶部关联版式')}`,
  111. sel_data: [],
  112. sele_key: 'templateId',
  113. sele_name: 'templateName',
  114. diy: true,
  115. },{
  116. type: 'select',
  117. label: `${sldComLanguage('底部版式')}`,
  118. name: 'bottomTemplateId',
  119. placeholder: `${sldComLanguage('请选择底部关联版式')}`,
  120. sel_data: [],
  121. sele_key: 'templateId',
  122. sele_name: 'templateName',
  123. diy: true,
  124. }],//设置关联版式的数据
  125. operateData: [],
  126. columns: [
  127. {
  128. title: ' ',
  129. align: 'center',
  130. width: 30,
  131. render: (text, record, index) => getTableNum(this.state.params, pageSize, index),
  132. },
  133. {
  134. title: `${sldComLanguage('商品信息')}`,
  135. dataIndex: 'mainImage',
  136. align: 'center',
  137. width: 250,
  138. render: (text, record) => {
  139. return <div className={`${styles.goods_info} ${global.com_flex_row_flex_start}`}>
  140. {/*{record.isVirtualGoods == 2&&<span className={`${styles.virtual_goods_flag}`}>虚拟</span>}*/}
  141. <div className={styles.goods_img}>{getSldListGoodsImg80(text)}</div>
  142. <div className={`${global.com_flex_column_space_between} ${styles.goods_detail}`}>
  143. <span className={styles.goods_name}>
  144. {record.goodsName}
  145. </span>
  146. <span className={styles.goods_brief}>
  147. {record.categoryPath}
  148. </span>
  149. </div>
  150. </div>;
  151. },
  152. },
  153. {
  154. title: `${sldComLanguage('店铺分类')}`,
  155. dataIndex: 'innerLabelList',
  156. align: 'center',
  157. render: (text, record, index) => {
  158. return <div className={`${global.flex_column_center_center}`}>
  159. {text!=undefined&&text.length>0
  160. ?<Fragment>
  161. {text.map((item,index)=>{
  162. return <div key={index}>
  163. {quillEscapeToHtml(quillEscapeToHtml(item))}
  164. </div>
  165. })}
  166. </Fragment>
  167. :'--'
  168. }
  169. </div>;
  170. },
  171. },
  172. {
  173. title: `${sldComLanguage('商品价格')}`,
  174. dataIndex: 'goodsMoney',
  175. align: 'center',
  176. },
  177. // {
  178. // title: `${sldComLanguage('商品库存')}`,
  179. // dataIndex: 'goodsStock',
  180. // align: 'center',
  181. // render: (text, record, index) => {
  182. // return <span style={{color:record.warning?'#FF490A':'#696969',fontWeight:record.warning?'700':'500'}}>{text}</span>;
  183. // },
  184. // },
  185. {
  186. title: `${sldComLanguage('是否推荐')}`,
  187. dataIndex: 'storeIsRecommend',
  188. align: 'center',
  189. render: (text, record) => {
  190. return text==1?`${sldComLanguage('推荐')}`:`${sldComLanguage('不推荐')}`
  191. },
  192. },
  193. {
  194. title: `${sldComLanguage('审核状态')}`,
  195. dataIndex: 'stateValue',
  196. align: 'center',
  197. },
  198. {
  199. title: `${sldComLanguage('拒绝理由')}`,
  200. dataIndex: 'auditReason',
  201. align: 'center',
  202. render: (text, record) =>{
  203. return (text?text:'')+(record.auditComment?(','+record.auditComment):'')
  204. }
  205. },
  206. {
  207. title: `${sldComLanguage('操作')}`,
  208. align: 'center',
  209. width: 100,
  210. render: (text, record) => (
  211. <Fragment>
  212. {sldtbaleOpeBtnText(`${sldComLanguage('查看规格')}`, () => this.viewSpec(record))}
  213. <span className={global.splitLine}></span>
  214. <Link to={{
  215. pathname: '/goods/goods_check_list_to_add',
  216. query: {
  217. id: record.goodsId,
  218. },
  219. }}>
  220. {sldtbaleOpeBtnText(`${sldComLanguage('编辑')}`, () => null)}
  221. </Link>
  222. </Fragment>
  223. ),
  224. },
  225. ]
  226. };
  227. }
  228. goods_spec_columns = [
  229. {
  230. title: ' ',
  231. dataIndex: 'productId',
  232. align: 'center',
  233. width: 30,
  234. render: (text, record, index) => {
  235. return index + 1;
  236. },
  237. },
  238. {
  239. title: `${sldComLanguage('商品规格')}`,
  240. dataIndex: 'specValues',
  241. align: 'center',
  242. width: 200,
  243. render: (text, record, index) => {
  244. return <div style={{width:200,wordBreak:'normal',wordWrap:'break-word'}}>{text}</div>;
  245. },
  246. },
  247. // {
  248. // title: `${sldComLanguage('价格(元)')}`,
  249. // dataIndex: 'productPrice',
  250. // align: 'center',
  251. // width: 110,
  252. // },
  253. // {
  254. // title: `${sldComLanguage('库存')}`,
  255. // dataIndex: 'productStock',
  256. // align: 'center',
  257. // width: 100,
  258. // render: (text, record, index) => {
  259. // return <span style={{color:record.warning?'#FF490A':'#696969',fontWeight:record.warning?'700':'500'}}>{text}</span>;
  260. // },
  261. // },
  262. {
  263. title: `${sldComLanguage('货号')}`,
  264. dataIndex: 'productCode',
  265. align: 'center',
  266. width: 150,
  267. render: (text) => {
  268. return text?text:'--';
  269. },
  270. },
  271. {
  272. title: `${sldComLanguage('条形码')}`,
  273. dataIndex: 'barCode',
  274. align: 'center',
  275. width: 150,
  276. render: (text) => {
  277. return text?text:'--';
  278. },
  279. },
  280. ];
  281. componentDidMount() {
  282. this.get_list({pageSize})
  283. this.getTemplateList();
  284. this.getStoreCat();//获取店铺分类
  285. this.resize();
  286. window.addEventListener('resize', this.resize);
  287. }
  288. componentWillUnmount() {
  289. window.removeEventListener('resize', this.resize);
  290. }
  291. resize = () =>{
  292. const {search_height} = this.state;
  293. if(this.refs.search_part!=undefined){
  294. if(this.refs.search_part.clientHeight != search_height){
  295. this.setState({search_height:this.refs.search_part.clientHeight})
  296. }
  297. }
  298. }
  299. //获取店铺分类
  300. getStoreCat = () => {
  301. const { dispatch } = this.props;
  302. let { search_data } = this.state;
  303. let dis_type = 'product/get_store_category_list';
  304. let payload = { pageSize: list_com_page_more };
  305. dispatch({
  306. type: dis_type,
  307. payload: payload,
  308. callback: (res) => {
  309. if (res.state == 200) {
  310. let tmp_data = search_data.filter(item => item.name == 'StoreCategoryId')[0];
  311. for (let i in res.data) {
  312. res.data[i].key = res.data[i].innerLabelId;
  313. res.data[i].value = res.data[i].innerLabelId;
  314. res.data[i].title = res.data[i].innerLabelName;
  315. if (res.data[i].children != null && res.data[i].children.length > 0) {
  316. res.data[i].children.map(item => {
  317. item.key = item.innerLabelId;
  318. item.value = item.innerLabelId;
  319. item.title = item.innerLabelName;
  320. });
  321. }
  322. }
  323. tmp_data.data = res.data;
  324. this.setState({ search_data });
  325. }
  326. },
  327. });
  328. };
  329. //设置关联版式
  330. setTemplate = () => {
  331. let { addData} = this.state;
  332. this.setState({
  333. operateData: JSON.parse(JSON.stringify(addData)),
  334. title:`${sldComLanguage('设置关联版式')}`,
  335. modal_width: 500,
  336. modalVisible: true,
  337. type: 'template',
  338. show_foot: true,
  339. })
  340. }
  341. sldHandleConfirm = (val) => {
  342. const { selectedRowKeys } = this.state;
  343. val.goodsIds = selectedRowKeys.join(',');
  344. if(val.topTemplateId == undefined&&val.bottomTemplateId == undefined){
  345. failTip(`${sldComLanguage('请至少选择一个模版')}`);
  346. return false;
  347. }
  348. this.operateGoods(val,'template');
  349. };
  350. // 查看规格
  351. viewSpec = (val) => {
  352. let { view_spec_data,operateData } = this.state;
  353. operateData = JSON.parse(JSON.stringify(view_spec_data));
  354. operateData[0].columns = this.goods_spec_columns;
  355. operateData[0].data = val.productList;
  356. this.setState({
  357. modalVisible: true,
  358. show_foot:false,
  359. title:`${sldComLanguage('查看规格')}`,
  360. modal_width:760,
  361. operateData
  362. });
  363. };
  364. //商品操作
  365. operateGoods = (id, type) => {
  366. this.setState({submiting:true});
  367. const { params } = this.state;
  368. const { dispatch } = this.props;
  369. let param_data = {};
  370. let dis_type = '';
  371. if (type == 'lockup') {
  372. dis_type = 'product/lockup_goods';
  373. param_data = id;
  374. } else if (type == 'recommend') {
  375. dis_type = 'product/set_goods_recommend';
  376. param_data = id
  377. } else if (type == 'del') {
  378. dis_type = 'product/del_goods';
  379. param_data = id
  380. } else if (type == 'template') {
  381. dis_type = 'product/set_related_template';
  382. param_data = id
  383. }
  384. dispatch({
  385. type: dis_type,
  386. payload: param_data,
  387. callback: (res) => {
  388. this.setState({submiting:false});
  389. if (res.state == 200) {
  390. sucTip(res.msg);
  391. this.get_list(params);
  392. this.setState({
  393. selectedRows: [],
  394. selectedRowKeys: [],
  395. modalVisible:false
  396. })
  397. } else {
  398. failTip(res.msg);
  399. }
  400. },
  401. });
  402. };
  403. //获取数据列表
  404. get_list = (params) => {
  405. this.setState({ initLoading: true });
  406. const { dispatch } = this.props;
  407. dispatch({
  408. type: 'product/get_goods_lists',
  409. payload: { ...params, state: 2 },
  410. callback: (res) => {
  411. this.setState({ initLoading: false });
  412. if (res.state == 200) {
  413. if (res.data.length == 0 && this.state.params.current > 1) {
  414. params.current = params.current - 1;
  415. this.get_list(params);
  416. } else {
  417. this.setState({
  418. data: res.data,
  419. });
  420. }
  421. }
  422. },
  423. });
  424. };
  425. //获取关联版式列表
  426. getTemplateList = () => {
  427. const { dispatch } = this.props;
  428. let {addData} = this.state;
  429. dispatch({
  430. type: 'product/get_related_template_lists',
  431. payload: { pageSize: list_com_page_more },
  432. callback: (res) => {
  433. this.setState({ initLoading: false });
  434. if (res.state == 200) {
  435. let topData = res.data.list.filter(item=>item.templatePosition == 1);
  436. let bottomData = res.data.list.filter(item=>item.templatePosition == 2);
  437. for(let i in addData){
  438. if(addData[i].name == 'topTemplateId'){
  439. addData[i].sel_data = topData;
  440. }else{
  441. addData[i].sel_data = bottomData;
  442. }
  443. }
  444. this.setState({addData})
  445. }
  446. },
  447. });
  448. };
  449. handleSelectRows = (rows, rowkeys) => {
  450. this.setState({
  451. selectedRows: rows,
  452. selectedRowKeys: rowkeys,
  453. });
  454. };
  455. handleTablePagination = (pagination, filtersArg, sorter, type = 'main') => {
  456. const { formValues } = this.state;
  457. if (type == 'main') {
  458. const params = sldHandlePaginationData(pagination, filtersArg, sorter, formValues);
  459. pageSize = params.pageSize;
  460. this.setState({ params });
  461. this.get_list(params);
  462. }
  463. };
  464. //表格拖动
  465. resizeTable = (index, size, type, data) => {
  466. let datas = dragSldTableColumn(index, size, data);
  467. this.setState({ [type]: datas });
  468. };
  469. //搜索事件
  470. search = (data) => {
  471. const values = { ...data };
  472. //时间处理
  473. if (values.search_create_time) {
  474. values.startTime = values.search_create_time[0] ? values.search_create_time[0].format(dateFormat)+' 00:00:00' : '';
  475. values.endTime = values.search_create_time[1] ? values.search_create_time[1].format(dateFormat)+' 23:59:59' : '';
  476. values.search_create_time = '';
  477. }
  478. for (let i in values) {
  479. if (values[i] == '') {
  480. delete values[i];
  481. }
  482. }
  483. this.setState({
  484. formValues: values,
  485. params: { pageSize: pageSize }
  486. });
  487. this.get_list({ pageSize: pageSize, ...values });
  488. };
  489. //搜索重置事件
  490. seaReset = () => {
  491. //搜索条件置为空
  492. this.setState({
  493. formValues: {},
  494. params: { pageSize: pageSize }
  495. });
  496. this.get_list({ pageSize: pageSize });
  497. };
  498. sldHandleCancle = () => {
  499. this.setState({ modalVisible: false });
  500. };
  501. //搜索点击
  502. moreSearchToggle = () => {
  503. const {search_height} = this.state;
  504. if(this.refs.search_part!=undefined){
  505. if(this.refs.search_part.clientHeight != search_height){
  506. this.setState({search_height:this.refs.search_part.clientHeight})
  507. }
  508. }
  509. }
  510. render() {
  511. const { selectedRows, selectedRowKeys, search_data, columns, initLoading, data, modalVisible,operateData,title,modal_width,show_foot,submiting, search_height } = this.state;
  512. return (
  513. <div className={global.common_page} style={{ flex: 1,}}>
  514. {sldLlineRtextAddGoodsAddMargin('#69A2F2', `${sldComLanguage('待审核商品')}`, 0, 0, 10)}
  515. <div className={global.tableListForm} ref={'search_part'}>
  516. <Search search_data={search_data} moreSearchToggle={() => this.moreSearchToggle()}
  517. seaSubmit={(data) => this.search(data)} seaReset={() => this.seaReset()}/>
  518. </div>
  519. {/*公共功能条-start*/}
  520. <div className={global.operate_bg}
  521. style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between' }}>
  522. <div style={{ display: 'flex', flexDirection: 'row' }}>
  523. {selectedRowKeys.length == 0 ? sldIconBtn(() => {
  524. failTip(`${sldComLanguage('请先选中数据')}`);
  525. //确认删除选中的商品吗?
  526. }, `${sldComLanguage('删除')}`, 7, 0, 15, 15, 3, 'piliangshanchu', '#F21414') : sldPopConfirm('leftBottom', `${sldComLanguage('确认删除选中的商品吗?')}`, () => this.operateGoods({goodsIds:selectedRowKeys.join(',')}, 'del'), `${sldComLanguage('确定')}`, `${sldComLanguage('取消')}`, sldIconBtn(null, `${sldComLanguage('删除')}`, 7, 0, 15, 15, 3, 'piliangshanchu', '#F21414'), 0, 0, '#F21414')}
  527. {selectedRowKeys.length == 0 ? sldIconBtn(() => {
  528. failTip(`${sldComLanguage('请先选中数据')}`);
  529. //确认将选中的商品设置为推荐商品吗?
  530. }, `${sldComLanguage('设置推荐')}`, 7, 0, 15, 15, 3, 'nav-tuijian', '#ffa70f') : sldPopConfirm('leftBottom', `${sldComLanguage('确认将选中的商品设置为推荐商品吗?')}`, () => this.operateGoods({goodsIds:selectedRowKeys.join(','),isRecommend:1}, 'recommend'), `${sldComLanguage('确定')}`, `${sldComLanguage('取消')}`, sldIconBtn(null, `${sldComLanguage('设置推荐')}`, 7, 0, 15, 15, 3, 'nav-tuijian', '#ffa70f'), 0, 0, '#ffa70f')}
  531. {selectedRowKeys.length == 0 ? sldIconBtn(() => {
  532. failTip(`${sldComLanguage('请先选中数据')}`);
  533. //确认将选中的商品取消推荐吗?
  534. }, `${sldComLanguage('取消推荐')}`, 7, 0, 15, 15, 3, 'quxiaotuijian2', '#0f419c') : sldPopConfirm('leftBottom', `${sldComLanguage('确认将选中的商品取消推荐吗?')}`, () => this.operateGoods({goodsIds:selectedRowKeys.join(','),isRecommend:0}, 'recommend'), `${sldComLanguage('确定')}`, `${sldComLanguage('取消')}`, sldIconBtn(null, `${sldComLanguage('取消推荐')}`, 7, 0, 15, 15, 3, 'quxiaotuijian2', '#0f419c'), 0, 0, '#0f419c')}
  535. {selectedRowKeys.length == 0
  536. ? sldIconBtn(() => {
  537. failTip(`${sldComLanguage('请先选中数据')}`);
  538. //确认为选中的商品设置关联版式吗?
  539. }, `${sldComLanguage('设置关联版式')}`, 7, 0, 14, 14, 3, 'glsz', '#0c93f2')
  540. : sldIconBtn(() => this.setTemplate(), `${sldComLanguage('设置关联版式')}`, 7, 0, 14, 14, 3, 'glsz', '#0c93f2')}
  541. </div>
  542. </div>
  543. {/*公共功能条-end*/}
  544. <Spin spinning={initLoading}>
  545. {/*标准表格-start*/}
  546. <StandardTable
  547. totalHeight={document.body.clientHeight - 145 - search_height - 15}
  548. bordered={false}
  549. selectedRows={selectedRows}
  550. data={data}
  551. rowKey={'goodsId'}
  552. isCheck={true}
  553. columns={columns}
  554. onSelectRow={this.handleSelectRows}
  555. onChange={(pagination, filtersArg, sorter) => this.handleTablePagination(pagination, filtersArg, sorter, 'main')}
  556. onSldHandleSeleRow={this.onSldHandleSeleRow}
  557. resizeTable={(index, size) => this.resizeTable(index, size, 'columns', columns)}
  558. isColumnResize={true}
  559. />
  560. {/*标准表格-end*/}
  561. </Spin>
  562. { /*新增/编辑对话框-start*/}
  563. <SldModal
  564. width={modal_width}
  565. title={title}
  566. submiting={submiting}
  567. modalVisible={modalVisible}
  568. sldHandleConfirm={(val) => this.sldHandleConfirm(val)}
  569. sldHandleCancle={this.sldHandleCancle}
  570. formItemLayoutModal={formItemLayoutModal}
  571. content={operateData}
  572. show_foot={show_foot}
  573. />
  574. { /*新增/编辑对话框-end*/}
  575. </div>
  576. );
  577. }
  578. }