Преглед на файлове

Merge remote-tracking branch 'origin/master'

sunshihao преди 1 седмица
родител
ревизия
4ee225831a
променени са 31 файла, в които са добавени 1006 реда и са изтрити 246 реда
  1. 12 0
      xinkeaboard-admin/src/global.less
  2. 2 1
      xinkeaboard-admin/src/pages/manage/article/article_cat_lists.js
  3. 2 1
      xinkeaboard-admin/src/pages/manage/article/article_list_content.js
  4. 2 1
      xinkeaboard-admin/src/pages/manage/help/article_list_content.js
  5. 2 2
      xinkeaboard-admin/src/pages/manage/models/store.js
  6. 15 5
      xinkeaboard-admin/src/pages/manage/product/goods_detail.js
  7. 121 40
      xinkeaboard-admin/src/pages/manage/store/apply_store_detail.js
  8. 96 19
      xinkeaboard-admin/src/pages/manage/store/edit_settled_store.js
  9. 87 18
      xinkeaboard-admin/src/pages/manage/store/settled_store_detail.js
  10. 22 0
      xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/seller/dto/StoreBusinessVO.java
  11. 3 5
      xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/seller/dto/StoreUpdateDTO.java
  12. 17 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/member/seller/admin/VendorController.java
  13. 2 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/member/seller/advich/SellerEnquiryController.java
  14. 2 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/msg/seller/SellerVerifyController.java
  15. 98 65
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/seller/admin/AdminStoreAuditController.java
  16. 25 16
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/seller/admin/AdminStoreController.java
  17. 1 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/seller/seller/SellerRolesController.java
  18. 4 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/seller/seller/SellerVendorController.java
  19. 1 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/sso/seller/SellerAuthController.java
  20. 27 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dto/StoreApplyAuditDTO.java
  21. 5 4
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/MemberModel.java
  22. 33 30
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/seller/StoreModel.java
  23. 4 2
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/seller/StoreNameModel.java
  24. 2 5
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/seller/StoreSiteInfoModel.java
  25. 4 13
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/seller/StoreApplyDetailVO.java
  26. 17 15
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/seller/StoreDetailVO.java
  27. 1 0
      xinkeaboard-web/assets/language/en.js
  28. 1 0
      xinkeaboard-web/assets/language/zh.js
  29. 9 4
      xinkeaboard-web/assets/style/member/collect.scss
  30. 387 0
      xinkeaboard-web/components/register-distributor/RegistPhone.vue
  31. 2 0
      xinkeaboard-web/pages/register.vue

+ 12 - 0
xinkeaboard-admin/src/global.less

@@ -2339,5 +2339,17 @@ body {
     background-color: @theme-color;
     color: #fff;
   }
+
+  
+}
+
+.site_info_list {
+  .site_info_item {
+    display: none;
+  }
+
+  .site_info_active {
+    display: block;
+  }
 }
 

+ 2 - 1
xinkeaboard-admin/src/pages/manage/article/article_cat_lists.js

@@ -128,11 +128,11 @@ export default class Article_cat_lists extends Component {
   //获取数据列表
   get_list = (params) => {
     const { dispatch } = this.props;
+    this.setState({ loading: true });
     dispatch({
       type: 'article/get_article_cat_lists',
       payload: params,
       callback: (res) => {
-        this.setState({ loading: false });
         if (res.state == 200) {
           if (res.data.list.length == 0 && this.state.params.current > 1) {
             params.current = params.current - 1;
@@ -143,6 +143,7 @@ export default class Article_cat_lists extends Component {
             });
           }
         }
+        this.setState({ loading: false });
       },
     });
   };

+ 2 - 1
xinkeaboard-admin/src/pages/manage/article/article_list_content.js

@@ -164,11 +164,11 @@ export default class ArticleListContent extends Component {
   //获取数据列表
   get_list = (params) => {
     const { dispatch } = this.props;
+    this.setState({ loading: true });
     dispatch({
       type: 'article/get_article_lists',
       payload: params,
       callback: (res) => {
-        this.setState({ loading: false });
         if (res.state == 200) {
           if (res.data.list.length == 0 && this.state.params.current > 1) {
             params.current = params.current - 1;
@@ -180,6 +180,7 @@ export default class ArticleListContent extends Component {
             });
           }
         }
+        this.setState({ loading: false });
       },
     });
   };

+ 2 - 1
xinkeaboard-admin/src/pages/manage/help/article_list_content.js

@@ -164,11 +164,11 @@ export default class ArticleListContent extends Component {
   //获取数据列表
   get_list = (params) => {
     const { dispatch } = this.props;
+    this.setState({ loading: true });
     dispatch({
       type: 'helpArticle/get_article_lists',
       payload: params,
       callback: (res) => {
-        this.setState({ loading: false });
         if (res.state == 200) {
           if (res.data.list.length == 0 && this.state.params.current > 1) {
             params.current = params.current - 1;
@@ -180,6 +180,7 @@ export default class ArticleListContent extends Component {
             });
           }
         }
+        this.setState({ loading: false });
       },
     });
   };

+ 2 - 2
xinkeaboard-admin/src/pages/manage/models/store.js

@@ -78,7 +78,7 @@ export default {
     },
     //slodon_审核入驻店铺
     * check_store({ payload, callback }, { call }) {
-      const response = yield call(sldCommonService, payload, 'post', 'v3/seller/admin/storeAudit/audit');
+      const response = yield call(sldCommonService, payload, 'post', 'v3/seller/admin/storeAudit/audit', 'json');
       if (callback) callback(response);
     },
     //slodon_获取入驻店铺列表
@@ -113,7 +113,7 @@ export default {
     },
     //slodon_编辑入驻店铺信息
     * edit_settled_store_info({ payload, callback }, { call }) {
-      const response = yield call(sldCommonService, payload, 'post', 'v3/seller/admin/store/edit');
+      const response = yield call(sldCommonService, payload, 'post', 'v3/seller/admin/store/edit', 'json');
       if (callback) callback(response);
     },
     //slodon_获取临效期店铺列表

+ 15 - 5
xinkeaboard-admin/src/pages/manage/product/goods_detail.js

@@ -20,8 +20,8 @@ import SldPreviewImg from '@/components/SldPreviewImg/SldPreviewImg';
 import defaultSettings from '@/defaultSettings';
 
 let pageSize = list_com_page_size_10;
-@connect(({ product }) => ({
-  product,
+@connect(({ product, global }) => ({
+  product,global
 }))
 @Form.create()
 export default class GoodsDetail extends Component {
@@ -32,6 +32,7 @@ export default class GoodsDetail extends Component {
       params: { pageSize: pageSize },//搜索条件
       preview_img: '',
       show_preview_modal: false,
+      currentSite: props.global.currentSite,
       goods_base_data: [/*{
         type: 'show_text',
         label: `${sldComLanguage('商品类型')}:`,
@@ -74,7 +75,16 @@ export default class GoodsDetail extends Component {
         extra: ``,
         item_height: 42,
         text: ``,
-      }],//商品基本信息
+      },
+      {
+        type: 'show_text',
+        label: `${sldComLanguage('商品中文名称')}:`,
+        name: 'goodsNameCn',
+        extra: ``,
+        item_height: 42,
+        text: ``,
+      }
+      ],//商品基本信息
       price_test_data: [{
         type: 'show_text',
         label: `${sldComLanguage('商品价格')}`,
@@ -421,7 +431,7 @@ export default class GoodsDetail extends Component {
   };
 
   render() {
-    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 ,goods_download_data,price_test_data,goods_min_order_data} = this.state;
+    const { currentSite, 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 ,goods_download_data,price_test_data,goods_min_order_data} = this.state;
     return (
       <div className={global.common_page} style={{ flex: 1 }}>
         <div className={global.flex_com_space_between} style={{ margin: 10, marginTop: 0 }}>
@@ -435,7 +445,7 @@ export default class GoodsDetail extends Component {
           autoHeightMax={document.body.clientHeight - 130}>
           {sldCommonTitle(sldComLanguage('基本信息'), '#333', 5, 12, 15)}
           <SldTableRowTwo r_color={'#333'} l_color={'#999'} l_fontw={500} r_fontw={600} form={this.props.form}
-                          data={goods_base_data}/>
+                          data={goods_base_data.filter(item => currentSite === '1' ? item : item.name !== 'goodsNameCn')}/>
 
           {(goods_detail_data.goodsSummary)
             ?<Fragment>

+ 121 - 40
xinkeaboard-admin/src/pages/manage/store/apply_store_detail.js

@@ -16,6 +16,7 @@ import {
   getSldEmptyH,
   sucTip,
   sldSvgIcon,
+  list_com_page_more
 } from '@/utils/utils';
 import global from '@/global.less';
 import router from 'umi/router';
@@ -106,17 +107,21 @@ export default class ApplyStoreDetail extends Component {
         label: `${sldComLanguage('店铺名称')}`,
         name: 'storeName',
         extra: ``,
-        item_height: 42,
         text: ``,
       }, {
-        type: 'show_text',
-        label: `${sldComLanguage('店铺等级')}`,
-        name: 'storeGradeName',
-        extra: ``,
-        item_height: 42,
-        text: ``,
-      },
-
+          type: 'select',
+          label: `${sldComLanguage('店铺等级')}`,
+          name: 'storeGradeId',
+          sel_data: [],
+          sele_key: 'gradeId',
+          sele_name: 'gradeName',
+          diy: true,
+          required: true,
+          rules: [{
+            required: true,
+            message: `${sldComLanguage('请选择店铺等级')}`,
+          }],
+        },
         {
           type: 'select',
           label: `${sldComLanguage('开店时长')}`,
@@ -234,19 +239,40 @@ export default class ApplyStoreDetail extends Component {
       titleName: '',
       submiting: false,
       modal_width: 500,
+      gradeList: [],
     };
   }
 
   componentDidMount() {
+    this.get_store_grade();
+    this.getStoreOpenTime();
     this.props.dispatch({
       type: 'global/getLayoutCollapsed',
     });
     const { query } = this.state;
-    this.getStoreOpenTime();
     this.get_detail({ applyId: query.id });
     this.get_reason_list();//获取审核拒绝的理由
   }
 
+  //获取店铺等级
+  get_store_grade = () => {
+    let { store_business_info } = this.state;
+    const { dispatch } = this.props;
+    dispatch({
+      type: 'store/get_grade_lists',
+      payload: { pageSize: list_com_page_more },
+      callback: (res) => {
+        if (res.state == 200) {
+          let tar_data = store_business_info.filter(item => item.name == 'storeGradeId')[0];
+          tar_data.sel_data = res.data.list;
+          this.setState({
+            store_business_info,
+          });
+        }
+      },
+    });
+  };
+
   //获取开店时长列表
   getStoreOpenTime =  () => {
     let { store_business_info } = this.state;
@@ -321,25 +347,41 @@ export default class ApplyStoreDetail extends Component {
           //身份证信息-end
 
           //店铺经营信息-start
-          store_business_info.map(item => {
-            if (item.name == 'applyYear') {
-              item.text = `${store_detail[item.name]}${sldComLanguage('年')}`;
-            } else {
-              item.text = store_detail[item.name];
-            }
-          });
+          // store_business_info.map(item => {
+          //   if (item.name == 'applyYear') {
+          //     item.text = `${store_detail[item.name]}${sldComLanguage('年')}`;
+          //   } else {
+          //     item.text = store_detail[item.name];
+          //   }
+          // });
 
-          store_business_info_chakan.map(item => {
-            if (item.name == 'applyYear') {
-              item.text = `${store_detail[item.name]}${sldComLanguage('年')}`;
-            } else {
-              item.text = store_detail[item.name];
-            }
-          });
+          // store_business_info_chakan.map(item => {
+          //   if (item.name == 'applyYear') {
+          //     item.text = `${store_detail[item.name]}${sldComLanguage('年')}`;
+          //   } else {
+          //     item.text = store_detail[item.name];
+          //   }
+          // });
           //店铺经营信息-end
 
           // 店铺经营类型区分站点--start
-          const { storeGoodsCateVOList } = store_detail;
+          // store_detail.storeBusinessVOList = [
+          //   {
+          //     storeGradeId: 1,
+          //     storeGradeName: '5颗星',
+          //     openTime: null,
+          //     webSite: '1',
+          //     storeName: '111',
+          //   },
+          //   {
+          //     storeGradeId: 2,
+          //     storeGradeName: '4颗星',
+          //     openTime: null,
+          //     webSite: '2',
+          //     storeName: '22'
+          //   }
+          // ]
+          const { storeGoodsCateVOList, storeBusinessVOList } = store_detail;
           const siteListData = [];
           storeGoodsCateVOList?.forEach(item => {
             if (!siteListData.find(site => site.webSite === item.webSite)) {
@@ -350,6 +392,23 @@ export default class ApplyStoreDetail extends Component {
             }
           });
           if (siteListData.length) {
+            siteListData.forEach(item => {
+              const matchItem = storeBusinessVOList.find(vo => vo.webSite === item.webSite);
+              if (matchItem) {
+                item.store_business_info = store_business_info.map(info => ({
+                  ...info,
+                  name: `${info.name}_${matchItem.webSite}`,
+                  text: matchItem[info.name] ?? '',
+                  // initialValue: matchItem[info.name]
+                })) 
+                item.store_business_info_chakan = store_business_info_chakan.map(info => ({
+                  ...info,
+                  name: `${info.name}_${matchItem.webSite}`,
+                  text: matchItem[info.name] ?? "",
+                  // initialValue: matchItem[info.name]
+                }))
+              }
+            })
             const sortSiteList = siteListData.sort((a, b) => Number(a.webSite) - Number(b.webSite));
             this.setState({siteList: sortSiteList});
             this.setState({currentSite: siteListData[0]})
@@ -357,11 +416,11 @@ export default class ApplyStoreDetail extends Component {
           // 店铺经营类型区分站点--end
 
           this.setState({
-            store_base_info,
+            // store_base_info,
             store_detail,
             card_data,
             store_business_info,
-            store_business_info_chakan,
+            // store_business_info_chakan,
             business_data,
             more_qualification_data,
           });
@@ -482,7 +541,7 @@ export default class ApplyStoreDetail extends Component {
 
   //审核通过
   agree = () => {
-    const { store_detail } = this.state;
+    const { store_detail, currentSite, siteList } = this.state;
     let scalingBindIdsArray = [];
     store_detail.storeGoodsCateVOList.map(item => {
       scalingBindIdsArray.push(`${item.bindId}-${item.scaling}`);
@@ -492,8 +551,23 @@ export default class ApplyStoreDetail extends Component {
     param.scalingBindIds = scalingBindIdsArray.join(',');
     this.props.form.validateFieldsAndScroll((err, values) => {
       if(!err){
-        param.openTime = values.openTime
+        param.storeBusinessVOList = store_detail.storeBusinessVOList.map(item => ({
+            storeGradeId: values[`storeGradeId_${item.webSite}`],
+          //  storeGradeName: '5颗星',
+            openTime: values[`openTime_${item.webSite}`],
+            webSite: item.webSite,
+            // storeName: item.storeName,
+        }))
         this.operate(param);
+      } else {
+        const errorKeys = Object.keys(err);
+        const firstKeyBelongSite = errorKeys[0].replace(/^[^_]*_/, "");
+        if(currentSite.webSite !== firstKeyBelongSite) {
+          this.setCurrentSite({
+            webSite: firstKeyBelongSite,
+            webSiteName: siteList.find(site => site.webSite === firstKeyBelongSite)?.webSiteName
+          })
+        }
       }
     })
 
@@ -556,17 +630,24 @@ export default class ApplyStoreDetail extends Component {
               </div>
             ))}
           </div>
-          {sldCommonTitle(`${sldComLanguage('店铺经营信息')}`, '#333', 5, 15, 15)}
-          {store_detail.state == 1 &&
-          <SldTableRowTwo r_color={'#333'} l_color={'#999'} l_fontw={500} r_fontw={600} form={this.props.form}
-                          data={store_business_info}/>
-          }
-
-          {store_detail.state == 3 &&
-          <SldTableRowTwo r_color={'#333'} l_color={'#999'} l_fontw={500} r_fontw={600} form={this.props.form}
-                          data={store_business_info_chakan}/>
-          }
-
+          <div className={global.site_info_list}>
+            {sldCommonTitle(`${sldComLanguage('店铺经营信息')}`, '#333', 5, 15, 15)}
+            {siteList.map((site) => (
+              <div
+                key={site.webSite}
+                className={`${global.site_info_item} ${site.webSite === currentSite.webSite ? global.site_info_active : ''}`}
+              >
+                <SldTableRowTwo
+                    r_color={'#333'} 
+                    l_color={'#999'} 
+                    l_fontw={500} 
+                    r_fontw={600} 
+                    form={this.props.form}
+                    data={store_detail.state == 1 ? site.store_business_info : site.store_business_info_chakan}
+                 />
+              </div>
+            ))}
+          </div>
           {sldCommonTitle(`${sldComLanguage('经营类目')}`, '#333', 5, 15, 15)}
           {/*{store_detail.state == 1 &&*/}
           {/*<div className={`${global.flex_row_end_end}`} style={{ paddingBottom: 10, marginTop: -40 }}>*/}

+ 96 - 19
xinkeaboard-admin/src/pages/manage/store/edit_settled_store.js

@@ -46,6 +46,8 @@ export default class EditSettledStore extends Component {
       preview_alt_con: '',//预览图片内容
       show_radio_flag: false,
       query: props.location.query,
+      siteList: [],
+      currentSite: {}, // 当前站点
       store_detail: {},
       store_base_info: [{ //店铺信息
         type: 'show_text',
@@ -521,15 +523,15 @@ export default class EditSettledStore extends Component {
           //营业执照信息-end
 
           //店铺经营信息-start
-          store_business_info.map(item => {
-            if (item.name == 'storeName') {
-              item.text = store_detail[item.name];
-            } else if (item.name == 'billCycle') {
-              item.initialValue = 1;
-            } else {
-              item.initialValue = store_detail[item.name];
-            }
-          });
+          // store_business_info.map(item => {
+          //   if (item.name == 'storeName') {
+          //     item.text = store_detail[item.name];
+          //   } else if (item.name == 'billCycle') {
+          //     item.initialValue = 1;
+          //   } else {
+          //     item.initialValue = store_detail[item.name];
+          //   }
+          // });
           //店铺经营信息-end
 
           //结算信息-start
@@ -549,10 +551,37 @@ export default class EditSettledStore extends Component {
           }
           //结算信息-end
 
+          const { storeGoodsCateVOList, storeBusinessVOList } = store_detail;
+          const siteListData = [];
+          storeGoodsCateVOList?.forEach(item => {
+            if (!siteListData.find(site => site.webSite === item.webSite)) {
+              siteListData.push({
+                webSite: item.webSite,
+                webSiteName: item.webSiteName
+              })
+            }
+          });
+          if (siteListData.length) {
+            siteListData.forEach(item => {
+              const matchItem = storeBusinessVOList.find(vo => vo.webSite === item.webSite);
+              if (matchItem) {
+                item.store_business_info = store_business_info.map(info => ({
+                  ...info,
+                  name: `${info.name}_${matchItem.webSite}`,
+                  text: matchItem[info.name] ?? '',
+                  initialValue: matchItem[info.name]
+                })).map(this.parseSiteItem)
+              }
+            })
+            const sortSiteList = siteListData.sort((a, b) => Number(a.webSite) - Number(b.webSite));
+            this.setState({siteList: sortSiteList});
+            this.setState({currentSite: siteListData[0]})
+          }
+
           this.setState({
             store_base_info,
             store_detail,
-            store_business_info,
+            // store_business_info,
             replenish_img,
             business_license_img,
             personal_front_card_img,
@@ -566,6 +595,14 @@ export default class EditSettledStore extends Component {
     });
   };
 
+  parseSiteItem = (item) => {
+    if (item.name == 'billCycle') {
+     item.initialValue = 1;
+    }
+
+   return item;
+  }
+
   //表格编辑事件
   handleFieldChange(val, fieldName, record) {
     let { store_detail } = this.state;
@@ -608,8 +645,7 @@ export default class EditSettledStore extends Component {
 
   //保存
   save = () => {
-    let { store_detail, business_license_img, replenish_img, personal_front_card_img } = this.state;
-    const { query } = this.state;
+    let { query, siteList, store_detail, business_license_img, replenish_img, personal_front_card_img } = this.state;
     this.props.form.validateFieldsAndScroll((err, values) => {
       if(!err){
         let params = { ...values };
@@ -658,6 +694,20 @@ export default class EditSettledStore extends Component {
           params.personCardDown = personal_front_card_img[1].fileList[0].response.data.path;//身份证反面图片
         }
 
+        // 处理店铺等级以及开店时长
+        params.storeBusinessVOList = store_detail.storeBusinessVOList.map(item => ({
+            storeGradeId: values[`storeGradeId_${item.webSite}`],
+          //  storeGradeName: '5颗星',
+            openTime: values[`openTime_${item.webSite}`],
+            webSite: item.webSite,
+            // storeName: item.storeName,
+        }))
+
+        siteList.forEach(site => {
+          delete params[`storeGradeId_${site.webSite}`];
+          delete params[`openTime_${site.webSite}`]
+        })
+        
         this.props.dispatch({
           type: 'store/edit_settled_store_info',
           payload: params,
@@ -682,9 +732,14 @@ export default class EditSettledStore extends Component {
     });
   };
 
+  // 切换站点
+  setCurrentSite = (site) => {
+    this.setState({ currentSite: site })
+  }
+
   render() {
     const {
-      store_base_info, personal_front_card_img, store_business_info, columns, store_detail, business_license_img, replenish_img, show_radio_flag, settle_info, preview_img, show_preview_modal, preview_alt_con,
+      siteList, currentSite, store_base_info, personal_front_card_img, store_business_info, columns, store_detail, business_license_img, replenish_img, show_radio_flag, settle_info, preview_img, show_preview_modal, preview_alt_con,
     } = this.state;
     return (
       <div className={global.common_page}
@@ -723,13 +778,35 @@ export default class EditSettledStore extends Component {
                             data={replenish_img}/>
           </Fragment>
           }
-          {show_radio_flag &&
-          <Fragment>
+          <div className={global.site_list}>
+            {siteList.map((site) => (
+              <div
+                key={site.webSite}
+                onClick={() => this.setCurrentSite(site)}
+                className={`${global.site_item} ${site.webSite === currentSite.webSite ? global.site_active : ''}`}
+              >
+                {site.webSiteName}
+              </div>
+            ))}
+          </div>
+          <div className={global.site_info_list}>
             {sldCommonTitle(`${sldComLanguage('店铺经营信息')}`, '#333', 5, 15, 15)}
-            <SldTableRowTwo r_color={'#333'} l_color={'#999'} l_fontw={500} r_fontw={600} form={this.props.form}
-                            data={store_business_info}/>
-          </Fragment>
-          }
+            {siteList.map((site) => (
+              <div
+                key={site.webSite}
+                className={`${global.site_info_item} ${site.webSite === currentSite.webSite ? global.site_info_active : ''}`}
+              >
+                {show_radio_flag && <SldTableRowTwo 
+                  r_color={'#333'} 
+                  l_color={'#999'} 
+                  l_fontw={500} 
+                  r_fontw={600} 
+                  form={this.props.form}
+                  data={site.store_business_info}
+                />}
+              </div>
+            ))}
+          </div>
 
           {/*{show_radio_flag &&*/}
           {/*<Fragment>*/}

+ 87 - 18
xinkeaboard-admin/src/pages/manage/store/settled_store_detail.js

@@ -34,6 +34,8 @@ export default class ApplyStoreDetail extends Component {
     } = props;
     this.state = {
       query: props.location.query,
+      siteList: [],
+      currentSite: {}, // 当前站点
       store_detail: {},
       store_base_info: [{ //店铺信息
         type: 'show_text',
@@ -240,24 +242,49 @@ export default class ApplyStoreDetail extends Component {
           //身份证信息-end
 
           //店铺经营信息-start
-          store_business_info.map(item => {
-            if (item.name == 'openTime') {
-              item.text = `${store_detail[item.name]}${sldComLanguage('年')}`;
-            } else if (item.name == 'payAmount') {
-              item.text = `${store_detail[item.name]}${sldComLanguage('元')}`;
-            } else if (item.name == 'billCycle') {
-              item.text = `${store_detail[item.name]?store_detail[item.name]:`${sldComLanguage('系统默认')}`}`;
-            } else {
-              item.text = store_detail[item.name];
+          // store_business_info.map(item => {
+          //   if (item.name == 'openTime') {
+          //     item.text = `${store_detail[item.name]}${sldComLanguage('年')}`;
+          //   } else if (item.name == 'payAmount') {
+          //     item.text = `${store_detail[item.name]}${sldComLanguage('元')}`;
+          //   } else if (item.name == 'billCycle') {
+          //     item.text = `${store_detail[item.name]?store_detail[item.name]:`${sldComLanguage('系统默认')}`}`;
+          //   } else {
+          //     item.text = store_detail[item.name];
+          //   }
+          // });
+          //店铺经营信息-end
+          const { storeGoodsCateVOList, storeBusinessVOList } = store_detail;
+          const siteListData = [];
+          storeGoodsCateVOList?.forEach(item => {
+            if (!siteListData.find(site => site.webSite === item.webSite)) {
+              siteListData.push({
+                webSite: item.webSite,
+                webSiteName: item.webSiteName
+              })
             }
           });
-          //店铺经营信息-end
-
+          if (siteListData.length) {
+            siteListData.forEach(item => {
+              const matchItem = storeBusinessVOList.find(vo => vo.webSite === item.webSite);
+              if (matchItem) {
+                item.store_business_info = store_business_info.map(info => ({
+                  ...info,
+                  name: `${info.name}_${matchItem.webSite}`,
+                  text: this.parseText(matchItem[info.name], info.name),
+                  initialValue: matchItem[info.name]
+                })) 
+              }
+            })
+            const sortSiteList = siteListData.sort((a, b) => Number(a.webSite) - Number(b.webSite));
+            this.setState({siteList: sortSiteList});
+            this.setState({currentSite: siteListData[0]})
+          }
           this.setState({
             store_base_info,
             store_detail,
             card_data,
-            store_business_info,
+            // store_business_info,
             business_data,
             more_qualification_data,
           });
@@ -268,6 +295,18 @@ export default class ApplyStoreDetail extends Component {
     });
   };
 
+  parseText = (text, name) => {
+    let newText = text;
+    if (name == 'openTime') {
+      newText = `${text}${sldComLanguage('年')}`;
+    } else if (name == 'payAmount') {
+      newText = `${text}${sldComLanguage('元')}`;
+    } else if (name == 'billCycle') {
+      newText = `${text ?? `${sldComLanguage('系统默认')}`}`;
+    }
+    return newText ?? '';
+  }
+
   //表格编辑事件
   handleFieldChange(val, fieldName, record) {
     let { store_detail } = this.state;
@@ -280,9 +319,14 @@ export default class ApplyStoreDetail extends Component {
     }
   }
 
+  // 切换站点
+  setCurrentSite = (site) => {
+    this.setState({ currentSite: site })
+  }
+
   render() {
     const {
-      store_base_info, card_data, store_business_info, columns, store_detail,  business_data, more_qualification_data,
+      siteList, currentSite, store_base_info, card_data, store_business_info, columns, store_detail,  business_data, more_qualification_data,
     } = this.state;
     return (
       <div className={global.common_page}
@@ -321,16 +365,41 @@ export default class ApplyStoreDetail extends Component {
                             data={more_qualification_data}/>
           </Fragment>
           }
-          {sldCommonTitle(`${sldComLanguage('店铺经营信息')}`, '#333', 5, 15, 15)}
-          <SldTableRowTwo r_color={'#333'} l_color={'#999'} l_fontw={500} r_fontw={600} form={this.props.form}
-                          data={store_business_info}/>
+          <div className={global.site_list}>
+            {siteList.map((site) => (
+              <div
+                key={site.webSite}
+                onClick={() => this.setCurrentSite(site)}
+                className={`${global.site_item} ${site.webSite === currentSite.webSite ? global.site_active : ''}`}
+              >
+                {site.webSiteName}
+              </div>
+            ))}
+          </div>
+          <div className={global.site_info_list}>
+            {sldCommonTitle(`${sldComLanguage('店铺经营信息')}`, '#333', 5, 15, 15)}
+            {siteList.map((site) => (
+              <div
+                key={site.webSite}
+                className={`${global.site_info_item} ${site.webSite === currentSite.webSite ? global.site_info_active : ''}`}
+              >
+                <SldTableRowTwo 
+                  r_color={'#333'} 
+                  l_color={'#999'} 
+                  l_fontw={500} 
+                  r_fontw={600} 
+                  form={this.props.form}
+                  data={site.store_business_info}
+                />
+              </div>
+            ))}
+          </div>
           {sldCommonTitle(`${sldComLanguage('经营类目')}`, '#333', 5, 15, 15)}
-
           <div style={{ width: '98%', maxHeight: 300 }}>
             <Scrollbars autoHeight
                         autoHeightMax={300}>
               <Table rowKey={'bindId'} pagination={false} columns={columns}
-                     dataSource={store_detail.storeGoodsCateVOList} size={'small'}/>
+                     dataSource={store_detail.storeGoodsCateVOList?.filter(item => item.webSite === currentSite.webSite)} size={'small'}/>
             </Scrollbars>
           </div>
           {getSldEmptyH(40)}

+ 22 - 0
xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/seller/dto/StoreBusinessVO.java

@@ -0,0 +1,22 @@
+package com.slodon.b2b2c.seller.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class StoreBusinessVO {
+    @ApiModelProperty("站点")
+    private String webSite;
+
+    @ApiModelProperty("店铺名称")
+    private String storeName;
+
+    @ApiModelProperty("开店时长")
+    private Integer openTime;
+
+    @ApiModelProperty("店铺等级id")
+    private Integer storeGradeId;
+
+    @ApiModelProperty("店铺等级名称")
+    private String storeGradeName;
+}

+ 3 - 5
xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/seller/dto/StoreUpdateDTO.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * @author lxk
@@ -49,11 +50,8 @@ public class StoreUpdateDTO implements Serializable {
     @ApiModelProperty("开店时长")
     private Integer openTime;
 
-    @ApiModelProperty("国内店铺等级id")
-    private Integer storeGradeIdCn;
-
-    @ApiModelProperty("国内开店时长")
-    private Integer openTimeCn;
+    @ApiModelProperty("店铺经营信息")
+    private List<StoreBusinessVO> storeBusinessVOList;
 
     private String paymentName;
 

+ 17 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/member/seller/admin/VendorController.java

@@ -11,6 +11,7 @@ import com.slodon.b2b2c.core.response.PageVO;
 import com.slodon.b2b2c.core.response.PagerInfo;
 import com.slodon.b2b2c.core.response.SldResponse;
 import com.slodon.b2b2c.core.util.*;
+import com.slodon.b2b2c.enums.WebSiteConstant;
 import com.slodon.b2b2c.member.dto.MemberAddDTO;
 import com.slodon.b2b2c.member.dto.MemberIntegralLogUpdateDTO;
 import com.slodon.b2b2c.member.dto.MemberUpdateDTO;
@@ -21,11 +22,14 @@ import com.slodon.b2b2c.model.member.MemberIntegralLogModel;
 import com.slodon.b2b2c.model.member.MemberModel;
 import com.slodon.b2b2c.model.msg.MemberSettingModel;
 import com.slodon.b2b2c.model.seller.StoreApplyModel;
+import com.slodon.b2b2c.model.seller.StoreNameModel;
 import com.slodon.b2b2c.model.seller.VendorModel;
 import com.slodon.b2b2c.model.seller.VendorRolesModel;
 import com.slodon.b2b2c.seller.example.StoreApplyExample;
+import com.slodon.b2b2c.seller.example.StoreNameExample;
 import com.slodon.b2b2c.seller.example.VendorExample;
 import com.slodon.b2b2c.seller.pojo.StoreApply;
+import com.slodon.b2b2c.seller.pojo.StoreName;
 import com.slodon.b2b2c.seller.pojo.Vendor;
 import com.slodon.b2b2c.seller.pojo.VendorRoles;
 import com.slodon.b2b2c.system.pojo.Admin;
@@ -65,6 +69,8 @@ public class VendorController extends BaseController {
     private RedisTemplate<String, Object> objectRedisTemplate;
     @Resource
     private StoreApplyModel storeApplyModel;
+    @Resource
+    private StoreNameModel storeNameModel;
 
     /**
      * 商家列表
@@ -78,6 +84,7 @@ public class VendorController extends BaseController {
      */
     @ApiOperation("商家列表")
     @ApiImplicitParams({
+            @ApiImplicitParam(name = "webSite", value = "站点", paramType = "query"),
             @ApiImplicitParam(name = "memberName", value = "会员名称", paramType = "query"),
             @ApiImplicitParam(name = "memberMobile", value = "mobile", paramType = "query"),
             @ApiImplicitParam(name = "state", value = "会员状态:0-禁用,1-启用", paramType = "query"),
@@ -88,6 +95,7 @@ public class VendorController extends BaseController {
     })
     @GetMapping("list")
     public JsonResult<PageVO<StoreVendorVO>> getList(HttpServletRequest request,
+                                                     @RequestParam(value = "webSite", required = false) String webSite,
                                                      @RequestParam(value = "vendorName", required = false) String vendorName,
                                                      @RequestParam(value = "vendorMobile", required = false) String vendorMobile,
                                                      @RequestParam(value = "state", required = false) Integer state,
@@ -115,6 +123,15 @@ public class VendorController extends BaseController {
                 if (!CollectionUtils.isEmpty(storeApplyList)){
                     storeName = storeApplyList.get(0).getStoreName();
                 }
+                if(WebSiteConstant.MEMBER_DISTRIBUTOR.equals(webSite)){
+                    StoreNameExample storeNameExample = new StoreNameExample();
+                    storeNameExample.setStoreId(vendor.getStoreId());
+                    storeNameExample.setWebSite(webSite);
+                    List<StoreName> storeNameList = storeNameModel.getStoreNameList(storeNameExample, null);
+                    if (!CollectionUtils.isEmpty(storeNameList)){
+                        storeName = storeNameList.get(0).getStoreName();
+                    }
+                }
                 StoreVendorVO vo = new StoreVendorVO(vendor,storeName);
                 //获取权限组名称
 //                VendorRoles vendorRoles = vendorRolesModel.getVendorRolesByRolesId(vendor.getRolesId());

+ 2 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/member/seller/advich/SellerEnquiryController.java

@@ -1,5 +1,6 @@
 package com.slodon.b2b2c.controller.member.seller.advich;
 
+import com.slodon.b2b2c.core.constant.VendorConst;
 import com.slodon.b2b2c.core.controller.BaseController;
 import com.slodon.b2b2c.core.response.JsonResult;
 import com.slodon.b2b2c.core.response.PageVO;
@@ -97,6 +98,7 @@ public class SellerEnquiryController extends BaseController {
     public JsonResult<PageVO<EnquiryVendorVO>> getSubAdminList(HttpServletRequest request) {
         Vendor vendorInfo = UserUtil.getUser(request, Vendor.class);
         VendorExample example = new VendorExample();
+        example.setIsAllowLoginNotEquals(VendorConst.LOGOUT_ALLOW_LOGIN);
         example.setStoreId(vendorInfo.getStoreId());
         example.setOrderBy("vendor_id asc");
         List<Vendor> vendorList = vendorModel.getVendorList(example, null);

+ 2 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/msg/seller/SellerVerifyController.java

@@ -3,6 +3,7 @@ package com.slodon.b2b2c.controller.msg.seller;
 import cn.hutool.extra.mail.MailUtil;
 import com.slodon.b2b2c.core.config.DomainUrlUtil;
 import com.slodon.b2b2c.core.constant.SMSConst;
+import com.slodon.b2b2c.core.constant.VendorConst;
 import com.slodon.b2b2c.core.controller.BaseController;
 import com.slodon.b2b2c.core.exception.MallException;
 import com.slodon.b2b2c.core.random.RandomUtil;
@@ -77,6 +78,7 @@ public class SellerVerifyController extends BaseController {
 
         VendorExample example = new VendorExample();
         example.setVendorMobile(mobile);
+        example.setIsAllowLoginNotEquals(VendorConst.LOGOUT_ALLOW_LOGIN);
         List<Vendor> vendorList = vendorModel.getVendorList(example, null);
 
         // 阿里云发送

+ 98 - 65
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/seller/admin/AdminStoreAuditController.java

@@ -9,12 +9,14 @@ import com.slodon.b2b2c.core.response.PagerInfo;
 import com.slodon.b2b2c.core.response.SldResponse;
 import com.slodon.b2b2c.core.util.*;
 import com.slodon.b2b2c.dao.write.seller.StoreWriteMapper;
+import com.slodon.b2b2c.dto.StoreApplyAuditDTO;
 import com.slodon.b2b2c.enums.WebSiteConstant;
 import com.slodon.b2b2c.goods.example.GoodsCategoryExample;
 import com.slodon.b2b2c.goods.pojo.GoodsCategory;
 import com.slodon.b2b2c.model.goods.GoodsCategoryModel;
 import com.slodon.b2b2c.model.seller.*;
 import com.slodon.b2b2c.model.system.SettingModel;
+import com.slodon.b2b2c.seller.dto.StoreBusinessVO;
 import com.slodon.b2b2c.seller.example.*;
 import com.slodon.b2b2c.seller.pojo.*;
 import com.slodon.b2b2c.system.pojo.Admin;
@@ -32,7 +34,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -180,33 +181,49 @@ public class AdminStoreAuditController {
             vo.setOpenTime(store.getOpenTime());
         }
 
+        List<StoreBusinessVO> storeBusinessVOList = new ArrayList<>();
+        StoreBusinessVO storeBusinessVO = new StoreBusinessVO();
+        storeBusinessVO.setWebSite(WebSiteConstant.MEMBER_OVERSEA);
+        storeBusinessVO.setStoreName(vo.getStoreName());
+        storeBusinessVO.setOpenTime(vo.getOpenTime());
+        storeBusinessVO.setStoreGradeId(vo.getStoreGradeId());
+        storeBusinessVO.setStoreGradeName(vo.getStoreGradeName());
+        storeBusinessVOList.add(storeBusinessVO);
 
-        StoreSiteInfoExample storeSiteInfoExample =new StoreSiteInfoExample();
-        storeSiteInfoExample.setStoreId(storeApply.getStoreId());
-        storeSiteInfoExample.setWebSite(WebSiteConstant.MEMBER_DISTRIBUTOR);
-        StoreSiteInfo storeSiteInfo = storeSiteInfoModel.getStoreSiteInfo(storeSiteInfoExample);
-        if (storeSiteInfo != null) {
-            vo.setStoreGradeIdCn(storeSiteInfo.getStoreGradeId());
-            vo.setStoreGradeNameCn(storeSiteInfo.getStoreGradeName());
-            vo.setOpenTimeCn(storeSiteInfo.getOpenTime());
-        }
+        StoreNameExample storeNameExample = new StoreNameExample();
+        storeNameExample.setStoreId(storeApply.getStoreId());
+        storeNameExample.setWebSite(WebSiteConstant.MEMBER_DISTRIBUTOR);
+        StoreName storeName = storeNameModel.getStoreNameByExample(storeNameExample);
+
+        Store storeCn = storeSiteInfoModel.getStoreByStoreIdAndWebSite(storeApply.getStoreId(), WebSiteConstant.MEMBER_DISTRIBUTOR);
+        storeBusinessVO = new StoreBusinessVO();
+        storeBusinessVO.setWebSite(WebSiteConstant.MEMBER_DISTRIBUTOR);
+        storeBusinessVO.setStoreName(storeName != null ? storeName.getStoreName() : "");
+        storeBusinessVO.setOpenTime(storeCn != null ? storeCn.getOpenTime() : null);
+        storeBusinessVO.setStoreGradeId(storeCn != null ? storeCn.getStoreGradeId() : null);
+        storeBusinessVO.setStoreGradeName(storeCn != null ? storeCn.getStoreGradeName() : null);
+        storeBusinessVOList.add(storeBusinessVO);
+
+        vo.setStoreBusinessVOList(storeBusinessVOList);
 
 
         List<Setting> webSiteList = settingModel.getSiteSetting();
+        List<StoreGoodsCateVO> storeGoodsCateVOList = new ArrayList<>();
         for (Setting setting : webSiteList) {
-            bulidStoreGoodsCateVOList(vo, storeApply, webSiteList, setting.getValue());
+            bulidStoreGoodsCateVOList(storeGoodsCateVOList, storeApply, webSiteList, setting.getValue());
         }
+        vo.setStoreGoodsCateVOList(storeGoodsCateVOList);
         return SldResponse.success(vo, logMsg);
     }
 
     /**
      * 构建不同站点经营类目信息
-     * @param vo
+     * @param storeGoodsCateVOList
      * @param storeApply
      * @param webSiteList
      * @param webSite
      */
-    private void bulidStoreGoodsCateVOList(StoreApplyDetailVO vo, StoreApply storeApply, List<Setting> webSiteList, String webSite) {
+    private void bulidStoreGoodsCateVOList(List<StoreGoodsCateVO> storeGoodsCateVOList, StoreApply storeApply, List<Setting> webSiteList, String webSite) {
 
         //获取经营类目信息
         StoreBindCategoryExample storeBindCategoryExample = new StoreBindCategoryExample();
@@ -217,7 +234,6 @@ public class AdminStoreAuditController {
         GoodsCategoryExample goodsCategoryExample = new GoodsCategoryExample();
         List<GoodsCategory> goodsCategoryList = goodsCategoryModel.getGoodsCategoryList(goodsCategoryExample, null);
 
-        List<StoreGoodsCateVO> storeGoodsCateVOList = new ArrayList<>();
         if (!CollectionUtils.isEmpty(storeBindCategoryList)) {
             storeBindCategoryList.forEach(storeBindCategory -> {
                 StoreGoodsCateVO storeGoodsCateVO = new StoreGoodsCateVO(storeBindCategory);
@@ -227,12 +243,6 @@ public class AdminStoreAuditController {
                 storeGoodsCateVO.setGoodsCateName3(goodsCategoryList.stream().filter(goodsCategory -> goodsCategory.getCategoryId().equals(storeBindCategory.getGoodsCategoryId3())).findFirst().map(GoodsCategory::getCategoryName).orElse(""));
                 storeGoodsCateVOList.add(storeGoodsCateVO);
             });
-            if(WebSiteConstant.MEMBER_OVERSEA.equals(webSite)){
-                vo.setStoreGoodsCateVOList(storeGoodsCateVOList);
-            }else {
-                vo.setStoreGoodsCateCnVOList(storeGoodsCateVOList);
-            }
-
         }
     }
 
@@ -264,20 +274,37 @@ public class AdminStoreAuditController {
             Store store = storeModel.getStoreByStoreId(storeApply.getStoreId());
             vo.setOpenTime(store.getOpenTime());
 
-            StoreSiteInfoExample storeSiteInfoExample =new StoreSiteInfoExample();
-            storeSiteInfoExample.setStoreId(storeApply.getStoreId());
-            storeSiteInfoExample.setWebSite(WebSiteConstant.MEMBER_DISTRIBUTOR);
-            StoreSiteInfo storeSiteInfo = storeSiteInfoModel.getStoreSiteInfo(storeSiteInfoExample);
-            if (storeSiteInfo != null) {
-                vo.setStoreGradeIdCn(storeSiteInfo.getStoreGradeId());
-                vo.setStoreGradeNameCn(storeSiteInfo.getStoreGradeName());
-                vo.setOpenTimeCn(storeSiteInfo.getOpenTime());
-            }
+            List<StoreBusinessVO> storeBusinessVOList = new ArrayList<>();
+            StoreBusinessVO storeBusinessVO = new StoreBusinessVO();
+            storeBusinessVO.setWebSite(WebSiteConstant.MEMBER_OVERSEA);
+            storeBusinessVO.setStoreName(vo.getStoreName());
+            storeBusinessVO.setOpenTime(vo.getOpenTime());
+            storeBusinessVO.setStoreGradeId(vo.getStoreGradeId());
+            storeBusinessVO.setStoreGradeName(vo.getStoreGradeName());
+            storeBusinessVOList.add(storeBusinessVO);
+
+            StoreNameExample storeNameExample = new StoreNameExample();
+            storeNameExample.setStoreId(storeApply.getStoreId());
+            storeNameExample.setWebSite(WebSiteConstant.MEMBER_DISTRIBUTOR);
+            StoreName storeName = storeNameModel.getStoreNameByExample(storeNameExample);
+
+            Store storeCn = storeSiteInfoModel.getStoreByStoreIdAndWebSite(storeApply.getStoreId(), WebSiteConstant.MEMBER_DISTRIBUTOR);
+            storeBusinessVO = new StoreBusinessVO();
+            storeBusinessVO.setWebSite(WebSiteConstant.MEMBER_DISTRIBUTOR);
+            storeBusinessVO.setStoreName(storeName != null ? storeName.getStoreName() : "");
+            storeBusinessVO.setOpenTime(storeCn != null ? storeCn.getOpenTime() : null);
+            storeBusinessVO.setStoreGradeId(storeCn != null ? storeCn.getStoreGradeId() : null);
+            storeBusinessVO.setStoreGradeName(storeCn != null ? storeCn.getStoreGradeName() : null);
+            storeBusinessVOList.add(storeBusinessVO);
+
+            vo.setStoreBusinessVOList(storeBusinessVOList);
 
             List<Setting> webSiteList = settingModel.getSiteSetting();
+            List<StoreGoodsCateVO> storeGoodsCateVOList = new ArrayList<>();
             for (Setting setting : webSiteList) {
-                bulidStoreGoodsCateVOList(vo, storeApply, webSiteList, setting.getValue());
+                bulidStoreGoodsCateVOList(storeGoodsCateVOList, storeApply, webSiteList, setting.getValue());
             }
+            vo.setStoreGoodsCateVOList(storeGoodsCateVOList);
         }
 
         return SldResponse.success(vos);
@@ -299,22 +326,15 @@ public class AdminStoreAuditController {
     })
     @PostMapping("audit")
     public JsonResult<Object> audit(HttpServletRequest request,
-                                    @RequestParam("applyId") Integer applyId,
-                                    @RequestParam("isPass") Boolean isPass,
-                                    @RequestParam(value = "refuseReason", required = false) String refuseReason,
-                                    @RequestParam(value = "remark", required = false) String remark,
-                                    @RequestParam(value = "scalingBindIds", required = false) String scalingBindIds,
-                                    @RequestParam(value = "storeGradeId", required = false) Integer storeGradeId,
-                                    @RequestParam(value = "storeGradeIdCn", required = false) Integer storeGradeIdCn,
-                                    @RequestParam(value = "openTime", required = false) Integer openTime,
-                                    @RequestParam(value = "openTimeCn", required = false) Integer openTimeCn) {
+                                    @RequestBody StoreApplyAuditDTO storeApplyAuditDTO)
+                                    {
 
         Admin admin = UserUtil.getUser(request, Admin.class);
 
-        AssertUtil.isTrue(!isPass && StringUtils.isEmpty(refuseReason), "请填写审核拒绝原因");
+        AssertUtil.isTrue(!storeApplyAuditDTO.getIsPass() && StringUtils.isEmpty(storeApplyAuditDTO.getRefuseReason()), "请填写审核拒绝原因");
 //        AssertUtil.isTrue(isPass && StringUtils.isEmpty(scalingBindIds), "请填写分佣比例");
 
-        StoreApply storeApply = storeApplyModel.audit(applyId, isPass, refuseReason, remark, scalingBindIds, admin);
+        StoreApply storeApply = storeApplyModel.audit(storeApplyAuditDTO.getApplyId(), storeApplyAuditDTO.getIsPass(), storeApplyAuditDTO.getRefuseReason(), storeApplyAuditDTO.getRemark(), storeApplyAuditDTO.getScalingBindIds(), admin);
 
 //        //根据gradeId查询store_grade表
 //        StoreGrade storeGrade = storeGradeModel.getStoreGradeByGradeId(storeApply.getStoreGradeId());
@@ -347,21 +367,36 @@ public class AdminStoreAuditController {
 //            }
 //            vo.setStoreGoodsCateVOList(storeGoodsCateVOList);
 //        }
-        if (isPass) {
-            // 店铺审核增加开店时长
-            if (!StringUtil.isNullOrZero(openTime) && !StringUtil.isNullOrZero(openTimeCn)) {
-                storeApply.setApplyYear(openTime);
-                storeApply.setApplyYearCn(openTimeCn);
-            }else{
-                throw new MallException("请选择开店时长");
+        if (storeApplyAuditDTO.getIsPass()) {
+            if (CollectionUtils.isEmpty(storeApplyAuditDTO.getStoreBusinessVOList())){
+                throw new MallException("请选择经营信息");
             }
-            if (!StringUtil.isNullOrZero(storeGradeId) && !StringUtil.isNullOrZero(storeGradeIdCn)){
-                storeApply.setStoreGradeId(storeGradeId);
-                storeApply.setStoreGradeIdCn(storeGradeIdCn);
-            }else{
-                throw new MallException("请选择店铺等级");
+            // 扩展站点可重新设计
+            for (StoreBusinessVO storeBusinessVO : storeApplyAuditDTO.getStoreBusinessVOList()){
+                if(WebSiteConstant.MEMBER_OVERSEA.equals(storeBusinessVO.getWebSite())){
+                    if (!StringUtil.isNullOrZero(storeBusinessVO.getOpenTime())){
+                        storeApply.setApplyYear(storeBusinessVO.getOpenTime());
+                    }else {
+                        throw new MallException("请选择开店时长");
+                    }
+                    if (!StringUtil.isNullOrZero(storeBusinessVO.getStoreGradeId())){
+                        storeApply.setStoreGradeId(storeBusinessVO.getStoreGradeId());
+                    }else {
+                        throw new MallException("请选择店铺等级");
+                    }
+                }else if (WebSiteConstant.MEMBER_DISTRIBUTOR.equals(storeBusinessVO.getWebSite())) {
+                    if (!StringUtil.isNullOrZero(storeBusinessVO.getOpenTime())){
+                        storeApply.setApplyYearCn(storeBusinessVO.getOpenTime());
+                    }else {
+                        throw new MallException("请选择开店时长");
+                    }
+                    if (!StringUtil.isNullOrZero(storeBusinessVO.getStoreGradeId())){
+                        storeApply.setStoreGradeIdCn(storeBusinessVO.getStoreGradeId());
+                    }else {
+                        throw new MallException("请选择店铺等级");
+                    }
+                }
             }
-
             //todo 因业务需要暂不用此功能
 //            if (storeApply.getPayAmount().compareTo(BigDecimal.ZERO) == 0) {
             storeModel.openStore(storeApply);
@@ -385,18 +420,11 @@ public class AdminStoreAuditController {
             @ApiImplicitParam(name = "remark", value = "备注,拒绝时选填"),
             @ApiImplicitParam(name = "scalingBindIds", value = "分佣比例,审核通过时必填,例:bindId1-scaling1,bindId2-scaling2,..."),
             @ApiImplicitParam(name = "openTime", value = "开店时长"),
-            @ApiImplicitParam(name = "openTimeCn", value = "国内店铺开店时长"),
     })
     @PostMapping("batchAudit")
-    public JsonResult<Object> batchAudit(HttpServletRequest request,
-                                         @RequestParam("applyIds") String applyIds,
-                                         @RequestParam("isPass") Boolean isPass,
-                                         @RequestParam(value = "refuseReason", required = false) String refuseReason,
-                                         @RequestParam(value = "remark", required = false) String remark,
-                                         @RequestParam(value = "scalingBindIds", required = false) String scalingBindIds,
-                                         @RequestParam(value = "openTime", required = false) Integer openTime,
-                                         @RequestParam(value = "openTimeCn", required = false) Integer openTimeCn) {
+    public JsonResult<Object> batchAudit(HttpServletRequest request,@RequestBody StoreApplyAuditDTO storeApplyAuditDTO) {
         //参数校验
+        String applyIds = storeApplyAuditDTO.getApplyIds();
         AssertUtil.notEmpty(applyIds, "绑定id不能为空");
         AssertUtil.notFormatFrontIds(applyIds, "applyIds格式错误,请重试");
         Admin admin = UserUtil.getUser(request, Admin.class);
@@ -407,6 +435,11 @@ public class AdminStoreAuditController {
         int total = 0;
         RegisterPayVO vo = null;
         ApplyRefuseVO applyRefuseVO = null;
+        Boolean isPass = storeApplyAuditDTO.getIsPass();
+        String refuseReason = storeApplyAuditDTO.getRefuseReason();
+        String remark = storeApplyAuditDTO.getRemark();
+        String scalingBindIds = storeApplyAuditDTO.getScalingBindIds();
+        Integer openTime = storeApplyAuditDTO.getOpenTime();
         for (Integer applyId : array) {
 
             AssertUtil.isTrue(!isPass && StringUtils.isEmpty(refuseReason), "请填写审核拒绝原因");
@@ -448,9 +481,9 @@ public class AdminStoreAuditController {
 
             if (isPass) {
                 // 店铺审核增加开店时长
-                if (!StringUtil.isNullOrZero(openTime) && !StringUtil.isNullOrZero(openTimeCn)) {
+                if (!StringUtil.isNullOrZero(openTime)) {
                     storeApply.setApplyYear(openTime);
-                    storeApply.setApplyYearCn(openTimeCn);
+                    storeApply.setApplyYearCn(openTime);
                 }else{
                     throw new MallException("请选择开店时长");
                 }

+ 25 - 16
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/seller/admin/AdminStoreController.java

@@ -25,6 +25,7 @@ import com.slodon.b2b2c.seller.example.*;
 import com.slodon.b2b2c.seller.pojo.*;
 import com.slodon.b2b2c.system.pojo.Admin;
 import com.slodon.b2b2c.system.pojo.Setting;
+import com.slodon.b2b2c.seller.dto.StoreBusinessVO;
 import com.slodon.b2b2c.vo.seller.StoreDetailVO;
 import com.slodon.b2b2c.vo.seller.StoreGoodsCateVO;
 import com.slodon.b2b2c.vo.seller.StoreVO;
@@ -171,16 +172,29 @@ public class AdminStoreController extends BaseController {
         }
         StoreDetailVO vo = new StoreDetailVO(store, storeCertificate);
 
+        List<StoreBusinessVO> storeBusinessVOList = new ArrayList<>();
+        StoreBusinessVO storeBusinessVO = new StoreBusinessVO();
+        storeBusinessVO.setWebSite(WebSiteConstant.MEMBER_OVERSEA);
+        storeBusinessVO.setStoreName(vo.getStoreName());
+        storeBusinessVO.setOpenTime(vo.getOpenTime());
+        storeBusinessVO.setStoreGradeId(vo.getStoreGradeId());
+        storeBusinessVO.setStoreGradeName(vo.getStoreGradeName());
+        storeBusinessVOList.add(storeBusinessVO);
+
         StoreNameExample storeNameExample = new StoreNameExample();
         storeNameExample.setStoreId(storeId);
         storeNameExample.setWebSite(WebSiteConstant.MEMBER_DISTRIBUTOR);
         StoreName storeName = storeNameModel.getStoreNameByExample(storeNameExample);
-        vo.setStoreNameCn(storeName.getStoreName());
-
         Store storeCn = storeSiteInfoModel.getStoreByStoreIdAndWebSite(storeId, WebSiteConstant.MEMBER_DISTRIBUTOR);
-        vo.setStoreGradeId(storeCn.getStoreGradeId());
-        vo.setStoreGradeName(storeCn.getStoreGradeName());
-        vo.setOpenTimeCn(storeCn.getOpenTime());
+        storeBusinessVO = new StoreBusinessVO();
+        storeBusinessVO.setWebSite(WebSiteConstant.MEMBER_DISTRIBUTOR);
+        storeBusinessVO.setStoreName(storeName != null ? storeName.getStoreName() : "");
+        storeBusinessVO.setOpenTime(storeCn != null ? storeCn.getOpenTime() : null);
+        storeBusinessVO.setStoreGradeId(storeCn != null ? storeCn.getStoreGradeId() : null);
+        storeBusinessVO.setStoreGradeName(storeCn != null ? storeCn.getStoreGradeName() : null);
+        storeBusinessVOList.add(storeBusinessVO);
+
+        vo.setStoreBusinessVOList(storeBusinessVOList);
 
         //获取应付金额
         vo.setPayAmount(storeApply.getPayAmount());
@@ -191,9 +205,11 @@ public class AdminStoreController extends BaseController {
 
         List<Setting> webSiteList = settingModel.getSiteSetting();
 
-        for (Setting setting : webSiteList){
-            bulidStoreGoodsCateVOList(vo,storeApply,webSiteList,setting.getValue());
+        List<StoreGoodsCateVO> storeGoodsCateVOList = new ArrayList<>();
+        for (Setting setting : webSiteList) {
+            bulidStoreGoodsCateVOList(storeGoodsCateVOList, storeApply, webSiteList, setting.getValue());
         }
+        vo.setStoreGoodsCateVOList(storeGoodsCateVOList);
 
         //获取结算周期
         if (!StringUtils.isEmpty(store.getBillType()) && !StringUtils.isEmpty(store.getBillDay())) {
@@ -242,7 +258,7 @@ public class AdminStoreController extends BaseController {
         return SldResponse.success(vo);
     }
 
-    private void bulidStoreGoodsCateVOList(StoreDetailVO vo,StoreApply storeApply, List<Setting> webSiteList, String webSite) {
+    private void bulidStoreGoodsCateVOList(List<StoreGoodsCateVO> storeGoodsCateVOList,StoreApply storeApply, List<Setting> webSiteList, String webSite) {
 
         //获取经营类目信息
         StoreBindCategoryExample storeBindCategoryExample = new StoreBindCategoryExample();
@@ -255,7 +271,6 @@ public class AdminStoreController extends BaseController {
         GoodsCategoryExample goodsCategoryExample = new GoodsCategoryExample();
         List<GoodsCategory> goodsCategoryList = goodsCategoryModel.getGoodsCategoryList(goodsCategoryExample, null);
 
-        List<StoreGoodsCateVO> storeGoodsCateVOList = new ArrayList<>();
         if (!CollectionUtils.isEmpty(storeBindCategoryList)) {
             storeBindCategoryList.forEach(storeBindCategory -> {
                 StoreGoodsCateVO storeGoodsCateVO = new StoreGoodsCateVO(storeBindCategory);
@@ -265,19 +280,13 @@ public class AdminStoreController extends BaseController {
                 storeGoodsCateVO.setGoodsCateName3(goodsCategoryList.stream().filter(goodsCategory -> goodsCategory.getCategoryId().equals(storeBindCategory.getGoodsCategoryId3())).findFirst().map(GoodsCategory::getCategoryName).orElse(""));
                 storeGoodsCateVOList.add(storeGoodsCateVO);
             });
-            if(WebSiteConstant.MEMBER_OVERSEA.equals(webSite)){
-                vo.setStoreGoodsCateVOList(storeGoodsCateVOList);
-            }else {
-                vo.setStoreGoodsCateCnVOList(storeGoodsCateVOList);
-            }
-
         }
     }
 
     @ApiOperation("编辑店铺详情信息")
     @OperationLogger(option = "编辑店铺详情信息")
     @PostMapping("edit")
-    public JsonResult<Object> editStore(HttpServletRequest request, StoreUpdateDTO storeUpdateDTO) {
+    public JsonResult<Object> editStore(HttpServletRequest request, @RequestBody StoreUpdateDTO storeUpdateDTO) {
         String logMsg = "店铺id" + storeUpdateDTO.getStoreId();
         storeModel.editStoreInfo(request,storeUpdateDTO);
         return SldResponse.success("编辑成功", logMsg);

+ 1 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/seller/seller/SellerRolesController.java

@@ -188,6 +188,7 @@ public class SellerRolesController extends BaseController {
         //角色是否绑定账号,如果绑定则不能删除
         VendorExample vendorExample = new VendorExample();
         vendorExample.setRolesId(rolesId);
+        vendorExample.setIsAllowLoginNotEquals(VendorConst.LOGOUT_ALLOW_LOGIN);
         List<Vendor> vendorList = vendorModel.getVendorList(vendorExample, null);
         AssertUtil.isTrue(!CollectionUtils.isEmpty(vendorList), "该权限组绑定了账号,不能删除");
 

+ 4 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/seller/seller/SellerVendorController.java

@@ -243,17 +243,20 @@ public class SellerVendorController extends BaseController {
         //根据手机号查询数据库
         VendorExample vendorExample = new VendorExample();
         vendorExample.setVendorMobile(mobile);
+        vendorExample.setIsAllowLoginNotEquals(VendorConst.LOGOUT_ALLOW_LOGIN);
         List<Vendor> vendorList = vendorModel.getVendorList(vendorExample, null);
         AssertUtil.isTrue(CollectionUtils.isEmpty(vendorList), "对不起,该手机号未注册");
 
         VendorExample vendorNameExample = new VendorExample();
         vendorNameExample.setVendorName(vendorName);
+        vendorExample.setIsAllowLoginNotEquals(VendorConst.LOGOUT_ALLOW_LOGIN);
         List<Vendor> vendorNameList = vendorModel.getVendorList(vendorNameExample, null);
         AssertUtil.isTrue(CollectionUtils.isEmpty(vendorNameList), "对不起,该商家账户未注册");
 
         VendorExample allVendorExample = new VendorExample();
         allVendorExample.setVendorMobile(mobile);
         allVendorExample.setVendorName(vendorName);
+        vendorExample.setIsAllowLoginNotEquals(VendorConst.LOGOUT_ALLOW_LOGIN);
         List<Vendor> allVendorList = vendorModel.getVendorList(allVendorExample, null);
         AssertUtil.isTrue(CollectionUtils.isEmpty(allVendorList), "对不起,该商家账户和手机号不匹配");
 
@@ -335,6 +338,7 @@ public class SellerVendorController extends BaseController {
         //查询该手机号是否已注册过
         VendorExample example = new VendorExample();
         example.setVendorMobile(vendorRegisterDTO.getVendorMobile());
+        example.setIsAllowLoginNotEquals(VendorConst.LOGOUT_ALLOW_LOGIN);
         List<Vendor> vendorList = vendorModel.getVendorList(example, null);
 
         AssertUtil.isTrue(!CollectionUtils.isEmpty(vendorList), "此手机号已绑定商家账号");

+ 1 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/sso/seller/SellerAuthController.java

@@ -95,6 +95,7 @@ public class SellerAuthController {
             // 登录验证
             VendorExample vendorExample = new VendorExample();
             vendorExample.setVendorName(username);
+            vendorExample.setIsAllowLoginNotEquals(VendorConst.LOGOUT_ALLOW_LOGIN);
             List<Vendor> vendorList = vendorModel.getVendorList(vendorExample, null);
             if (CollectionUtils.isEmpty(vendorList)) {
                 // 检测gp系统用户是否存在

+ 27 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dto/StoreApplyAuditDTO.java

@@ -0,0 +1,27 @@
+package com.slodon.b2b2c.dto;
+
+import com.slodon.b2b2c.seller.dto.StoreBusinessVO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.List;
+
+@Data
+public class StoreApplyAuditDTO {
+    @ApiModelProperty("申请id")
+    private Integer applyId;
+    @ApiModelProperty("申请集合")
+    private String applyIds;
+    @ApiModelProperty("是否通过[true==通过,false==驳回]")
+    private Boolean isPass;
+    @ApiModelProperty("审核原因,驳回时必填")
+    private String refuseReason;
+    @ApiModelProperty("备注,拒绝时选填")
+    private String remark;
+    @ApiModelProperty("分佣比例,审核通过时必填,例:bindId1-scaling1,bindId2-scaling2,...")
+    private String scalingBindIds;
+    @ApiModelProperty("开店时长")
+    private Integer openTime;
+    @ApiModelProperty("经营信息")
+    private List<StoreBusinessVO> storeBusinessVOList;
+
+}

+ 5 - 4
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/MemberModel.java

@@ -91,10 +91,11 @@ public class MemberModel {
         List<Member> list = memberReadMapper.listByExample(example);
         AssertUtil.isTrue(!CollectionUtils.isEmpty(list), "会员名称重复,请重新填写");
 
-//        example.setMemberName(null);
-//        example.setMemberMobile(memberAddDTO.getMemberMobile());
-//        List<Member> mobileList = memberReadMapper.listByExample(example);
-//        AssertUtil.isTrue(!CollectionUtils.isEmpty(mobileList), "该手机号已经绑定会员");
+        example.setMemberName(null);
+        example.setWebSite(memberAddDTO.getWebSite());
+        example.setMemberMobile(memberAddDTO.getMemberMobile());
+        List<Member> mobileList = memberReadMapper.listByExample(example);
+        AssertUtil.isTrue(!CollectionUtils.isEmpty(mobileList), "该手机号已经绑定会员");
 
         //新增
         Member insertOne = new Member();

+ 33 - 30
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/seller/StoreModel.java

@@ -778,37 +778,40 @@ public class StoreModel {
             throw new MallException("更新店铺表失败,请重试");
         }
 
-        //修改store_site_info表
-        StoreSiteInfo storeSiteInfoUpdate = new StoreSiteInfo() ;
-        if (!StringUtils.isEmpty(storeUpdateDTO.getStoreGradeIdCn())) {
-            //店铺等级id
-            storeSiteInfoUpdate.setStoreGradeId(storeUpdateDTO.getStoreGradeIdCn());
-            //根据storeGradeId获取等级名称
-            StoreGrade storeGrade = storeGradeReadMapper.getByPrimaryKey(storeUpdateDTO.getStoreGradeId());
-            storeSiteInfoUpdate.setStoreGradeName(storeGrade.getGradeName());
-        }
-
-        if (!StringUtil.isNullOrZero(storeUpdateDTO.getOpenTimeCn())) {
-            //开店时长
-            storeSiteInfoUpdate.setOpenTime(storeUpdateDTO.getOpenTimeCn());
-            //店铺到期时间
-            Calendar calendar = Calendar.getInstance();
-            calendar.setTime(storeDB.getCreateTime());
-            calendar.add(Calendar.YEAR, storeUpdateDTO.getOpenTimeCn());
-            storeSiteInfoUpdate.setStoreExpireTime(calendar.getTime());
-        }
-        Admin admin = UserUtil.getUser(request, Admin.class);
-        storeSiteInfoUpdate.setUpdateId(admin.getAdminId().longValue());
-        storeSiteInfoUpdate.setUpdateTime(new Date());
-        StoreSiteInfoExample storeSiteInfoExample = new StoreSiteInfoExample();
-        storeSiteInfoExample.setStoreId(storeUpdateDTO.getStoreId());
-        storeSiteInfoExample.setWebSite(WebSiteConstant.MEMBER_DISTRIBUTOR);
-        count = storeSiteInfoWriteMapper.updateByExampleSelective(storeSiteInfoUpdate, storeSiteInfoExample);
-        if (count == 0) {
-            log.error("根据storeId:" + storeSiteInfoUpdate.getStoreId() + "更新店铺表国内站失败");
-            throw new MallException("更新店铺表国内站失败,请重试");
+        if (!CollectionUtils.isEmpty(storeUpdateDTO.getStoreBusinessVOList())) {
+            for (StoreBusinessVO storeBusinessVO : storeUpdateDTO.getStoreBusinessVOList()) {
+                if (!WebSiteConstant.MEMBER_OVERSEA.equals(storeBusinessVO.getWebSite())) {
+                    //修改store_site_info表
+                    StoreSiteInfo storeSiteInfoUpdate = new StoreSiteInfo();
+                    //店铺等级id
+                    storeSiteInfoUpdate.setStoreGradeId(storeBusinessVO.getStoreGradeId());
+                    //根据storeGradeId获取等级名称
+                    StoreGrade storeGrade = storeGradeReadMapper.getByPrimaryKey(storeUpdateDTO.getStoreGradeId());
+                    storeSiteInfoUpdate.setStoreGradeName(storeGrade.getGradeName());
+
+
+                    //开店时长
+                    storeSiteInfoUpdate.setOpenTime(storeBusinessVO.getOpenTime());
+                    //店铺到期时间
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(storeDB.getCreateTime());
+                    calendar.add(Calendar.YEAR, storeBusinessVO.getOpenTime());
+                    storeSiteInfoUpdate.setStoreExpireTime(calendar.getTime());
+
+                    Admin admin = UserUtil.getUser(request, Admin.class);
+                    storeSiteInfoUpdate.setUpdateId(admin.getAdminId().longValue());
+                    storeSiteInfoUpdate.setUpdateTime(new Date());
+                    StoreSiteInfoExample storeSiteInfoExample = new StoreSiteInfoExample();
+                    storeSiteInfoExample.setStoreId(storeUpdateDTO.getStoreId());
+                    storeSiteInfoExample.setWebSite(WebSiteConstant.MEMBER_DISTRIBUTOR);
+                    count = storeSiteInfoWriteMapper.updateByExampleSelective(storeSiteInfoUpdate, storeSiteInfoExample);
+                    if (count == 0) {
+                        log.error("根据storeId:" + storeSiteInfoUpdate.getStoreId() + "更新店铺表国内站失败");
+                        throw new MallException("更新店铺表国内站失败,请重试");
+                    }
+                }
+            }
         }
-
         //修改store_apply表
         StoreApply storeApplyUpdate = new StoreApply();
         boolean isUpdate = false;

+ 4 - 2
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/seller/StoreNameModel.java

@@ -8,6 +8,7 @@ import com.slodon.b2b2c.dao.write.seller.StoreNameWriteMapper;
 import com.slodon.b2b2c.seller.example.StoreNameExample;
 import com.slodon.b2b2c.seller.pojo.StoreName;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -34,7 +35,8 @@ public class StoreNameModel {
         return storeNameList;
     }
 
-    public StoreName getStoreNameByExample(StoreNameExample storeNameExample) {
-        return storeNameReadMapper.listByExample(storeNameExample).get(0);
+    public StoreName getStoreNameByExample(StoreNameExample example) {
+        List<StoreName> storeNameList = storeNameReadMapper.listByExample(example);
+        return CollectionUtils.isEmpty(storeNameList) ? null : storeNameList.get(0);
     }
 }

+ 2 - 5
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/seller/StoreSiteInfoModel.java

@@ -40,11 +40,8 @@ public class StoreSiteInfoModel {
     }
 
     public StoreSiteInfo getStoreSiteInfo(StoreSiteInfoExample example) {
-        List<StoreSiteInfo> storeSiteInfoList =storeSiteInfoReadMapper.listByExample( example);
-        if (CollectionUtils.isEmpty(storeSiteInfoList)) {
-            return null;
-        }
-        return storeSiteInfoReadMapper.listByExample(example).get(0);
+        List<StoreSiteInfo> storeSiteInfoList = storeSiteInfoReadMapper.listByExample(example);
+        return CollectionUtils.isEmpty(storeSiteInfoList) ? null : storeSiteInfoList.get(0);
     }
 
     public List<StoreSiteInfo> getStoreSiteInfoList(StoreSiteInfoExample example, PagerInfo pager) {

+ 4 - 13
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/seller/StoreApplyDetailVO.java

@@ -4,6 +4,7 @@ import com.slodon.b2b2c.core.constant.StoreConst;
 import com.slodon.b2b2c.core.i18n.Language;
 import com.slodon.b2b2c.core.util.CommonUtil;
 import com.slodon.b2b2c.core.util.FileUrlUtil;
+import com.slodon.b2b2c.seller.dto.StoreBusinessVO;
 import com.slodon.b2b2c.seller.pojo.StoreApply;
 import com.slodon.b2b2c.seller.pojo.StoreCertificate;
 import com.slodon.b2b2c.seller.pojo.StoreName;
@@ -24,9 +25,6 @@ public class StoreApplyDetailVO {
     @ApiModelProperty("店铺名称")
     private String storeName;
 
-    @ApiModelProperty("国内店铺名称")
-    private String storeNameCn;
-
     @ApiModelProperty("联系人名称")
     private String contactName;
 
@@ -96,9 +94,6 @@ public class StoreApplyDetailVO {
     @ApiModelProperty("店铺等级id")
     private Integer storeGradeId;
 
-    @ApiModelProperty("国内店铺等级id")
-    private Integer storeGradeIdCn;
-
     @ApiModelProperty("开店时长")
     private Integer applyYear;
 
@@ -111,14 +106,12 @@ public class StoreApplyDetailVO {
     @ApiModelProperty("店铺等级名称")
     private String storeGradeName;
 
-    @ApiModelProperty("国内店铺等级名称")
-    private String storeGradeNameCn;
-
     @ApiModelProperty("开店时长")
     private Integer openTime;
 
-    @ApiModelProperty("开店时长")
-    private Integer openTimeCn;
+    @ApiModelProperty("经营信息集合")
+    private List<StoreBusinessVO> storeBusinessVOList;
+
 
     @ApiModelProperty("拒绝理由")
     private String refuseReason;
@@ -132,8 +125,6 @@ public class StoreApplyDetailVO {
     @ApiModelProperty("经营类目集合")
     private List<StoreGoodsCateVO> storeGoodsCateVOList;
 
-    @ApiModelProperty("国内经营类目集合")
-    private List<StoreGoodsCateVO> storeGoodsCateCnVOList;
 
     public StoreApplyDetailVO(StoreApply storeApply, StoreCertificate storeCertificate) {
         storeName = storeApply.getStoreName();

+ 17 - 15
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/seller/StoreDetailVO.java

@@ -4,6 +4,7 @@ import com.slodon.b2b2c.core.constant.StoreConst;
 import com.slodon.b2b2c.core.i18n.Language;
 import com.slodon.b2b2c.core.util.CommonUtil;
 import com.slodon.b2b2c.core.util.FileUrlUtil;
+import com.slodon.b2b2c.seller.dto.StoreBusinessVO;
 import com.slodon.b2b2c.seller.pojo.Store;
 import com.slodon.b2b2c.seller.pojo.StoreCertificate;
 import io.swagger.annotations.ApiModelProperty;
@@ -29,8 +30,8 @@ public class StoreDetailVO {
     @ApiModelProperty("店铺名称")
     private String storeName;
 
-    @ApiModelProperty("国内店铺名称")
-    private String storeNameCn;
+    @ApiModelProperty("店铺经营信息")
+    private List<StoreBusinessVO> storeBusinessVOList;
 
     @ApiModelProperty("店铺Logo")
     private String storeLogo;
@@ -77,6 +78,10 @@ public class StoreDetailVO {
     @ApiModelProperty("身份证背面扫描件绝对地址")
     private String personCardDownPath;
 
+    @ApiModelProperty("店铺等级集合")
+    private List<StoreGradeVO> storeGradeVOList;
+
+
     @ApiModelProperty("店铺等级id")
     private Integer storeGradeId;
 
@@ -85,16 +90,16 @@ public class StoreDetailVO {
 
     @ApiModelProperty("店铺等级名称")
     private String storeGradeName;
-
-
-    @ApiModelProperty("国内店铺等级id")
-    private Integer storeGradeIdCn;
-
-    @ApiModelProperty("国内开店时长")
-    private Integer openTimeCn;
-
-    @ApiModelProperty("国内店铺等级名称")
-    private String storeGradeNameCn;
+//
+//
+//    @ApiModelProperty("国内店铺等级id")
+//    private Integer storeGradeIdCn;
+//
+//    @ApiModelProperty("国内开店时长")
+//    private Integer openTimeCn;
+//
+//    @ApiModelProperty("国内店铺等级名称")
+//    private String storeGradeNameCn;
 
     @ApiModelProperty("应付金额")
     private BigDecimal payAmount;
@@ -135,9 +140,6 @@ public class StoreDetailVO {
     @ApiModelProperty("经营类目集合")
     private List<StoreGoodsCateVO> storeGoodsCateVOList;
 
-    @ApiModelProperty("国内经营类目集合")
-    private List<StoreGoodsCateVO> storeGoodsCateCnVOList;
-
     @ApiModelProperty("结算周期")
     private String billCycle;
 

+ 1 - 0
xinkeaboard-web/assets/language/en.js

@@ -826,6 +826,7 @@ export const lang_en = {
         '验证码已发送': 'The verification code has been sent',
         '校验不通过': 'The verification fails',
         '注册成功': 'Registration Successful',
+        '我们将向您的手机号发送验证码,该手机号将用作登录用户名': 'We will send a verification code to your phone, which will be used as your login username',
         '我们将向您的邮箱发送验证码,该邮件将用作登录用户名': 'We will send a verification code to your email address, which will be used as your login username',
         '请确认密码': 'Please confirm the password',
         '两次输入的密码不一致': 'The passwords entered twice are inconsistent',

+ 1 - 0
xinkeaboard-web/assets/language/zh.js

@@ -853,6 +853,7 @@ export const lang_zn = {
       '验证码已发送': '验证码已发送',
       '校验不通过': '校验不通过',
       '注册成功': '注册成功',
+      '我们将向您的手机号发送验证码,该手机号将用作登录用户名': '我们将向您的手机号发送验证码,该手机号将用作登录用户名',
       '我们将向您的邮箱发送验证码,该邮件将用作登录用户名': '我们将向您的邮箱发送验证码,该邮件将用作登录用户名',
       '请确认密码': '请确认密码',
       '两次输入的密码不一致': '两次输入的密码不一致',

+ 9 - 4
xinkeaboard-web/assets/style/member/collect.scss

@@ -376,7 +376,7 @@ i {
 
             .sld_vendor_item {
                 width: 100%;
-                height: 300px;
+                height: 320px;
                 margin-top: 10px;
                 background-color: #fff;
                 border: 1px solid #eeeeee;
@@ -384,7 +384,7 @@ i {
                 .sld_vendor {
                     position: relative;
                     width: 25%;
-                    height: 298px;
+                    height: 100%;
                     padding: 46px 60px 0 60px;
                     box-sizing: border-box;
                     border-right: 1px solid #eee;
@@ -470,9 +470,12 @@ i {
                 }
 
                 .main_lbbox {
+                    display: flex;
+                    flex-direction: column;
+                    height: 100%;
                     position: relative;
                     width: 75%;
-                    height: 298px;
+                    // height: 298px;
 
                     overflow: hidden;
 
@@ -505,6 +508,8 @@ i {
                     }
 
                     .sld_vendor_goods {
+                        flex: 1;
+                        height: 100%;
                         position: relative;
                         padding: 0 48px;
                         overflow: hidden;
@@ -572,7 +577,7 @@ i {
 
                         .slide_wrap {
                             width: 100%;
-                            height: 213px;
+                            // height: 213px;
                             overflow: hidden;
 
                             .bd {

+ 387 - 0
xinkeaboard-web/components/register-distributor/RegistPhone.vue

@@ -0,0 +1,387 @@
+<template>
+  <div class="center">
+    <p style="width: 296px">
+      {{ L["register"]["我们将向您的手机号发送验证码,该手机号将用作登录用户名"] }}
+    </p>
+    <div class="item account">
+      <span
+        style="color: #bbb; font-size: 19px; padding-top: 7px"
+        class="icon iconfont icon-wode"
+      ></span>
+      <input
+        type="text"
+        v-model="email"
+        :placeholder="L['请输入邮箱']"
+        class="input"
+        autocomplete="off"
+      />
+      <div data-type="userName" class="cancel" @click="clearInputVal">
+        <span style="color: #bbb" class="iconfont icon-cuowu"></span>
+      </div>
+    </div>
+    <div class="error" v-if="emailErrorMsg">
+      <span
+        style="color: #e1251b; font-size: 14px"
+        class="iconfont icon-jubao"
+      ></span>
+      {{ emailErrorMsg }}
+    </div>
+    <!-- 邮箱验证码 -->
+    <div class="verify-code">
+      <span class="verify-code-icon">
+        <img src="/register/mail_success.png" alt="" />
+      </span>
+      <input
+        type="text"
+        v-model="emailCode"
+        :placeholder="L['请输入验证码']"
+        class="input"
+        autocomplete="off"
+      />
+      <span class="verify-code-accept">
+        <el-button
+          @click="showHMVerify"
+          :disabled="countDownNumer"
+          :loading="getVerifyCodeLoading"
+        >
+          <span>{{ codeText }}</span>
+          <span v-if="countDownNumer">{{ `(${countDownNumer})` }}</span>
+        </el-button>
+      </span>
+    </div>
+    <div class="error" v-if="emailCodeErrorMsg">
+      <span
+        style="color: #e1251b; font-size: 14px"
+        class="iconfont icon-jubao"
+      ></span>
+      {{ emailCodeErrorMsg }}
+    </div>
+    <el-button
+      @click="next"
+      :class="{ submit: true, disabled: nextDisabled }"
+      :disabled="nextDisabled"
+      :loading="nextActionLoading"
+      >{{ L["下一步"] }}</el-button
+    >
+    <el-dialog
+      :title="L['register']['滑动验证']"
+      destroy-on-close
+      width="500px"
+      center
+      modal-class="register-verify-model"
+      v-model="modalVisible"
+    >
+      <SliderVerify
+        :slideVerifyOptions="{ show: false, w: 450, h: 220 }"
+        @onSuccess="verifySuccess"
+        @onFail="verifyFail"
+      />
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { getCurLanguage } from "@/composables/common.js";
+import { showMessage, startCountdown } from "@/utils/common";
+
+const emits = defineEmits(["success"]);
+
+const L = getCurLanguage();
+
+const emailCalc = ref();
+const email = ref(""); //邮箱
+const emailCode = ref(""); // 邮箱验证码
+const emailErrorMsg = ref(); //错误提示
+const emailCodeErrorMsg = ref(); //验证码错误提示
+
+// 人机验证弹窗显示标识
+const modalVisible = ref(false);
+
+// 重新获取验证码标识
+const isReacquireCode = ref(false);
+
+const getVerifyCodeLoading = ref(false);
+
+const nextActionLoading = ref(false);
+
+// 倒计时展示
+const countDownNumer = ref(0);
+
+// 获取验证码的文案
+const codeText = computed(() => {
+  return isReacquireCode.value
+    ? L["register"]["重新获取"]
+    : L["register"]["获取验证码"];
+});
+
+// 注册邮箱时按钮置灰状态
+const nextDisabled = computed(() => !email.value || !emailCode.value);
+
+//开启人机校验
+const showHMVerify = () => {
+  // 校验邮箱非空以及格式
+  if (!validateEmail()) return;
+  modalVisible.value = true;
+};
+
+// 获取验证码
+const getVerifyCode = () => {
+  getVerifyCodeLoading.value = true;
+  post("v3/member/front/active/verification/code", {
+    email: email.value,
+    source: 1,
+    type: 1,
+  })
+    .then((res) => {
+      if (res.state === 200) {
+        showMessage({
+          message: L["register"]["验证码已发送"],
+          type: "success",
+        });
+        // 设置倒计时
+        startCountdown(60, (time) => (countDownNumer.value = time));
+        isReacquireCode.value = true;
+      } else {
+        showMessage({
+          message: res.msg,
+          type: "warning",
+        });
+      }
+    })
+    .finally(() => {
+      getVerifyCodeLoading.value = false;
+    });
+};
+
+// 人机验证成功
+const verifySuccess = () => {
+  modalVisible.value = false;
+  getVerifyCode();
+};
+
+// 人机校验失败
+const verifyFail = () => {
+  showMessage({
+    message: L["register"]["校验不通过"],
+    type: "warning",
+  });
+};
+
+// 校验邮箱
+const validateEmail = () => {
+  //邮箱非空的验证
+  if (!email.value) {
+    emailErrorMsg.value = L["请输入邮箱"];
+    return false;
+  }
+
+  // 邮箱格式验证
+  emailCalc.value = checkEmail(email.value);
+  if (emailCalc.value !== true) {
+    emailErrorMsg.value = emailCalc.value;
+    return false;
+  }
+  emailErrorMsg.value = "";
+
+  return true;
+};
+
+// 邮箱验证码验证
+const validateEmailCode = () => {
+  if (!emailCode.value) {
+    emailCodeErrorMsg.value = L["register"]["请输入邮箱验证码"];
+    return false;
+  }
+  emailCodeErrorMsg.value = "";
+
+  return true;
+};
+
+const next = () => {
+  if (!validateEmail() || !validateEmailCode()) return;
+  nextActionLoading.value = true;
+  post("v3/member/front/active/check/verification/code", {
+    email: email.value,
+    type: 1,
+    verificationCode: emailCode.value,
+  })
+    .then((res) => {
+      if (res.state == 200) {
+        // showMessage({
+        //   message: L["register"]["注册成功"],
+        //   type: "success",
+        // });
+        //成功提示,并返回到登录页面
+        emits("success", email.value);
+      } else {
+        //提示错误
+        showMessage({
+          message: res.msg,
+          type: "warning",
+        });
+      }
+    })
+    .finally(() => {
+      nextActionLoading.value = false;
+    });
+};
+
+//清空输入框内容
+const clearInputVal = (type) => {
+  email.value = "";
+};
+</script>
+<style lang="scss">
+.register-verify-model {
+  .el-dialog__title {
+    font-weight: 900 !important;
+  }
+
+  .el-dialog__body {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+  }
+}
+</style>
+<style lang="scss" scoped>
+.center {
+  padding: 30px 30px 40px;
+
+  .item {
+    position: relative;
+    margin-top: 15px;
+    border-radius: 2px;
+
+    &:first-child {
+      margin-top: 0;
+    }
+
+    .icon {
+      position: absolute;
+      left: 1px;
+      top: 1px;
+      width: 50px;
+      text-align: center;
+      height: 38px;
+      background: #f8f8f8;
+
+      .input {
+        border: 1px solid #e8e8e8;
+        height: 40px;
+        padding: 0 44px 0 60px;
+        width: 326px;
+      }
+    }
+
+    .input {
+      border: 1px solid #e8e8e8;
+      height: 40px;
+      padding: 0 44px 0 60px;
+      width: 326px;
+    }
+
+    &.code {
+      .input {
+        padding-right: 10px;
+        width: 150px;
+      }
+    }
+  }
+
+  .cancel {
+    position: absolute;
+    right: 0;
+    top: 1px;
+    width: 44px;
+    height: 38px;
+    cursor: pointer;
+
+    :before {
+      position: absolute;
+      top: 9px;
+      left: 14px;
+    }
+  }
+
+  .error {
+    margin-top: 10px;
+    position: relative;
+    color: $colorMain;
+    height: 16px;
+    line-height: 16px;
+  }
+
+  .verify-code {
+    display: flex;
+    width: 326px;
+    height: 40px;
+    margin-top: 10px;
+
+    &-icon {
+      width: 50px;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      border: 1px solid #e8e8e8;
+      border-right: none;
+      background: #f8f8f8;
+
+      img {
+        width: 20px;
+      }
+    }
+
+    input {
+      border: 1px solid #e8e8e8;
+      border-left: none;
+      border-right: none;
+      height: 40px;
+      padding: 0 0 0 10px;
+      width: 190px;
+    }
+
+    &-accept {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      width: 90px;
+
+      .el-button {
+        width: 100%;
+        height: 100%;
+        color: #666;
+        background: #f8f8f8;
+        border-left: none;
+        border-radius: 0;
+        font-size: 12px;
+
+        &:hover {
+          border-color: #e8e8e8;
+          color: $colorMain;
+        }
+      }
+    }
+  }
+
+  .submit {
+    margin-top: 35px;
+    background: $colorMain;
+    color: #fff;
+    text-align: center;
+    border-radius: 2px;
+    width: 100%;
+    height: 45px;
+    font-size: 18px;
+    letter-spacing: 0px;
+
+    &:hover {
+      opacity: 0.9;
+    }
+
+    &.disabled {
+      background-color: #909399;
+    }
+  }
+}
+</style>

+ 2 - 0
xinkeaboard-web/pages/register.vue

@@ -76,6 +76,8 @@ const email = ref('');
 
 // 当前步骤标识
 const currentStep = ref("mail");
+// const config = useRuntimeConfig()
+// const appType = config.public.appType;
 
 const title =
   currentStep.value === "mail"