goods_common_detail.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. import { connect } from 'dva/index';
  2. import React, { Component, Fragment } from 'react';
  3. import { Form } from 'antd';
  4. import {
  5. sldCommonTitle,
  6. list_com_page_size_10,
  7. sldLlineRtextAddGoods,
  8. getSldHorLine,
  9. sldIconBtnBg,
  10. sldComLanguage,
  11. pageClose,
  12. quillEscapeToHtml,
  13. } from '@/utils/utils';
  14. import global from '@/global.less';
  15. import SldTableRowTwo from '@/components/SldTableRowTwo';
  16. import { Scrollbars } from 'react-custom-scrollbars';
  17. import styles from './product.less';
  18. import StandardTable from '@/components/StandardTable';
  19. import SldPreviewImg from '@/components/SldPreviewImg/SldPreviewImg';
  20. import defaultSettings from '@/defaultSettings';
  21. let pageSize = list_com_page_size_10;
  22. @connect(({ product }) => ({
  23. product,
  24. }))
  25. @Form.create()
  26. export default class GoodsDetail extends Component {
  27. constructor(props) {
  28. super(props);
  29. this.state = {
  30. query: props.location.query,
  31. params: { pageSize: pageSize },//搜索条件
  32. preview_img: '',
  33. show_preview_modal: false,
  34. goods_base_data: [{
  35. type: 'show_text',
  36. label: `${sldComLanguage('商品类型')}:`,
  37. name: 'isVirtualGoods',
  38. extra: ``,
  39. item_height: 42,
  40. text: ``,
  41. },{
  42. type: 'show_text',
  43. label: `${sldComLanguage('商品分类')}:`,
  44. name: 'categoryPath',
  45. extra: ``,
  46. item_height: 42,
  47. text: ``,
  48. }, {
  49. type: 'show_text',
  50. label: `${sldComLanguage('商品名称')}:`,
  51. name: 'goodsName',
  52. extra: ``,
  53. item_height: 42,
  54. text: ``,
  55. }, {
  56. type: 'show_text',
  57. label: `${sldComLanguage('商品广告语')}:`,
  58. name: 'goodsBrief',
  59. extra: ``,
  60. item_height: 42,
  61. text: ``,
  62. }, {
  63. type: 'show_text',
  64. label: `${sldComLanguage('品牌')}:`,
  65. name: 'brandName',
  66. extra: ``,
  67. item_height: 42,
  68. text: ``,
  69. }],//商品基本信息
  70. invoice_data: [{
  71. type: 'show_text',
  72. label: `${sldComLanguage('是否开专票')}:`,
  73. name: 'isVatInvoice',
  74. extra: ``,
  75. item_height: 42,
  76. text: ``,
  77. }],//发票状态
  78. other_data: [{
  79. type: 'show_text',
  80. label: `${sldComLanguage('店铺分类')}:`,
  81. name: 'storeInnerLabelList',
  82. extra: ``,
  83. item_height: 42,
  84. text: ``,
  85. }, {
  86. type: 'show_text',
  87. label: `${sldComLanguage('商品标签')}:`,
  88. name: 'goodsLabelList',
  89. extra: ``,
  90. item_height: 42,
  91. text: ``,
  92. }, {
  93. type: 'show_text',
  94. label: `${sldComLanguage('虚拟销量')}:`,
  95. name: 'virtualSales',
  96. extra: ``,
  97. item_height: 42,
  98. text: ``,
  99. }, {
  100. type: 'show_text',
  101. label: `${sldComLanguage('发布状态')}:`,
  102. name: 'sellNow',
  103. extra: ``,
  104. item_height: 42,
  105. text: ``,
  106. }, {
  107. type: 'show_text',
  108. label: `${sldComLanguage('商品状态')}:`,
  109. name: 'stateValue',
  110. extra: ``,
  111. item_height: 42,
  112. text: ``,
  113. }, {
  114. type: 'show_text',
  115. label: `${sldComLanguage('商品推荐')}:`,
  116. name: 'storeIsRecommend',
  117. extra: ``,
  118. item_height: 42,
  119. text: ``,
  120. }],//其他信息
  121. goods_img_data: [],//商品图片信息
  122. goods_video_data: [
  123. {
  124. type: 'show_video',
  125. label: sldComLanguage('商品视频'),
  126. name: 'goodsVideoUrl',
  127. initialValue: '',
  128. data: [],
  129. item_height: 142,
  130. preView: this.viewImg,
  131. },
  132. ],//商品视频
  133. goods_detail_data: {},//商品详情数据
  134. columns_spec: [
  135. {
  136. title: sldComLanguage('序号'),
  137. align: 'center',
  138. width: 50,
  139. render: (text, record, index) => {
  140. return index + 1;
  141. },
  142. },
  143. {
  144. title: sldComLanguage('规格名称'),
  145. dataIndex: 'specValues',
  146. align: 'center',
  147. width: 150,
  148. render: (text, record, index) => {
  149. return text?text:sldComLanguage('默认');
  150. },
  151. },
  152. // {
  153. // title: sldComLanguage('市场价(¥)'),
  154. // dataIndex: 'marketPrice',
  155. // align: 'center',
  156. // width: 100,
  157. // render: (text, record, index) => {
  158. // return text ? text : '--';
  159. // },
  160. // },
  161. // {
  162. // title: sldComLanguage('价格(¥)'),
  163. // dataIndex: 'productPrice',
  164. // align: 'center',
  165. // width: 100,
  166. // },
  167. {
  168. title: sldComLanguage('库存'),
  169. dataIndex: 'productStock',
  170. align: 'center',
  171. width: 100,
  172. },
  173. {
  174. title: sldComLanguage('重量(KG)'),
  175. dataIndex: 'weight',
  176. align: 'center',
  177. width: 100,
  178. render: (text, record, index) => {
  179. return text ? text : '--';
  180. },
  181. },
  182. {
  183. title: sldComLanguage('长(CM)'),
  184. dataIndex: 'length',
  185. align: 'center',
  186. width: 100,
  187. render: (text, record, index) => {
  188. return text ? text : '--';
  189. },
  190. },
  191. {
  192. title: sldComLanguage('宽(CM)'),
  193. dataIndex: 'width',
  194. align: 'center',
  195. width: 100,
  196. render: (text, record, index) => {
  197. return text ? text : '--';
  198. },
  199. },
  200. {
  201. title: sldComLanguage('高(CM)'),
  202. dataIndex: 'height',
  203. align: 'center',
  204. width: 100,
  205. render: (text, record, index) => {
  206. return text ? text : '--';
  207. },
  208. },
  209. {
  210. title: sldComLanguage('预警值'),
  211. dataIndex: 'productStockWarning',
  212. align: 'center',
  213. width: 100,
  214. render: (text, record, index) => {
  215. return text ? (text>0?text:0) : '--';
  216. },
  217. }, {
  218. title: sldComLanguage('货号'),
  219. dataIndex: 'productCode',
  220. align: 'center',
  221. width: 100,
  222. render: (text, record, index) => {
  223. return text ? text : '--';
  224. },
  225. },
  226. {
  227. title: sldComLanguage('条形码'),
  228. dataIndex: 'barCode',
  229. align: 'center',
  230. width: 100,
  231. render: (text, record, index) => {
  232. return text ? text : '--';
  233. },
  234. }, {
  235. title: sldComLanguage('默认选中'),
  236. dataIndex: 'isDefault',
  237. align: 'center',
  238. width: 100,
  239. render: (text, record, index) => {
  240. return text == 1 ? sldComLanguage('是') : sldComLanguage('否');
  241. },
  242. }],//商品规格表头
  243. };
  244. }
  245. img_item = {
  246. type: 'show_goods_img_more',
  247. label: sldComLanguage('商品图片'),
  248. name: 'show_goods_img_more',
  249. initialValue: '',
  250. data: [],
  251. item_height: 142,
  252. };
  253. componentDidMount() {
  254. const { query } = this.state;
  255. this.get_goods_detail(query.id);
  256. window.addEventListener('resize', this.resize);
  257. }
  258. //预览图片/关闭预览图片
  259. viewImg = (flag, img = '') => {
  260. this.setState({
  261. preview_img: img,
  262. show_preview_modal: flag,
  263. });
  264. };
  265. //获取商品详情
  266. get_goods_detail = (id) => {
  267. const { dispatch } = this.props;
  268. let { goods_base_data, goods_img_data, goods_detail_data, other_data, invoice_data, goods_video_data } = this.state;
  269. let params = { goodsId: id };
  270. let dis_type = 'product/get_goods_detail';
  271. dispatch({
  272. type: dis_type,
  273. payload: params,
  274. callback: async (res) => {
  275. if (res.state == 200) {
  276. goods_detail_data = res.data;
  277. //商品分类
  278. goods_detail_data.goods_cat = goods_detail_data.categoryPath;
  279. //商品基本信息
  280. for (let i in goods_base_data) {
  281. if(goods_base_data[i].name == 'isVirtualGoods'){
  282. goods_base_data[i].text = goods_detail_data[goods_base_data[i].name] == 1?sldComLanguage('实物商品'):sldComLanguage('虚拟商品');
  283. }else{
  284. goods_base_data[i].text = goods_detail_data[goods_base_data[i].name] ? goods_detail_data[goods_base_data[i].name] : '--';
  285. }
  286. }
  287. //商品图片
  288. if (goods_detail_data.imageList.length > 0) {
  289. let temp = { ...this.img_item, data: goods_detail_data.imageList };
  290. goods_img_data.push(temp);
  291. } else {
  292. goods_img_data = [];
  293. let imgs = goods_detail_data.specInfoList;
  294. imgs.map(item => {
  295. if (item.isMainSpec) {
  296. item.specValueList.map(child => {
  297. let temp = { ...this.img_item, data: child.imageList, label: child.specValue };
  298. goods_img_data.push(temp);
  299. });
  300. }
  301. });
  302. }
  303. //商品视频
  304. goods_video_data[0].initialValue = goods_detail_data.goodsVideoUrl;
  305. /*发票信息start*/
  306. invoice_data.map(item => {
  307. item.text = goods_detail_data[item.name] == 1 ? sldComLanguage('是') : sldComLanguage('否');
  308. });
  309. /*发票信息end*/
  310. /*其他信息start*/
  311. for (let other_index in other_data) {
  312. if (other_data[other_index].name == 'storeInnerLabelList') {
  313. if (goods_detail_data[other_data[other_index].name] != null && goods_detail_data[other_data[other_index].name]) {
  314. goods_detail_data[other_data[other_index].name].map(item => {
  315. other_data[other_index].text += '【' + item.innerLabelPath + '】';
  316. });
  317. } else {
  318. other_data[other_index].text = '--';
  319. }
  320. } else if (other_data[other_index].name == 'goodsLabelList') {
  321. if (goods_detail_data[other_data[other_index].name] != null && goods_detail_data[other_data[other_index].name]) {
  322. goods_detail_data[other_data[other_index].name].map(item => {
  323. other_data[other_index].text += '【' + item.labelName + '】';
  324. });
  325. } else {
  326. other_data[other_index].text = '--';
  327. }
  328. } else if (other_data[other_index].name == 'sellNow') {
  329. other_data[other_index].text = goods_detail_data.sellNow ? sldComLanguage('立即售卖') : sldComLanguage('放入仓库');
  330. } else if (other_data[other_index].name == 'storeIsRecommend') {
  331. other_data[other_index].text = goods_detail_data.storeIsRecommend == 1 ? sldComLanguage('是') : sldComLanguage('否');
  332. } else {
  333. other_data[other_index].text = goods_detail_data[other_data[other_index].name] ? goods_detail_data[other_data[other_index].name] : '--';
  334. }
  335. }
  336. if(goods_detail_data.isVirtualGoods == 2){
  337. other_data.push({
  338. type: 'show_text',
  339. label: `${sldComLanguage('售后服务')}:`,
  340. name: 'afterSaleService',
  341. extra: ``,
  342. item_height: 42,
  343. text: goods_detail_data.afterSaleService == 1?sldComLanguage('支持退款'):sldComLanguage('不支持退款'),
  344. });
  345. }
  346. /*其他信息end*/
  347. this.setState({
  348. loading: false,
  349. goods_base_data,//商品的基本信息
  350. goods_img_data,//spu图片信息
  351. goods_detail_data,
  352. other_data,//其他信息
  353. invoice_data,//发票信息
  354. goods_video_data,//商品视频信息
  355. }, () => {
  356. //根据选择的结果计算规格数据
  357. });
  358. }
  359. },
  360. });
  361. };
  362. render() {
  363. const { goods_base_data, goods_img_data, goods_detail_data, columns_spec, preview_img, show_preview_modal, other_data, express_data, invoice_data, goods_video_data } = this.state;
  364. return (
  365. <div className={global.common_page} style={{ flex: 1 }}>
  366. <div className={global.flex_com_space_between} style={{ margin: 10, marginTop: 0 }}>
  367. {sldLlineRtextAddGoods(defaultSettings.primaryColor, sldComLanguage('商品详情'))}
  368. {sldIconBtnBg(() => pageClose(), 'fanhui', sldComLanguage('返回上级页面'), '#fff', 7, 0, 15, 15, 5)}
  369. </div>
  370. {getSldHorLine(1)}
  371. <Scrollbars
  372. autoHeight
  373. autoHeightMin={100}
  374. autoHeightMax={document.body.clientHeight - 60}>
  375. {sldCommonTitle(sldComLanguage('基本信息'), '#333', 5, 12, 15)}
  376. <SldTableRowTwo r_color={'#333'} l_color={'#999'} l_fontw={500} r_fontw={600} form={this.props.form}
  377. data={goods_base_data}/>
  378. {goods_detail_data.productList != undefined && goods_detail_data.productList.length > 0 &&
  379. <Fragment>
  380. {sldCommonTitle(sldComLanguage('商品规格'), '#333', 5, 15, 15)}
  381. <StandardTable
  382. selectedRows={[]}
  383. data={{ list: goods_detail_data.productList, pagination: {} }}
  384. size={'small'}
  385. rowKey={'productId'}
  386. isCheck={false}
  387. columns={columns_spec}
  388. sldpagination={false}
  389. />
  390. </Fragment>}
  391. {sldCommonTitle(sldComLanguage('商品图片'), '#333', 5, 15, 15)}
  392. <SldTableRowTwo part_width={100} lwidth={10} rwidth={90} form={this.props.form}
  393. data={goods_img_data}/>
  394. {goods_detail_data.goodsVideoUrl &&
  395. <Fragment>
  396. {sldCommonTitle(sldComLanguage('商品视频'), '#333', 5, 15, 15)}
  397. <SldTableRowTwo part_width={100} lwidth={10} rwidth={90} form={this.props.form}
  398. data={goods_video_data}/>
  399. </Fragment>
  400. }
  401. {sldCommonTitle(sldComLanguage('发票信息'), '#333', 5, 15, 15)}
  402. <SldTableRowTwo r_color={'#333'} l_color={'#999'} l_fontw={500} r_fontw={600} form={this.props.form}
  403. data={invoice_data}/>
  404. {sldCommonTitle(sldComLanguage('其他信息'), '#333', 5, 15, 15)}
  405. <SldTableRowTwo r_color={'#333'} l_color={'#999'} l_fontw={500} r_fontw={600} form={this.props.form}
  406. data={other_data}/>
  407. {(goods_detail_data.topTemplateContent||goods_detail_data.goodsDetails||goods_detail_data.bottomTemplateContent)
  408. ?<Fragment>
  409. {sldCommonTitle(sldComLanguage('商品详情'), '#333', 5, 15, 15)}
  410. <div className={styles.goods_detail_body}>
  411. {goods_detail_data.topTemplateContent
  412. ?<div dangerouslySetInnerHTML={{
  413. __html: quillEscapeToHtml(goods_detail_data.topTemplateContent),
  414. }}/>
  415. :''
  416. }
  417. {goods_detail_data.goodsDetails
  418. ?<div dangerouslySetInnerHTML={{
  419. __html: quillEscapeToHtml(goods_detail_data.goodsDetails),
  420. }}/>
  421. :''
  422. }
  423. {goods_detail_data.bottomTemplateContent
  424. ?<div dangerouslySetInnerHTML={{
  425. __html: quillEscapeToHtml(goods_detail_data.bottomTemplateContent),
  426. }}/>
  427. :''
  428. }
  429. </div>
  430. </Fragment>
  431. :''
  432. }
  433. </Scrollbars>
  434. {/*图片预览-start*/}
  435. <SldPreviewImg img={preview_img} show_preview_modal={show_preview_modal} modal_width={500}
  436. preview_alt_con={sldComLanguage('商品图片')} closePreviewModal={() => this.viewImg(false)}/>
  437. {/*图片预览-end*/}
  438. </div>
  439. );
  440. }
  441. }