cate_lists.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. import { connect } from 'dva/index';
  2. import React, { Component, Fragment } from 'react';
  3. import { Form, Spin } from 'antd';
  4. import {
  5. sldIconBtn,
  6. failTip,
  7. sucTip,
  8. sldPopConfirmDiy,
  9. sldLlineRtextAddGoodsAddMargin,
  10. dragSldTableColumn,
  11. sldHandlePaginationData,
  12. formItemLayoutModal,
  13. isEmptyObject,
  14. validatorNumbe,
  15. sldComLanguage,
  16. sldtbaleOpeBtnText,
  17. } from '@/utils/utils';
  18. import global from '@/global.less';
  19. import StandardTable from '@/components/StandardTable';
  20. import SldModal from '@/components/SldModal/SldModal';
  21. import SldPreviewImg from '@/components/SldPreviewImg/SldPreviewImg';
  22. let sthis = '';
  23. @connect(({ product }) => ({
  24. product,
  25. }))
  26. @Form.create()
  27. export default class Cate_lists extends Component {
  28. constructor(props) {
  29. super(props);
  30. sthis = this;
  31. this.state = {
  32. modal_width: 300,//图片预览宽度
  33. show_preview_modal: false,//预览图片modal框是否展示
  34. preview_img: '',//预览图片
  35. preview_alt_con: '',//预览图片内容
  36. expandedRowKeys: [],//展开的行
  37. show_table_modal_add: false,//是否显示input后缀搜索modal上的新增按钮,默认不显示
  38. modalSldAddVisible: false,//是否显示input后缀add的modal框,默认不显示
  39. tablesldSAddTitle: `${sldComLanguage('添加')}`,//input后缀add的modal框的标题 添加
  40. search_add_modal_width: 500,//input后缀add的modal框的宽度
  41. cur_type: '',//show_list表示表格搜索,add表示添加数据
  42. cur_operate_type: '',//当前操作对象
  43. search_modal_width: 600,//默认搜索,modal宽度
  44. tableTitle: '',
  45. data: {},
  46. formValues: {},
  47. modalTableVisible: false,//选择商品类型弹框
  48. submiting: false,//按钮loading
  49. loading: false,//按钮loading
  50. selectedRows: [],
  51. selectedRowKeys: [],//selectedRows的key
  52. modalVisible: false,
  53. modalVisibleAdv: false,//多图选择器是否显示,默认不显示
  54. cur_data: {},//多图选择器的数据
  55. origion_data: {
  56. width: 520,
  57. height: 210,
  58. admin_show_width: 260,
  59. admin_show_height: 105,
  60. data: [{
  61. imgPath: '',
  62. imgUrl: '',
  63. info: {},
  64. link_type: '',
  65. link_value: '',
  66. title: '',
  67. }, {
  68. imgPath: '',
  69. imgUrl: '',
  70. info: {},
  71. link_type: '',
  72. link_value: '',
  73. title: '',
  74. }, {
  75. imgPath: '',
  76. imgUrl: '',
  77. info: {},
  78. link_type: '',
  79. link_value: '',
  80. title: '',
  81. }],
  82. },//多图选择器的数据
  83. modalTitle: '设置分类广告',//多图选择器标题
  84. title: `${sldComLanguage('新增商品分类')}`,
  85. type: 'add',//'add'新增 'edit'编辑
  86. params: {},//搜索条件
  87. curData: {},//编辑的数据
  88. addData: [{
  89. type: 'input',
  90. label: `${sldComLanguage('分类名称')}`,
  91. name: 'categoryName',
  92. placeholder: `${sldComLanguage('请输入分类名称')}`,
  93. initialValue: '',
  94. maxLength:20,
  95. rules: [{
  96. required: true,
  97. whitespace: true,
  98. message: `${sldComLanguage('请输入分类名称')}`,
  99. }],
  100. }, {
  101. type: 'inputnum',
  102. label: `${sldComLanguage('排序')}`,
  103. name: 'sort',
  104. extra: `${sldComLanguage('请输入0~255的数字,值越小,显示越靠前')}`,
  105. placeholder: `${sldComLanguage('请输入排序')}`,
  106. initialValue: '',
  107. rules: [{
  108. required: true,
  109. message: `${sldComLanguage('请输入排序')}`,
  110. }, { validator: (rule, value, callback) => validatorNumbe(rule, value, callback) }],
  111. }],//modal框的数据
  112. sele_cat_info: {},//添加/编辑的时候选择的分类信息
  113. columns: [
  114. {
  115. title: `${sldComLanguage('分类名称')}`,
  116. align: 'left',
  117. dataIndex: 'categoryName',
  118. width: 300,
  119. },
  120. {
  121. title: `${sldComLanguage('排序')}`,
  122. dataIndex: 'sort',
  123. align: 'center',
  124. width: 100,
  125. },
  126. {
  127. title: `${sldComLanguage('创建时间')}`,
  128. dataIndex: 'createTime',
  129. align: 'center',
  130. width: 150,
  131. },
  132. {
  133. title: `${sldComLanguage('更新时间')}`,//更新时间
  134. dataIndex: 'updateTime',
  135. align: 'center',
  136. width: 150,
  137. },
  138. {
  139. title: `${sldComLanguage('操作')}`,
  140. align: 'center',
  141. width: 100,
  142. render: (text, record) => (
  143. <Fragment>
  144. {sldtbaleOpeBtnText(`${sldComLanguage('编辑')}`, () => this.editCat(record))}
  145. {/*删除后不可恢复,是否确定删除?*/}
  146. {record.children == undefined &&
  147. <Fragment>
  148. <span className={global.splitLine}></span>
  149. {sldPopConfirmDiy('leftBottom', `${sldComLanguage('删除后不可恢复,是否确定删除')}`, () => this.operateCat(record.categoryId, 'del'), `${sldComLanguage('确定')}`, `${sldComLanguage('取消')}`,
  150. sldtbaleOpeBtnText(`${sldComLanguage('删除')}`, () => null))}
  151. </Fragment>
  152. }
  153. {record.grade <= 2 &&
  154. <Fragment>
  155. <span className={global.splitLine}></span>
  156. {sldtbaleOpeBtnText(`${sldComLanguage('添加下级分类')}`, () => this.addNextCat(record))}
  157. </Fragment>
  158. }
  159. </Fragment>
  160. ),
  161. },
  162. ],
  163. };
  164. }
  165. cat_data = {
  166. type: 'TreeSelectDIy',
  167. label: `${sldComLanguage('上级分类')}`,
  168. name: 'pid',
  169. placeholder: `${sldComLanguage('请选择上级分类')}`,
  170. initialValue: '',
  171. help: `${sldComLanguage('默认为最顶级')}`,
  172. disabled: false,
  173. data: [],
  174. sele_key: 'categoryId',
  175. sele_name: 'categoryName',
  176. allowClear: true,
  177. onSelect: (value, node, extra) => this.sldHandleSelCat(value, node, extra),
  178. };
  179. componentDidMount() {
  180. this.get_list({ pid: 0 });//grade为1表示获取一级数据
  181. }
  182. componentWillUnmount() {
  183. }
  184. //获取数据列表
  185. get_list = (params, grade = '') => {
  186. const { dispatch } = this.props;
  187. let { data, expandedRowKeys } = this.state;
  188. dispatch({
  189. type: 'product/get_cate_list_by_id',
  190. payload: params,
  191. callback: (res) => {
  192. //grade为1直接赋值
  193. if (grade != '') {
  194. for (let i in data.list) {
  195. if (grade == 1) {
  196. if (data.list[i].categoryId == params.pid) {
  197. data.list[i].children = res.data;
  198. break;
  199. }
  200. } else {
  201. if (data.list[i].children != undefined) {
  202. for (let j in data.list[i].children) {
  203. if (data.list[i].children[j].categoryId == params.pid) {
  204. data.list[i].children[j].children = res.data;
  205. break;
  206. }
  207. }
  208. }
  209. }
  210. }
  211. } else {
  212. data.list = res.data;
  213. }
  214. this.setState({
  215. data: data,
  216. expandedRowKeys: grade == '' ? [] : expandedRowKeys,
  217. });
  218. },
  219. });
  220. };
  221. //显示modal弹框_弹框专属
  222. showAllUnit = (val) => {
  223. let { tableTitle, search_modal_width } = this.state;
  224. if (val == 'search_goods_type') {
  225. tableTitle = `${sldComLanguage('请选择商品类型')}`;
  226. search_modal_width = 800;
  227. }
  228. this.setState({
  229. modalTableVisible: true,
  230. cur_operate_type: val,
  231. cur_type: 'show_list',
  232. tableTitle: tableTitle,
  233. search_modal_width: search_modal_width,
  234. });
  235. };
  236. //选择分类事件
  237. sldHandleSelCat = (value, node, extra) => {
  238. let { addData } = this.state;
  239. let tmp_info = node.props.extra;
  240. this.setState({
  241. sele_cat_info: tmp_info,
  242. addData,
  243. });
  244. };
  245. handleSelectRows = (rows, rowkeys) => {
  246. this.setState({
  247. selectedRows: rows,
  248. selectedRowKeys: rowkeys,
  249. });
  250. };
  251. handleTablePagination = (pagination, filtersArg, sorter, type = 'main') => {
  252. if (type == 'main') {
  253. const { formValues } = this.state;
  254. const params = sldHandlePaginationData(pagination, filtersArg, sorter, formValues);
  255. this.setState({
  256. params: params,
  257. });
  258. this.get_list(params);
  259. }
  260. };
  261. //新增功能
  262. addCat = () => {
  263. let { addData } = this.state;
  264. addData = addData.filter(item => item.name != 'category3Image' && item.name != 'pid');
  265. for (let i = 0; i < addData.length; i++) {
  266. if (addData[i].name == 'categoryName') {
  267. addData.splice(i + 1, 0, this.cat_data);
  268. }
  269. addData[i].initialValue = '';
  270. }
  271. this.setState({
  272. modalVisible: true,
  273. type: 'add',
  274. title: `${sldComLanguage('添加商品分类')}`,
  275. addData,
  276. sele_cat_info: {},
  277. });//添加商品分类
  278. };
  279. //添加下级功能
  280. addNextCat = (val) => {
  281. let { addData } = this.state;
  282. addData = addData.filter(item => item.name != 'pid' && item.name != 'category3Image');
  283. for (let i = 0; i < addData.length; i++) {
  284. if (addData[i].name == 'categoryName') {
  285. addData.splice(i + 1, 0, this.cat_data);
  286. addData[i].initialValue = '';
  287. } else {
  288. if (addData[i].name == 'pid') {
  289. addData[i].initialValue = val.categoryName;
  290. addData[i].disabled = true;
  291. } else {
  292. addData[i].initialValue = '';
  293. }
  294. }
  295. }
  296. this.setState({
  297. modalVisible: true,
  298. type: 'add',
  299. title: `${sldComLanguage('添加下级分类')}`,
  300. addData,
  301. sele_cat_info: val,
  302. });//添加下级分类
  303. };
  304. //编辑商品分类
  305. editCat = (val) => {
  306. let { addData } = this.state;
  307. addData = addData.filter(item => item.name != 'pid' && item.name != 'category3Image');
  308. for (let i = 0; i < addData.length; i++) {
  309. addData[i].initialValue = val[addData[i].name];
  310. }
  311. this.setState({
  312. type: 'edit',
  313. title: `${sldComLanguage('编辑商品分类')}`,
  314. addData: addData,
  315. modalVisible: true,
  316. curData: val,
  317. sele_cat_info: { grade: val.grade },
  318. });
  319. };
  320. //分类操作事件 type add:添加 edit:编辑 del:删除 adv:设置一级分类的广告
  321. operateCat = (id, type) => {
  322. let params = {};
  323. const { dispatch } = this.props;
  324. let dis_type = '';
  325. if (type == 'add') {
  326. dis_type = 'product/add_goods_cat';
  327. params = id;
  328. } else if (type == 'edit') {
  329. dis_type = 'product/edit_goods_cat';
  330. params = id;
  331. } else if (type == 'del') {
  332. dis_type = 'product/del_goods_cat';
  333. params.categoryId = id;
  334. } else if (type == 'adv') {
  335. dis_type = 'product/edit_goods_cat_adv';
  336. params = id;
  337. }
  338. this.setState({ submiting: true });
  339. dispatch({
  340. type: dis_type,
  341. payload: params,
  342. callback: (res) => {
  343. if (res.state == 200) {
  344. sucTip(res.msg);
  345. this.get_list({ id: 0 });
  346. this.setState({
  347. modalVisible: false,
  348. });
  349. } else {
  350. failTip(res.msg);
  351. }
  352. this.setState({ submiting: false });
  353. },
  354. });
  355. };
  356. sldHandleConfirm = (val) => {
  357. const { curData, type, sele_cat_info, addData } = this.state;
  358. let sld_params = {};
  359. sld_params.categoryName = val.categoryName;
  360. sld_params.sort = val.sort;
  361. //三级分类图片
  362. for (let i in addData) {
  363. if (addData[i].name == 'category3Image') {
  364. if (addData[i].img_succ_info.path != undefined) {
  365. sld_params.categoryImage = addData[i].img_succ_info.path;
  366. } else {
  367. failTip(`${sldComLanguage('请上传图片')}`);
  368. return false;
  369. }
  370. }
  371. }
  372. if (type == 'edit') {
  373. sld_params.categoryId = curData.categoryId;
  374. this.operateCat(sld_params, 'edit');
  375. } else {
  376. sld_params.grade = isEmptyObject(sele_cat_info) ? 1 : sele_cat_info.grade * 1 + 1;
  377. sld_params.state = 1;
  378. sld_params.pid = isEmptyObject(sele_cat_info) ? 0 : sele_cat_info.categoryId;//父分类id,一级分类==0
  379. this.operateCat(sld_params, 'add');
  380. }
  381. };
  382. sldHandleCancle = () => {
  383. this.setState({ modalVisible: false, modalVisibleAdv: false });
  384. };
  385. //表格拖动
  386. resizeTable = (index, size, type, data) => {
  387. let datas = dragSldTableColumn(index, size, data);
  388. this.setState({ [type]: datas });
  389. };
  390. onExpand = (expanded, record) => {
  391. let { expandedRowKeys } = this.state;
  392. if (expanded) {
  393. expandedRowKeys.push(record.categoryId);
  394. this.get_list({ pid: record.categoryId }, record.grade);
  395. } else {
  396. expandedRowKeys = expandedRowKeys.filter(item => item != record.categoryId);
  397. }
  398. this.setState({ expandedRowKeys });
  399. };
  400. sldHandleConfirmAdv = (val) => {
  401. const { curData } = this.state;
  402. this.operateCat({ cateId: curData.categoryId, categoryData: JSON.stringify(val) }, 'adv');
  403. };
  404. render() {
  405. const { selectedRows, modalVisible, title, addData, columns, submiting, data, loading, expandedRowKeys, preview_img, show_preview_modal, modal_width, preview_alt_con } = this.state;
  406. return (
  407. <div className={global.common_page}>
  408. {sldLlineRtextAddGoodsAddMargin('#69A2F2', `${sldComLanguage('分类管理')}`, 0, 0, 10)}
  409. <Spin spinning={loading}>
  410. { /*公共功能条-start*/}
  411. <div className={global.operate_bg}>
  412. {sldIconBtn(() => this.addCat(), `${sldComLanguage('新增分类')}`, 7, 0)}
  413. </div>
  414. { /*公共功能条-end*/}
  415. { /*标准表格-start*/}
  416. <StandardTable
  417. expandedRowKeys={expandedRowKeys}
  418. selectedRows={selectedRows}
  419. data={data}
  420. rowKey={'categoryId'}
  421. isCheck={false}
  422. columns={columns}
  423. onSelectRow={this.handleSelectRows}
  424. onChange={(pagination, filtersArg, sorter) => this.handleTablePagination(pagination, filtersArg, sorter, 'main')}
  425. sldpagination={false}
  426. resizeTable={(index, size) => this.resizeTable(index, size, 'columns', columns)}
  427. isColumnResize={true}
  428. onExpand={this.onExpand}
  429. />
  430. { /*标准表格-end*/}
  431. { /*新增/编辑对话框-start*/}
  432. <SldModal
  433. zIndex={1}
  434. width={500}
  435. title={title}
  436. submiting={submiting}
  437. modalVisible={modalVisible}
  438. sldHandleConfirm={(val) => this.sldHandleConfirm(val)}
  439. sldHandleCancle={this.sldHandleCancle}
  440. formItemLayoutModal={formItemLayoutModal}
  441. content={addData}
  442. />
  443. { /*新增/编辑对话框-end*/}
  444. {/*图片预览-start*/}
  445. <SldPreviewImg img={preview_img} show_preview_modal={show_preview_modal} modal_width={modal_width}
  446. preview_alt_con={preview_alt_con} closePreviewModal={() => this.viewImg(false)}/>
  447. {/*图片预览-end*/}
  448. </Spin>
  449. </div>
  450. );
  451. }
  452. }