浏览代码

feat: 调整店铺管理端概况以及商品列表

周玉环 3 天之前
父节点
当前提交
244713b0ab

+ 1 - 0
xinkeaboard-admin/config/config.js

@@ -76,6 +76,7 @@ export default {
   proxy: {
     "/api/": {
       target: "http://54.46.9.88:8001/",
+      // target: 'http://192.168.0.158:8001/',
       changeOrigin: true,
       pathRewrite: { "^/api": "" },
     },

+ 11 - 0
xinkeaboard-seller/config/config.js

@@ -74,9 +74,20 @@ export default {
   proxy: {
     "/api/": {
       target: "http://54.46.9.88:8001/",
+      // target: 'http://192.168.0.158:8001/',
       changeOrigin: true,
       pathRewrite: { "^/api": "" },
     },
+    '/api/v3/system/seller/setting/getSiteSettingList': {
+      target: 'http://192.168.0.158:8001/',
+      changeOrigin: true,
+      pathRewrite: { "^/api": "" },
+    },
+    '/api/v3/statistics/seller/overview/analysis/source/presentData': {
+      target: 'http://192.168.0.158:8001/',
+      changeOrigin: true,
+      pathRewrite: { "^/api": "" },
+    }
   },
   ignoreMomentLocale: true,
   lessLoaderOptions: {

+ 4 - 1
xinkeaboard-seller/src/components/SldTableRowThree/index.js

@@ -382,7 +382,7 @@ export default class SldTableRowTwo extends PureComponent {
             rules: val.rules,
             initialValue: val.initialValue,
           })(
-            <RadioGroup size={'small'} defaultValue={val.initialValue} className={styles.item}
+            <RadioGroup disabled={val.disabled} size={'small'} defaultValue={val.initialValue} className={styles.item}
                         onChange={(e) => this.redioOnChange(e, val)}>
               {val.sel_data.map((item, index) => {
                 return <Radio key={index} value={item.key}>{item.name}</Radio>;
@@ -418,6 +418,7 @@ export default class SldTableRowTwo extends PureComponent {
           action={val.upload_url}
           listType="picture-card"
           fileList={val.fileList}
+          disabled={val.disabled}
           onPreview={(info) => val.uploadPreview(info)}
           onChange={(info) => val.uploadChange(info)}
           headers={{
@@ -503,6 +504,7 @@ export default class SldTableRowTwo extends PureComponent {
                         value: 'value',
                         children: 'children',
                       }}
+                      disabled={val.disabled}
                       onChange={(value, selectedOptions) => val.onChange(selectedOptions)}
                       placeholder={val.placeholder}
                       style={{ width: '100%' }}/>,
@@ -555,6 +557,7 @@ export default class SldTableRowTwo extends PureComponent {
               treeData={val.tree_data}
               onCheck={val.onCheck}
               checkedKeys={val.selected_keys}
+              disabled={val.disabled}
             />
           </Scrollbars>
         </div>

+ 28 - 0
xinkeaboard-seller/src/global.less

@@ -2337,3 +2337,31 @@ body {
   }
 }
 
+.site_list {
+  padding: 10px;
+  display: flex;
+  align-items: center;
+  width: 100%;
+  height: 50px;
+  overflow-x: auto;
+
+  .site_item {
+    width: 120px;
+    height: 35px;
+    text-align: center;
+    line-height: 35px;
+    border: 1px solid #d9d9d9;
+    border-radius: 5px;
+    margin-right: 10px;
+    color: #AAAAAA;
+    font-weight: bold;
+    cursor: pointer;
+  }
+
+  .site_active {
+    border-color: @theme-color;
+    background-color: @theme-color;
+    color: #fff;
+  }
+}
+

+ 1 - 0
xinkeaboard-seller/src/locales/en-US/content.js

@@ -1227,6 +1227,7 @@ export default {
   '下架': 'Off the shelf',
   '确认将选中的商品设置为推荐商品吗?': 'Confirm the selected goods to the recommended product do?',
   '商品设置': 'Product settings',
+  '发布渠道': 'Release channel',
 
   // src/pages/goods/goods_storage_lists.js
   '确认上架选中的商品吗?': 'Confirm the selected merchandise shelves do?',

+ 1 - 0
xinkeaboard-seller/src/locales/zh-CN/content.js

@@ -1311,6 +1311,7 @@ export default {
   '下架': '下架',
   '确认将选中的商品设置为推荐商品吗?': '确认将选中的商品设置为推荐商品吗?',
   '商品设置': '商品设置',
+  '发布渠道': 'Release channel',
 
   // src/pages/goods/goods_storage_lists.js
   '确认上架选中的商品吗?': '确认上架选中的商品吗?',

+ 6 - 0
xinkeaboard-seller/src/models/common.js

@@ -227,6 +227,12 @@ export default {
       const response = yield call(sldCommonService, payload, 'get', `v3/system/front/agreement/detail`);
       if (callback) callback(response);
     },
+
+    // 获取站点列表
+    * get_site_list_data({ payload, callback }, { call }) {
+      const response = yield call(sldCommonService, payload, 'get', 'v3/system/seller/setting/getSiteSettingList');
+      if (callback) callback(response);
+    },
   },
 
   reducers: {

+ 21 - 4
xinkeaboard-seller/src/pages/User/Login.js

@@ -69,7 +69,8 @@ export default class LoginPage extends Component {
     //确认密码
     is_show_comfirepwd_err:false,
     comfirepwd_error_info:'',
-
+    // 提交注册按钮加载loading
+    loading: false
   };
 
   register_captcha = '';//注册——图形验证码key
@@ -484,6 +485,7 @@ export default class LoginPage extends Component {
           });
           return false;
         }
+        this.setState({loading: true});
         values.verifyKey = this.register_captcha;
         const { dispatch } = this.props;
         dispatch({
@@ -496,7 +498,7 @@ export default class LoginPage extends Component {
               }
               localStorage.setItem('sld_token', res.data.access_token);
               localStorage.setItem('sld_refresh_token', res.data.refresh_token);
-              localStorage.setItem('user_info', JSON.stringify({ user_name: values.vendorName }));
+              localStorage.setItem('user_info', JSON.stringify({ user_name: values.vendorNam, vendorMobile: values.vendorMobile }));
               saveSettleData('state', '');
               saveSettleData('cur_step', 0);
               this.setState({
@@ -536,6 +538,7 @@ export default class LoginPage extends Component {
                 });
               }
             }
+            this.setState({loading: false});
           },
         });
       }else{
@@ -707,7 +710,21 @@ export default class LoginPage extends Component {
 
   render() {
     const { getFieldDecorator } = this.props.form;
-    const { login_img, error_info, modal_type, is_show_err, register_captcha, login_captcha, title, visibleModal, visibleModalSuccess, register_error_info, is_show_registe_err, countDownM } = this.state;
+    const { 
+      login_img, 
+      error_info, 
+      modal_type, 
+      is_show_err, 
+      register_captcha, 
+      login_captcha, 
+      title, 
+      visibleModal, 
+      visibleModalSuccess, 
+      register_error_info, 
+      is_show_registe_err, 
+      countDownM,
+      loading
+    } = this.state;
     return (
       <div className={styles.full_screen}
            style={{
@@ -1049,7 +1066,7 @@ export default class LoginPage extends Component {
               <FormItem
                 style={{ textAlign: 'center' }}
               >
-                <Button htmlType="submit" size={'small'} style={{ height: 40 }}
+                <Button  loading={loading} htmlType="submit" size={'small'} style={{ height: 40 }}
                         className={styles.registerBtn}>{modal_type == 'register' ? `${sldComLanguage('提交注册')}` : `${sldComLanguage('找回密码')}`}</Button>
               </FormItem>
 

+ 104 - 43
xinkeaboard-seller/src/pages/basic/basic.less

@@ -1,4 +1,4 @@
-@import '../../../src/themeColor.less';
+@import "../../../src/themeColor.less";
 
 .contain {
   background: #fff;
@@ -70,7 +70,6 @@
       white-space: nowrap;
       margin-right: 10px;
     }
-
   }
 
   .score {
@@ -89,7 +88,7 @@
       }
 
       span.data {
-        color: #E90C0C;
+        color: #e90c0c;
       }
     }
   }
@@ -97,7 +96,7 @@
 
 .stat_amount {
   width: 100%;
-  .bottom{
+  .bottom {
     display: flex;
     justify-content: start;
     align-items: baseline;
@@ -172,7 +171,7 @@
       color: #000;
       font-size: 13px;
       height: 42px;
-      background: rgba(255, 113, 30, .05);
+      background: rgba(255, 113, 30, 0.05);
       line-height: 42px;
       padding-left: 15px;
     }
@@ -207,14 +206,13 @@
           }
         }
       }
-
     }
 
     .r_title {
       color: #000;
       font-size: 13px;
       height: 42px;
-      background: rgba(255, 113, 30, .05);
+      background: rgba(255, 113, 30, 0.05);
       line-height: 42px;
 
       span {
@@ -276,7 +274,6 @@
               }
             }
           }
-
         }
 
         a.goods_name {
@@ -330,7 +327,7 @@
       color: #000;
       font-size: 13px;
       height: 42px;
-      background: rgba(255, 113, 30, .05);
+      background: rgba(255, 113, 30, 0.05);
       line-height: 42px;
       padding-left: 15px;
     }
@@ -339,7 +336,6 @@
       padding: 20px;
     }
   }
-
 }
 
 .contact {
@@ -362,47 +358,47 @@
     margin-right: 15px;
   }
 }
-.platform_activity{
+.platform_activity {
   width: calc(50% - 5px);
   margin-top: 10px;
   background-color: #ffffff;
-  .main_table{
+  .main_table {
     margin-top: 15px;
-    :global{
-      .ant-table-thead > tr{
+    :global {
+      .ant-table-thead > tr {
         border-bottom: none !important;
       }
-      td{
+      td {
         border-right: none;
       }
-      .ant-table-content{
+      .ant-table-content {
         border-right: none !important;
       }
-      .ant-table-small{
+      .ant-table-small {
         border: none;
       }
     }
   }
-  .up_table_panel{
+  .up_table_panel {
     width: 100%;
-    border-bottom: 1px solid #EEEEEE;
-    .right_more{
+    border-bottom: 1px solid #eeeeee;
+    .right_more {
       color: @theme-color;
       font-size: 13px;
       padding-right: 10px;
       cursor: pointer;
     }
   }
-  .down_platform_panel{
+  .down_platform_panel {
     padding: 11px;
     -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
     box-sizing: border-box;
     height: 498px;
 
-    .activity_tab{
-      ul{
-        li{
+    .activity_tab {
+      ul {
+        li {
           color: @theme-color;
           font-size: 14px;
           display: inline-flex;
@@ -432,23 +428,23 @@
 }
 
 .basic_new {
-  background-color: #F0F2F5;
+  background-color: #f0f2f5;
   overflow: auto;
-  .main_area{
+  .main_area {
     display: block;
     height: 498px;
   }
-  .visualized_panel{
+  .visualized_panel {
     flex-wrap: wrap;
-    .visualized_item{
-      width: calc( 50% - 5px );
+    .visualized_item {
+      width: calc(50% - 5px);
       height: 559px;
       background-color: #fff;
       margin-top: 10px;
       border-radius: 4px;
-      .top_info_operate{
-        border-bottom: 1px solid #EEEEEE;
-        .time_option_operate{
+      .top_info_operate {
+        border-bottom: 1px solid #eeeeee;
+        .time_option_operate {
           margin-right: 11px;
         }
       }
@@ -459,6 +455,73 @@
     border-radius: 4px;
   }
 
+  .site_list {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    width: 100%;
+    padding: 25px;
+
+    .site_item {
+      margin: 0 10px;
+      font-size: 16px;
+      color: #aaaaaa;
+      font-weight: bold;
+      cursor: pointer;
+    }
+
+    .site_active {
+      font-weight: bold;
+      font-size: 24px;
+      color: #333333;
+    }
+  }
+
+  .down_goods_info {
+    padding: 25px;
+    ul {
+      li {
+        width: 50%;
+        -webkit-box-sizing: border-box;
+        -moz-box-sizing: border-box;
+        box-sizing: border-box;
+        position: relative;
+        cursor: pointer;
+
+        .num {
+          color: #000;
+          font-size: 25px;
+          font-weight: 700;
+          text-align: center;
+        }
+
+        .label {
+          margin-bottom: 3px;
+
+          i {
+            display: block;
+            width: 10px;
+            height: 10px;
+            background-color: @theme-light3Color;
+            border-radius: 10px;
+            margin-right: 12px;
+          }
+
+          span {
+            color: #000;
+            font-size: 15px;
+          }
+        }
+      }
+
+      li:last-child {
+        &:after {
+          display: none;
+        }
+      }
+    }
+  }
+
   .today_info_panel {
     margin-top: 10px;
 
@@ -480,12 +543,12 @@
         left: -5px;
         top: 8px;
         z-index: 2;
-        color: #3A3E43;
+        color: #3a3e43;
         font-size: 16px;
         padding-top: 11px;
         padding-left: 26px;
-        &:before{
-          content: '';
+        &:before {
+          content: "";
           display: block;
           width: 4px;
           height: 22px;
@@ -556,7 +619,7 @@
   }
 
   .label_panel {
-    border-bottom: 1px solid #D8D8D8;
+    border-bottom: 1px solid #d8d8d8;
   }
 
   .stat_amount_new {
@@ -585,7 +648,7 @@
         .item_title {
           font-size: 15px;
           color: #333333;
-          opacity: .72;
+          opacity: 0.72;
         }
 
         .item_num {
@@ -606,19 +669,17 @@
       margin-left: 24px;
     }
   }
-
-
 }
-.real_stat{
+.real_stat {
   overflow: scroll;
-  .real_num_panel{
+  .real_num_panel {
   }
 }
-.trade_stat{
+.trade_stat {
   -webkit-box-sizing: border-box;
   -moz-box-sizing: border-box;
   box-sizing: border-box;
 }
-.saling_stat{
+.saling_stat {
   background-color: #f0f2f5;
 }

+ 9 - 0
xinkeaboard-seller/src/pages/basic/models/home.js

@@ -16,20 +16,29 @@ export default {
       const response = yield call(sldCommonService, payload, 'get', 'v3/business/seller/dashboard/indexInfo');
       if (callback) callback(response);
     },
+
    //slodon_获取首页店铺信息
     * get_store_info({ payload, callback }, { call }) {
       const response = yield call(sldCommonService, payload, 'get', 'v3/seller/seller/store/indexStoreInfor');
       if (callback) callback(response);
     },
+
     //slodon_获取首页待办事项数据
     * get_store_wait_data({ payload, callback }, { call }) {
       const response = yield call(sldCommonService, payload, 'get', 'v3/statistics/seller/overview/analysis/presentData');
       if (callback) callback(response);
     },
+
     //slodon_获取首页概况实时统计数据
     * get_store_realtime_preview_data({ payload, callback }, { call }) {
       const response = yield call(sldCommonService, payload, 'get', 'v3/statistics/seller/overview/analysis/presentData');
       if (callback) callback(response);
     },
+
+    // 获取站点实时统计
+    * get_site_present_data({ payload, callback }, { call }) {
+      const response = yield call(sldCommonService, payload, 'get', 'v3/statistics/seller/overview/analysis/source/presentData');
+      if (callback) callback(response);
+    }
   },
 };

+ 119 - 4
xinkeaboard-seller/src/pages/basic/simple_stat.js

@@ -43,12 +43,12 @@ export default class Basic extends Component {
       activityLoading: false,//平台活动模块loading
       todayData: simpleStatTodayData(),
       globalUpdateTime: '',
-      payOrderTrendInitLoading: '',
+      payOrderTrendInitLoading: false,
       payOrderTrendData: [],//支付/下单金额趋势数据
-      flowTrendInitLoading: '',
+      flowTrendInitLoading: false,
       flowTrendData: [],//流量趋势数据
       enquiryTrendData: [],//询盘趋势数据
-      enquiryTrendInitLoading: '',
+      enquiryTrendInitLoading: false,
       payOrderTrendParams: statDateSearchParams(),
       flowTrendParams: statDateSearchParams(),
       enquiryTrendParams:statDateSearchParams(),
@@ -94,11 +94,17 @@ export default class Basic extends Component {
         },
       ],
       platformActivityData: { list: [], pagination: {} },
+      siteInfoLoading: true, // 站点违规商品和分配询盘loading
+      siteList: [],
+      currentSite: {},
+      siteListLoading: false, // 站点tab列表loading
+      siteInfoData: simpleStatWaitEventData(),
     };
 
   };
 
   componentDidMount() {
+    this.getSiteList()
     this.get_store_info();
     this.getPayOrderTrend();
     this.getFlowTrend();
@@ -107,6 +113,41 @@ export default class Basic extends Component {
     this.getEnquiryTrend();
   }
 
+  // 获取站点列表
+  getSiteList = () => {
+    this.setState({ siteListLoading: true });
+    const { dispatch } = this.props;
+    dispatch({
+      type: 'common/get_site_list_data',
+      payload: {},
+      callback: (res) => {
+        if (res.state == 200) {
+          this.setState({ siteList: res.data, currentSite: res.data[0], siteListLoading: false })
+          this.getSitePresentData({ source:  res.data[0]?.value});
+        }
+      },
+    });
+  }
+
+  // 获取站点实时统计数据
+  getSitePresentData = (params) => {
+    this.setState({ siteInfoLoading: true });
+    const { dispatch } = this.props;
+    let { siteInfoData } = this.state;
+    dispatch({
+      type: 'home/get_site_present_data',
+      payload: { source: params.source },
+      callback: (res) => {
+        if (res.state == 200) {
+          siteInfoData.forEach(item => {
+            item.num = res.data[item.mapKey];
+          });
+          this.setState({ siteInfoData, siteInfoLoading: false });
+        }
+      },
+    });
+  }
+
   //获取秒杀活动列表
   getActivity = () => {
     this.setState({ activityLoading: true });
@@ -286,6 +327,12 @@ export default class Basic extends Component {
     router.push(path);
   };
 
+  // 切换站点
+  setCurrentSite = (site) => {
+    this.setState({ currentSite: site })
+    this.getSitePresentData({ source: site.value })
+  }
+
   //平台活动查看更多事件
   viewMoreActivity = (type) => {
     if (type == 'seckill') {
@@ -322,7 +369,31 @@ export default class Basic extends Component {
   };
 
   render() {
-    const { columns, platformActivityData, flowTrendData,flowTrendInitLoading,enquiryTrendData, enquiryTrendInitLoading, waitEventData, store_info, todayOverViewLoading, todayData, globalUpdateTime, payOrderTrendInitLoading, payOrderTrendData, waitingLoading, baseInfoLoading, activityLoading, loadedFlag, todayLoadedFlag } = this.state;
+    const { 
+      columns, 
+      platformActivityData, 
+      flowTrendData,
+      flowTrendInitLoading,
+      enquiryTrendData, 
+      enquiryTrendInitLoading, 
+      waitEventData, 
+      store_info, 
+      todayOverViewLoading, 
+      todayData, 
+      globalUpdateTime, 
+      payOrderTrendInitLoading, 
+      payOrderTrendData, 
+      waitingLoading, 
+      baseInfoLoading, 
+      activityLoading, 
+      siteInfoLoading,
+      loadedFlag, 
+      todayLoadedFlag,
+      siteList,
+      siteListLoading,
+      currentSite,
+      siteInfoData
+    } = this.state;
     return (
       <div className={`${styles.gray_main} ${styles.new_stat} ${styles.basic_new} ${stat.stat_part}`}
            style={{ flex: 1 }}>
@@ -384,6 +455,50 @@ export default class Basic extends Component {
                 </div>
               </Spin>
             </div>
+            <div style={{ backgroundColor: '#ffffff', marginTop: '10px' }}>
+              <Spin spinning={siteListLoading}>
+                  <div className={ `${styles.site_list}` }>
+                    {siteList.map((site) => (
+                      <div
+                        key={site.name}
+                        onClick={() => this.setCurrentSite(site)}
+                        className={`${styles.site_item} ${site.name === currentSite.name ? styles.site_active : ''}`}
+                      >
+                        {site.title}
+                      </div>
+                    ))}
+                  </div>
+              </Spin>
+            </div>
+            <div style={{ backgroundColor: '#ffffff', marginTop: '10px' }}>
+              <Spin spinning={siteInfoLoading}>
+                  <div className={`${styles.down_goods_info}`}>
+                    <ul className={`${global.flex_row_between_center}`}>
+                      {siteInfoData.map((item, index) => (
+                        <li key={index} onClick={() => (this.menuItemGoPage(item.path))}
+                            className={`${global.flex_column_start_center}`}>
+                          <div className={`${styles.label} ${global.flex_row_start_center}`}>
+                            <span>{(currentSite.title ?? "") + item.label}</span>
+                          </div>
+                          <div className={`${styles.num}`} title={item.num || 0}>
+                            {loadedFlag && (
+                              item.num > 10000
+                                ? formatNum(item.num)
+                                : <TweenOne animation={{
+                                  Children: {
+                                    value: item.num, floatLength: 0,
+                                    formatMoney: true,
+                                  },
+                                  duration: 1000,
+                                }}/>
+                            )}
+                          </div>
+                        </li>
+                      ))}
+                    </ul>
+                </div>
+              </Spin>
+            </div>
             <Spin spinning={todayOverViewLoading}>
               <div className={`${styles.today_info_panel} ${global.flex_com_space_between}`}>
                 {todayData.map((item, index) => (

+ 74 - 5
xinkeaboard-seller/src/pages/goods/goods_offline_lists.js

@@ -35,6 +35,7 @@ let pageSize = list_com_page_size_10;
 export default class GoodsOfflineLists extends Component {
   constructor(props) {
     super(props);
+    this.searchRef = React.createRef(); // 创建 ref
     this.state = {
       search_height:0,
       modal_width:700,
@@ -200,6 +201,9 @@ export default class GoodsOfflineLists extends Component {
           ),
         },
       ],
+      siteList: [],
+      currentSite: {},
+      siteListLoading: false, // 站点tab列表loading
     };
   }
 
@@ -258,7 +262,7 @@ export default class GoodsOfflineLists extends Component {
   ];
 
   componentDidMount() {
-    this.get_list({ pageSize: pageSize });
+    this.getSiteList()
     this.getStoreCat();//获取店铺分类
     this.resize();
     window.addEventListener('resize', this.resize);
@@ -268,6 +272,22 @@ export default class GoodsOfflineLists extends Component {
     window.removeEventListener('resize', this.resize);
   }
 
+  // 获取站点列表
+  getSiteList = () => {
+    this.setState({ siteListLoading: true });
+    const { dispatch } = this.props;
+    dispatch({
+      type: 'common/get_site_list_data',
+      payload: {  },
+      callback: (res) => {
+        if (res.state == 200) {
+          this.setState({ siteList: res.data, currentSite: res.data[0], siteListLoading: false })
+          this.get_list({ pageSize: pageSize, distributionChannel: res.data[0]?.value });
+        }
+      },
+    });
+  }
+
   resize = () =>{
     const {search_height} = this.state;
     if(this.refs.search_part!=undefined){
@@ -389,6 +409,9 @@ export default class GoodsOfflineLists extends Component {
 
   //获取数据列表
   get_list = (params) => {
+    if (!params.distributionChannel) {
+      params.distributionChannel = this.state.currentSite.value;
+    }
     this.setState({ initLoading: true });
     const { dispatch } = this.props;
     dispatch({
@@ -433,14 +456,21 @@ export default class GoodsOfflineLists extends Component {
     this.setState({ [type]: datas });
   };
 
-  //搜索事件
-  search = (data) => {
+  // 处理筛选数据
+  parseSearchData = (data) => {
     const values = { ...data };
     for (let i in values) {
       if (values[i] == '') {
         delete values[i];
       }
     }
+
+    return values;
+  }
+
+  //搜索事件
+  search = (data) => {
+    const values = this.parseSearchData(data)
     this.setState({
       formValues: values,
       params: { pageSize: pageSize }
@@ -461,12 +491,37 @@ export default class GoodsOfflineLists extends Component {
     this.setState({ modalVisible: false });
   };
 
+  // 切换站点
+  setCurrentSite = (site) => {
+    const data = this.searchRef.current.getFieldsValue(); // 调用子组件方法
+    const values = this.parseSearchData(data)
+    this.setState({ currentSite: site })
+    this.get_list({ pageSize: pageSize, distributionChannel: site.value, ...values });
+  }
+
   render() {
-    const { selectedRows, selectedRowKeys, search_data, columns, initLoading, data, modalVisible,operateData,title,modal_width,show_foot,submiting, search_height } = this.state;
+    const { 
+      selectedRows, 
+      selectedRowKeys, 
+      search_data, 
+      columns, 
+      initLoading, 
+      data, 
+      modalVisible,
+      operateData,
+      title,
+      modal_width,
+      show_foot,
+      submiting, 
+      search_height,
+      siteList,
+      siteListLoading,
+      currentSite
+    } = this.state;
     return (
       <div className={global.common_page} style={{ flex: 1,padding:0 }}>
         <div className={global.tableListForm} ref={'search_part'}>
-          <Search search_data={search_data}
+          <Search ref={this.searchRef} search_data={search_data}
                   seaSubmit={(data) => this.search(data)} seaReset={() => this.seaReset()}/>
         </div>
         {/*公共功能条-start*/}
@@ -476,6 +531,20 @@ export default class GoodsOfflineLists extends Component {
             //确认删除选中的商品吗?
           }, `${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')}
         </div>
+        {/* 站点tab列表 */}
+        <Spin spinning={siteListLoading}>
+          <div className={global.site_list}>
+            {siteList.map((site) => (
+              <div
+                key={site.name}
+                onClick={() => this.setCurrentSite(site)}
+                className={`${global.site_item} ${site.name === currentSite.name ? global.site_active : ''}`}
+              >
+                {site.title}
+              </div>
+            ))}
+          </div>
+        </Spin>
         {/*公共功能条-end*/}
         <Spin spinning={initLoading}>
           {/*标准表格-start*/}

+ 84 - 5
xinkeaboard-seller/src/pages/goods/goods_online_lists.js

@@ -37,6 +37,7 @@ let pageSize = list_com_page_size_10;
 export default class GoodsOnlineLists extends Component {
   constructor(props) {
     super(props);
+    this.searchRef = React.createRef(); // 创建 ref
     this.state = {
       search_height:0,
       modal_width: 700,
@@ -148,6 +149,15 @@ export default class GoodsOnlineLists extends Component {
           },
         },
         {
+          title: `${sldComLanguage('发布渠道')}`,
+          dataIndex: 'distributionChannel',
+          align: 'center',
+          width: 100,
+          render: (text, record, index) => {
+            return this.siteList.some(item => item.value === text)?.title;
+          }
+        },
+        {
           title: `${sldComLanguage('店铺分类')}`,
           dataIndex: 'innerLabelList',
           align: 'center',
@@ -240,6 +250,9 @@ export default class GoodsOnlineLists extends Component {
           ),
         },
       ],
+      siteList: [],
+      currentSite: {},
+      siteListLoading: false, // 站点tab列表loading
     };
   }
 
@@ -301,7 +314,7 @@ export default class GoodsOnlineLists extends Component {
   ];
 
   componentDidMount() {
-    this.get_list({ pageSize: pageSize });
+    this.getSiteList()
     this.getTemplateList();
     this.getStoreCat();//获取店铺分类
     this.resize();
@@ -321,6 +334,22 @@ export default class GoodsOnlineLists extends Component {
     }
   }
 
+  // 获取站点列表
+  getSiteList = () => {
+    this.setState({ siteListLoading: true });
+    const { dispatch } = this.props;
+    dispatch({
+      type: 'common/get_site_list_data',
+      payload: {  },
+      callback: (res) => {
+        if (res.state == 200) {
+          this.setState({ siteList: res.data, currentSite: res.data[0], siteListLoading: false })
+          this.get_list({ pageSize: pageSize, distributionChannel: res.data[0]?.value });
+        }
+      },
+    });
+  }
+
   //获取店铺分类
   getStoreCat = () => {
     const { dispatch } = this.props;
@@ -432,6 +461,9 @@ export default class GoodsOnlineLists extends Component {
 
   //获取数据列表
   get_list = (params) => {
+    if (!params.distributionChannel) {
+      params.distributionChannel = this.state.currentSite.value;
+    }
     this.setState({ initLoading: true });
     const { dispatch } = this.props;
     dispatch({
@@ -504,8 +536,8 @@ export default class GoodsOnlineLists extends Component {
     this.setState({ [type]: datas });
   };
 
-  //搜索事件
-  search = (data) => {
+  // 处理筛选数据
+  parseSearchData = (data) => {
     const values = { ...data };
     //时间处理
     if (values.search_create_time) {
@@ -518,6 +550,13 @@ export default class GoodsOnlineLists extends Component {
         delete values[i];
       }
     }
+
+    return values;
+  }
+
+  //搜索事件
+  search = (data) => {
+    const values = this.parseSearchData(data)
     this.setState({
       formValues: values,
       params: { pageSize: pageSize }
@@ -566,14 +605,54 @@ export default class GoodsOnlineLists extends Component {
     }
   }
 
+  // 切换站点
+  setCurrentSite = (site) => {
+    const data = this.searchRef.current.getFieldsValue(); // 调用子组件方法
+    const values = this.parseSearchData(data)
+    this.setState({ currentSite: site })
+    this.get_list({ pageSize: pageSize, distributionChannel: site.value, ...values });
+  }
+
   render() {
-    const { selectedRows, selectedRowKeys, search_data, columns, initLoading, data, modalVisible, operateData, title, modal_width, show_foot, submiting, search_height } = this.state;
+    const { 
+      selectedRows, 
+      selectedRowKeys, 
+      search_data, 
+      columns, 
+      initLoading, 
+      data, 
+      modalVisible, 
+      operateData, 
+      title, 
+      modal_width, 
+      show_foot, 
+      submiting, 
+      search_height,
+      siteList,
+      siteListLoading,
+      currentSite
+    } = this.state;
     return (
       <div className={global.common_page} style={{ flex: 1, padding: 0 }}>
         <div className={global.tableListForm} ref={'search_part'}>
-          <Search search_data={search_data} moreSearchToggle={() => this.moreSearchToggle()}
+          <Search ref={this.searchRef} search_data={search_data} moreSearchToggle={() => this.moreSearchToggle()}
                   seaSubmit={(data) => this.search(data)} seaReset={() => this.seaReset()}/>
         </div>
+         {/* 站点tab列表 */}
+         <Spin spinning={siteListLoading}>
+            <div className={global.site_list}>
+              {siteList.map((site) => (
+                <div
+                  key={site.name}
+                  onClick={() => this.setCurrentSite(site)}
+                  className={`${global.site_item} ${site.name === currentSite.name ? global.site_active : ''}`}
+                >
+                  {site.title}
+                </div>
+              ))}
+            </div>
+         </Spin>
+        
         {/*公共功能条-start*/}
         <div className={global.operate_bg}
              style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between' }}>

+ 67 - 29
xinkeaboard-seller/src/pages/settledManage/baseInfo/index.js

@@ -39,6 +39,7 @@ export default class BaseInfo extends Component {
         name: 'enterType',
         placeholder: '',
         width: 250,
+        disabled: getSettleData('state') === 1,
         required: true,
         sel_data: [
           { name: `${sldComLanguage('个人入驻')}`, key: 0 },
@@ -57,6 +58,7 @@ export default class BaseInfo extends Component {
         fieldNames: { label: 'regionName', value: 'regionCode', children: 'children' },
         placeholder: `${sldComLanguage('请选择店铺所在地')}`,//请选择店铺所在地
         initialValue: [],
+        disabled: getSettleData('state') === 1,
         required: true,
         onChange: this.getAreaInfo,
         rules: [{
@@ -71,6 +73,7 @@ export default class BaseInfo extends Component {
           name: 'companyAddress',
           placeholder: `${sldComLanguage('请输入店铺详细地址,最多40字')}`,
           initialValue: '',
+          is_disable: getSettleData('state') === 1,
           required: true,
           rules: [{
             required: true,
@@ -84,6 +87,7 @@ export default class BaseInfo extends Component {
           name: 'contactName',
           placeholder: `${sldComLanguage('请输入联系人姓名,最多6个字')}`,
           initialValue: '',
+          disable: getSettleData('state') === 1,
           required: true,
           rules: [{
             required: true,
@@ -96,6 +100,7 @@ export default class BaseInfo extends Component {
           name: 'contactPhone',
           placeholder: `${sldComLanguage('请输入联系人手机号')}`,
           initialValue: '',
+          disable: true,
           required: true,
           rules: [{
             required: true,
@@ -106,6 +111,8 @@ export default class BaseInfo extends Component {
           }],
         },
       ],
+
+      //身份证正面信息——个人入驻
       personal_front_card_img: [{
         type: 'upload_img_upload',
         label: `${sldComLanguage('身份证正面')}`,
@@ -119,9 +126,12 @@ export default class BaseInfo extends Component {
         initialValue: '',
         img_succ_info: {},
         required: true,
+        disabled: getSettleData('state') === 1,
         num: 1,
         item_height: 130,
-      }],//身份证正面信息——个人入驻
+      }],
+      
+      //身份证反面信息——个人入驻
       personal_back_card_img: [{
         type: 'upload_img_upload',
         label: `${sldComLanguage('身份证反面')}`,
@@ -135,37 +145,42 @@ export default class BaseInfo extends Component {
         initialValue: '',
         img_succ_info: {},
         required: true,
+        disabled: getSettleData('state') === 1,
         num: 1,
         item_height: 130,
-      }],//身份证反面信息——个人入驻
-      company_base_info: [{
-        type: 'input',
-        maxLength: 20,
-        label: `${sldComLanguage('公司名称')}`,
-        name: 'companyName',
-        placeholder: `${sldComLanguage('请输入公司名称,最多20个字')}`,
-        initialValue: '',
-        required: true,
-        rules: [{
+      }],
+
+      // 企业入驻
+      company_base_info: [
+        {
+          type: 'input',
+          maxLength: 20,
+          label: `${sldComLanguage('公司名称')}`,
+          name: 'companyName',
+          placeholder: `${sldComLanguage('请输入公司名称,最多20个字')}`,
+          initialValue: '',
           required: true,
-          message: `${sldComLanguage('请输入公司名称')}`,
-        }],
-      }, {
-        type: 'cascader_common',
-        label: `${sldComLanguage('所在地')}`,
-        name: 'area',
-        width: '80%',
-        data: areaData,//三级地址
-        fieldNames: { label: 'regionName', value: 'regionCode', children: 'children' },
-        placeholder: `${sldComLanguage('请选择店铺所在地')}`,//请选择店铺所在地
-        initialValue: [],
-        required: true,
-        onChange: this.getAreaInfo,
-        rules: [{
+          rules: [{
+            required: true,
+            message: `${sldComLanguage('请输入公司名称')}`,
+          }],
+        }, 
+        {
+          type: 'cascader_common',
+          label: `${sldComLanguage('所在地')}`,
+          name: 'area',
+          width: '80%',
+          data: areaData,//三级地址
+          fieldNames: { label: 'regionName', value: 'regionCode', children: 'children' },
+          placeholder: `${sldComLanguage('请选择店铺所在地')}`,//请选择店铺所在地
+          initialValue: [],
           required: true,
-          message: `${sldComLanguage('请选择店铺所在地')}`,//请选择店铺所在地
-        }],
-      },
+          onChange: this.getAreaInfo,
+          rules: [{
+            required: true,
+            message: `${sldComLanguage('请选择店铺所在地')}`,//请选择店铺所在地
+          }],
+        },
         {
           type: 'textarea',
           maxLength: 40,
@@ -198,7 +213,8 @@ export default class BaseInfo extends Component {
           name: 'contactPhone',
           placeholder: `${sldComLanguage('请输入联系人手机号')}`,
           initialValue: '',
-          required: true,
+          // required: true,
+          disable: true,
           rules: [{
             required: true,
             message: `${sldComLanguage('请输入联系人手机号')}`,
@@ -310,6 +326,13 @@ export default class BaseInfo extends Component {
     this.initData();
   }
 
+  componentDidUpdate(prevProps, prevState) {
+    if (prevState.cur_apply_type !== this.state.cur_apply_type) {
+      this.initData()
+    }
+  }
+
+
   //获取地址信息
   getAreaInfo = (area) => {
     this.sel_area_name = '';//置空,防止数据累加
@@ -340,8 +363,23 @@ export default class BaseInfo extends Component {
   initData = async () => {
     let { cur_apply_type, apply_type, personal_base_info, personal_front_card_img, personal_back_card_img, company_base_info, business_license_img, legal_front_card_img, legal_back_card_img, replenish_1_img, replenish_2_img, replenish_3_img, show_apply_type_flag } = this.state;
     let tmp_data = getSettleData('baseInfo');
+    const localVendorMobile = getSettleData('user_info')?.vendorMobile ?? "";
     if (!tmp_data) {
       this.setState({ show_apply_type_flag: true });
+      if (cur_apply_type === 0) {
+        personal_base_info.forEach(item => {
+          if (item.name === 'contactPhone') {
+            item.initialValue = localVendorMobile;
+          }
+        })
+      } else {
+        company_base_info.forEach(item => {
+          if (item.name === 'contactPhone') {
+            item.initialValue = localVendorMobile;
+          }
+        });
+      }
+
       return false;
     }
     cur_apply_type = tmp_data.enterType;

+ 7 - 2
xinkeaboard-seller/src/pages/settledManage/businessInfo/index.js

@@ -36,6 +36,7 @@ export default class BusinessInfo extends Component {
           placeholder: `${sldComLanguage('请输入店铺名称,最多100个字')}`,
           initialValue: '',
           required: true,
+          disable: getSettleData('state') === 1,
           maxLength:100,
           rules: [{
             required: true,
@@ -76,6 +77,7 @@ export default class BusinessInfo extends Component {
         label: `${sldComLanguage('经营类型')}`,
         name: 'goodsCategoryIds',
         item_height: 300,
+        disabled: getSettleData('state') === 1,
         placeholder: ``,
         tree_data: [],
         selected_keys:[],//选择的key数组
@@ -83,7 +85,7 @@ export default class BusinessInfo extends Component {
         required: true,
       }],//选择经营类目
       company_qualification: {},
-
+      loading: false
     };
   }
 
@@ -306,6 +308,7 @@ export default class BusinessInfo extends Component {
         if(getSettleData('cur_step')*1 < 3){
           saveSettleData('cur_step', 3);
         }
+        this.setState({loading: true});
         dispatch({
           type: 'settled/save_apply',
           payload: tar_params,
@@ -319,6 +322,7 @@ export default class BusinessInfo extends Component {
             } else {
               message.error(res.msg);
             }
+            this.setState({loading: false});
           },
         });
       }
@@ -331,6 +335,7 @@ export default class BusinessInfo extends Component {
       // open_time_data,
       // store_grade_data,
       select_cat,
+      loading
     } = this.state;
     return (
       <div style={{ flex: 1 }}>
@@ -349,7 +354,7 @@ export default class BusinessInfo extends Component {
             <SldTableRowThree form={this.props.form} data={select_cat}/>
             {((getSettleData('state')&&getSettleData('state')==3)||!getSettleData('state'))&&
               <div className={styles.commen_wrap} style={{borderTopRightRadius:0,borderTopLeftRadius:0,marginTop:-30,paddingBottom:20,textAlign:'center'}}>
-                <Button type='primary' onClick={this.handleNextStep} className={styles.next_step}>提交</Button>
+                <Button loading={loading} type='primary' onClick={this.handleNextStep} className={styles.next_step}>提交</Button>
               </div>
             }
           </div>

+ 1 - 1
xinkeaboard-seller/src/pages/settledManage/protocol/index.js

@@ -91,7 +91,7 @@ export default class Protocol extends Component {
           </Scrollbars>
         </div>
 
-        <Checkbox style={{fontSize: '14px', marginTop: '10px'}} checked={checked} onChange={(e)=>this.handleToGoAgree(e.target.checked)}>我已阅读并同意以上协议~</Checkbox>
+        <Checkbox disabled={getSettleData('state') === 1} style={{fontSize: '14px', marginTop: '10px'}} checked={checked} onChange={(e)=>this.handleToGoAgree(e.target.checked)}>我已阅读并同意以上协议~</Checkbox>
 
         {((getSettleData('state') && getSettleData('state') == 3) || !getSettleData('state')) &&
         <div style={{ textAlign: 'center' }}>