Browse Source

添加支付

lex 1 year ago
parent
commit
c043367554
100 changed files with 14535 additions and 31 deletions
  1. 32 0
      package-lock.json
  2. 1 0
      package.json
  3. BIN
      src/common/images/icon-address.png
  4. BIN
      src/common/images/icon-check-active.png
  5. BIN
      src/common/images/icon-check.png
  6. BIN
      src/common/images/icon_filter.png
  7. 46 0
      src/components/m-dialog/index.module.less
  8. 91 0
      src/components/m-dialog/index.tsx
  9. 3 1
      src/components/m-empty/index.module.less
  10. 19 9
      src/components/m-img-code/index.tsx
  11. 9 4
      src/components/m-protocol/index.module.less
  12. 8 4
      src/components/m-protocol/index.tsx
  13. 7 1
      src/components/m-search/index.tsx
  14. 5833 0
      src/helpers/area.ts
  15. 33 0
      src/helpers/constant.ts
  16. 7 4
      src/helpers/request.ts
  17. 134 0
      src/helpers/storage.ts
  18. 60 6
      src/helpers/utils.ts
  19. 4 0
      src/main.ts
  20. 85 1
      src/router/router-root.ts
  21. 2 0
      src/shims-vue.d.ts
  22. 37 0
      src/state.ts
  23. 10 0
      src/store/index.ts
  24. 89 0
      src/store/modules/student-register-store.ts
  25. 4 0
      src/store/mutation-types.ts
  26. 69 1
      src/styles/index.less
  27. 18 0
      src/views/adapay/pay-center/index.module.less
  28. 94 0
      src/views/adapay/pay-center/index.tsx
  29. 44 0
      src/views/adapay/pay-define/index.module.less
  30. 231 0
      src/views/adapay/pay-define/index.tsx
  31. 55 0
      src/views/adapay/pay-result/index.module.less
  32. 237 0
      src/views/adapay/pay-result/index.tsx
  33. 93 0
      src/views/adapay/payment/index.module.less
  34. 145 0
      src/views/adapay/payment/index.tsx
  35. 196 0
      src/views/adapay/use-coupons/choice-coupon.tsx
  36. 67 0
      src/views/adapay/use-coupons/index.module.less
  37. 213 0
      src/views/adapay/use-coupons/index.tsx
  38. BIN
      src/views/payment-result/images/icon_close.png
  39. BIN
      src/views/payment-result/images/icon_refunding.png
  40. BIN
      src/views/payment-result/images/icon_success.png
  41. BIN
      src/views/payment-result/images/icon_tradeing.png
  42. 157 0
      src/views/payment-result/index.module.less
  43. 204 0
      src/views/payment-result/index.tsx
  44. 91 0
      src/views/student-register/component/addres.tsx
  45. 68 0
      src/views/student-register/component/address.module.less
  46. 410 0
      src/views/student-register/component/apply.tsx
  47. 311 0
      src/views/student-register/component/order.tsx
  48. 768 0
      src/views/student-register/component/payment.tsx
  49. 50 0
      src/views/student-register/component/user-auth.module.less
  50. 96 0
      src/views/student-register/component/user-auth.tsx
  51. BIN
      src/views/student-register/digital-tools/images/1.png
  52. BIN
      src/views/student-register/digital-tools/images/2.png
  53. BIN
      src/views/student-register/digital-tools/images/icon-video.png
  54. BIN
      src/views/student-register/digital-tools/images/points.png
  55. BIN
      src/views/student-register/digital-tools/images/tool-number.png
  56. 73 0
      src/views/student-register/digital-tools/index.module.less
  57. 52 0
      src/views/student-register/digital-tools/index.tsx
  58. BIN
      src/views/student-register/images/buy-title.png
  59. BIN
      src/views/student-register/images/icon-address-border.png
  60. BIN
      src/views/student-register/images/icon-btn-right.png
  61. BIN
      src/views/student-register/images/icon-btn-video.png
  62. BIN
      src/views/student-register/images/icon-button-buy.png
  63. BIN
      src/views/student-register/images/icon-button-go.png
  64. BIN
      src/views/student-register/images/icon-checkbox-active.png
  65. BIN
      src/views/student-register/images/icon-checkbox-default.png
  66. BIN
      src/views/student-register/images/icon-delete-active.png
  67. BIN
      src/views/student-register/images/icon-edit.png
  68. BIN
      src/views/student-register/images/icon-gift.png
  69. BIN
      src/views/student-register/images/info-title.png
  70. BIN
      src/views/student-register/images/shop-empty.png
  71. BIN
      src/views/student-register/images/tool-title.png
  72. 385 0
      src/views/student-register/index.module.less
  73. 449 0
      src/views/student-register/index.tsx
  74. 311 0
      src/views/student-register/order-detail.module.less
  75. 489 0
      src/views/student-register/order-detail.tsx
  76. 32 0
      src/views/student-register/order-state.ts
  77. 155 0
      src/views/student-register/qrcode-payment/index.module.less
  78. 82 0
      src/views/student-register/qrcode-payment/index.tsx
  79. 52 0
      src/views/student-register/register-modal/index.module.less
  80. 314 0
      src/views/student-register/register-modal/index.tsx
  81. 238 0
      src/views/student-register/shop-address/address-operation.tsx
  82. 77 0
      src/views/student-register/shop-address/index.module.less
  83. 193 0
      src/views/student-register/shop-address/index.tsx
  84. 71 0
      src/views/student-register/shop-mall/components/goods/index.module.less
  85. 70 0
      src/views/student-register/shop-mall/components/goods/index.tsx
  86. 42 0
      src/views/student-register/shop-mall/components/menu-list/index.module.less
  87. 52 0
      src/views/student-register/shop-mall/components/menu-list/index.tsx
  88. 43 0
      src/views/student-register/shop-mall/components/shop-item/index.module.less
  89. 33 0
      src/views/student-register/shop-mall/components/shop-item/index.tsx
  90. 18 0
      src/views/student-register/shop-mall/components/tab-list/index.module.less
  91. 155 0
      src/views/student-register/shop-mall/components/tab-list/index.tsx
  92. 323 0
      src/views/student-register/shop-mall/goods-detail/index.module.less
  93. 315 0
      src/views/student-register/shop-mall/goods-detail/index.tsx
  94. 108 0
      src/views/student-register/shop-mall/goods-list/index.module.less
  95. 272 0
      src/views/student-register/shop-mall/goods-list/index.tsx
  96. BIN
      src/views/student-register/shop-mall/images/icon-address.png
  97. BIN
      src/views/student-register/shop-mall/images/icon-filter.png
  98. BIN
      src/views/student-register/shop-mall/images/icon-more.png
  99. BIN
      src/views/student-register/shop-mall/images/icon-order.png
  100. BIN
      src/views/student-register/shop-mall/images/icon-search-y.png

+ 32 - 0
package-lock.json

@@ -20,6 +20,7 @@
         "html2canvas": "^1.4.1",
         "naive-ui": "^2.34.4",
         "numeral": "^2.0.6",
+        "pinia": "^2.1.4",
         "plyr": "^3.7.8",
         "qrcode": "^1.5.3",
         "query-string": "^8.1.0",
@@ -6878,6 +6879,28 @@
         "node": ">=6"
       }
     },
+    "node_modules/pinia": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.4.tgz",
+      "integrity": "sha512-vYlnDu+Y/FXxv1ABo1vhjC+IbqvzUdiUC3sfDRrRyY2CQSrqqaa+iiHmqtARFxJVqWQMCJfXx1PBvFs9aJVLXQ==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.5.0",
+        "vue-demi": ">=0.14.5"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.4.0",
+        "typescript": ">=4.4.4",
+        "vue": "^2.6.14 || ^3.3.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/plop": {
       "version": "3.1.2",
       "resolved": "https://registry.npmmirror.com/plop/-/plop-3.1.2.tgz",
@@ -13928,6 +13951,15 @@
       "dev": true,
       "optional": true
     },
+    "pinia": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.4.tgz",
+      "integrity": "sha512-vYlnDu+Y/FXxv1ABo1vhjC+IbqvzUdiUC3sfDRrRyY2CQSrqqaa+iiHmqtARFxJVqWQMCJfXx1PBvFs9aJVLXQ==",
+      "requires": {
+        "@vue/devtools-api": "^6.5.0",
+        "vue-demi": ">=0.14.5"
+      }
+    },
     "plop": {
       "version": "3.1.2",
       "resolved": "https://registry.npmmirror.com/plop/-/plop-3.1.2.tgz",

+ 1 - 0
package.json

@@ -33,6 +33,7 @@
     "html2canvas": "^1.4.1",
     "naive-ui": "^2.34.4",
     "numeral": "^2.0.6",
+    "pinia": "^2.1.4",
     "plyr": "^3.7.8",
     "qrcode": "^1.5.3",
     "query-string": "^8.1.0",

BIN
src/common/images/icon-address.png


BIN
src/common/images/icon-check-active.png


BIN
src/common/images/icon-check.png


BIN
src/common/images/icon_filter.png


+ 46 - 0
src/components/m-dialog/index.module.less

@@ -0,0 +1,46 @@
+.dialogTitle {
+  i {
+    display: inline-block;
+    width: 4px;
+    height: 14px;
+    background: #ff8057;
+    border-radius: 2px;
+    margin-right: 6px;
+  }
+
+  padding-left: 25px;
+  text-align: left;
+  font-size: 18px;
+  font-weight: 500;
+  color: #333333;
+  line-height: 25px;
+  padding-bottom: 12px;
+}
+
+.oDialog {
+  // margin-top: env(safe-area-inset-top);
+  :global {
+    .van-dialog__header {
+      padding-top: 20px;
+    }
+    .van-dialog__message {
+      font-size: 16px;
+      color: #333;
+      font-weight: 400;
+      line-height: 24px;
+    }
+    .van-dialog__cancel,
+    .van-dialog__confirm {
+      // font-weight: 500;
+      font-size: 18px;
+      height: 50px;
+      line-height: 50px;
+    }
+    .van-dialog__cancel {
+      color: #777777;
+    }
+    .van-dialog__confirm {
+      color: #f67146;
+    }
+  }
+}

+ 91 - 0
src/components/m-dialog/index.tsx

@@ -0,0 +1,91 @@
+import { Dialog } from 'vant'
+import { defineComponent, PropType, reactive, watch } from 'vue'
+import styles from './index.module.less'
+
+export default defineComponent({
+  name: 'o-dialog',
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    message: {
+      type: String,
+      default: ''
+    },
+    title: {
+      type: String,
+      default: '提示'
+    },
+    confirmButtonText: {
+      type: String,
+      default: '确认'
+    },
+    cancelButtonText: {
+      type: String,
+      default: '取消'
+    },
+    showConfirmButton: {
+      type: Boolean,
+      default: true
+    },
+    showCancelButton: {
+      type: Boolean,
+      default: false
+    },
+    messageAlign: {
+      type: String as PropType<'left' | 'center' | 'right'>,
+      default: 'center'
+    },
+    dialogMarginTop: {
+      type: String,
+      default: '0px'
+    }
+  },
+  emits: ['cancel', 'confirm', 'update:show'],
+  setup(props, { emit }) {
+    const state = reactive({
+      show: props.show || false
+    })
+
+    // 监听状态
+    watch(
+      () => props.show,
+      () => {
+        state.show = props.show
+      }
+    )
+    return () => (
+      <Dialog
+        class={styles.oDialog}
+        style={{
+          marginTop: props.dialogMarginTop
+        }}
+        v-model:show={state.show}
+        message={props.message}
+        messageAlign={props.messageAlign}
+        confirmButtonText={props.confirmButtonText}
+        cancelButtonText={props.cancelButtonText}
+        showConfirmButton={props.showConfirmButton}
+        showCancelButton={props.showCancelButton}
+        onConfirm={() => {
+          emit('update:show', false)
+          emit('confirm')
+        }}
+        onCancel={() => {
+          emit('update:show', false)
+          emit('cancel')
+        }}
+      >
+        {{
+          title: () => (
+            <div class={styles.dialogTitle}>
+              <i></i>
+              {props.title}
+            </div>
+          )
+        }}
+      </Dialog>
+    )
+  }
+})

+ 3 - 1
src/components/m-empty/index.module.less

@@ -2,6 +2,8 @@
   --van-empty-description-color: var(--k-gray-4);
   --van-empty-description-font-size: 16px;
   --van-empty-description-margin-top: 13px;
+  width: 100%;
+  height: 100%;
 
   :global {
     .van-empty__image {
@@ -22,4 +24,4 @@
     padding: 0 24px;
     height: 36px;
   }
-}
+}

+ 19 - 9
src/components/m-img-code/index.tsx

@@ -25,15 +25,15 @@ export default defineComponent({
   data() {
     const origin = window.location.origin;
     return {
-      isSuffix: '/api-web',
+      isSuffix: '/edu-oauth',
       showStatus: false,
-      identifyingCode:
-        origin + '/api-web/code/getLoginImage?phone=' + this.phone,
+      identifyingCode: null as any,
       code: ''
     };
   },
   mounted() {
     this.showStatus = this.value;
+    this.sendImgCode();
   },
   watch: {
     value(val: any) {
@@ -46,19 +46,26 @@ export default defineComponent({
     }
   },
   methods: {
+    async sendImgCode() {
+      const { data } = await request.get(this.isSuffix + '/open/sendImgCode', {
+        requestType: 'form',
+        hideLoading: true,
+        params: {
+          phone: this.phone
+        }
+      });
+      this.identifyingCode = data;
+    },
     async updateIdentifyingCode() {
       // 刷新token
-      const origin = window.location.origin;
-      this.identifyingCode = `${origin}/api-web/code/getLoginImage?phone=${
-        this.phone
-      }&token=${Math.random()}`;
+      this.sendImgCode();
     },
     async checkVerifyLoginImage() {
       try {
         if ((this as any).code.length < 4) {
           return;
         }
-        await request.post(`${this.isSuffix}/code/verifyLoginImage`, {
+        await request.post(`/edu-oauth/open/verifyImgCode`, {
           requestType: 'form',
           hideLoading: true,
           data: {
@@ -66,10 +73,12 @@ export default defineComponent({
             code: this.code
           }
         });
-        await request.post(`${this.isSuffix}/code/sendSms`, {
+        await request.post(`/edu-oauth/open/sendSms`, {
           requestType: 'form',
           hideLoading: true,
           data: {
+            clientId: 'cooleshow-student',
+            type: 'REGISTER',
             mobile: this.phone
           }
         });
@@ -103,6 +112,7 @@ export default defineComponent({
                 placeholder="请输入验证码"
                 v-model={this.code}
                 class={styles.field}
+                autocomplete="off"
               />
             </Col>
             <Col span="10" class={styles.img}>

+ 9 - 4
src/components/m-protocol/index.module.less

@@ -1,12 +1,17 @@
 .mProtocol {
-  // display: flex;
-  // align-items: center;
+
   font-size: 12px;
   padding: 15px 14px;
   color: var(--k-gray-4);
 
+  &.center {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+
   .protocolText {
-    color: var(--van-primary);
+    color: #F96A33;
     line-height: 15px;
   }
 
@@ -44,4 +49,4 @@
     color: #333;
     line-height: 1.4;
   }
-}
+}

+ 8 - 4
src/components/m-protocol/index.tsx

@@ -6,8 +6,8 @@ import inactiveButtonIcon from '@/common/images/icon-check.png';
 import MHeader from '../m-header';
 import request from '@/helpers/request';
 const protocolText: any = {
-  BUY_ORDER: '《管乐团平台服务协议》',
-  REGISTER: '《管乐团平台注册协议》'
+  BUY_ORDER: '《课堂乐器服务协议》',
+  REGISTER: '《课堂乐器注册协议》'
 };
 export default defineComponent({
   name: 'o-protocol',
@@ -23,6 +23,10 @@ export default defineComponent({
     prototcolType: {
       type: String as PropType<'BUY_ORDER' | 'REGISTER' | 'WITHDRAW'>,
       default: 'BUY_ORDER'
+    },
+    center: {
+      type: Boolean,
+      default: false
     }
   },
   data() {
@@ -61,7 +65,7 @@ export default defineComponent({
         // 判断是否有协议内容
         if (!this.protocolHTML) {
           const { data } = await request.get(
-            '/api-student/schoolContractTemplate/queryLatestContractTemplate',
+            '/edu-app/schoolContractTemplate/queryLatestContractTemplate',
             {
               params: {
                 contractType: this.prototcolType
@@ -102,7 +106,7 @@ export default defineComponent({
   },
   render() {
     return (
-      <div class={styles.mProtocol}>
+      <div class={[styles.mProtocol, this.center ? styles.center : '']}>
         <Checkbox
           v-model={this.checked}
           v-slots={{

+ 7 - 1
src/components/m-search/index.tsx

@@ -32,6 +32,10 @@ export default defineComponent({
       type: String,
       default: '#fff'
     },
+    searchIcon: {
+      type: String,
+      default: iconSearch
+    },
     inputBackground: {
       type: String as PropType<inputBackground>,
       default: 'default'
@@ -68,7 +72,9 @@ export default defineComponent({
         onSearch={() => emit('search', forms.search)}>
         {{
           left: () => slots.left && slots.left(),
-          'left-icon': () => <Icon name={iconSearch} class={styles.leftIcon} />,
+          'left-icon': () => (
+            <Icon name={props.searchIcon} class={styles.leftIcon} />
+          ),
           'right-icon': () => (
             <Button
               disabled={props.disabled}

+ 5833 - 0
src/helpers/area.ts

@@ -0,0 +1,5833 @@
+export const areas = [
+  {
+    id: 1,
+    name: '北京市',
+    code: 110000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 2,
+        name: '北京城区',
+        code: 110100,
+        parentOrganId: 1,
+        areas: [
+          { id: 3, name: '东城区', code: 110101 },
+          { id: 4, name: '西城区', code: 110102 },
+          { id: 5, name: '朝阳区', code: 110105 },
+          { id: 6, name: '丰台区', code: 110106 },
+          { id: 7, name: '石景山区', code: 110107 },
+          { id: 8, name: '海淀区', code: 110108 },
+          { id: 9, name: '门头沟区', code: 110109 },
+          { id: 10, name: '房山区', code: 110111 },
+          { id: 11, name: '通州区', code: 110112 },
+          { id: 12, name: '顺义区', code: 110113 },
+          { id: 13, name: '昌平区', code: 110114 },
+          { id: 14, name: '大兴区', code: 110115 },
+          { id: 15, name: '怀柔区', code: 110116 },
+          { id: 16, name: '平谷区', code: 110117 },
+          { id: 17, name: '密云区', code: 110118 },
+          { id: 18, name: '延庆区', code: 110119 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 19,
+    name: '天津市',
+    code: 120000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 20,
+        name: '天津城区',
+        code: 120100,
+        parentOrganId: 19,
+        areas: [
+          { id: 21, name: '和平区', code: 120101 },
+          { id: 22, name: '河东区', code: 120102 },
+          { id: 23, name: '河西区', code: 120103 },
+          { id: 24, name: '南开区', code: 120104 },
+          { id: 25, name: '河北区', code: 120105 },
+          { id: 26, name: '红桥区', code: 120106 },
+          { id: 27, name: '东丽区', code: 120110 },
+          { id: 28, name: '西青区', code: 120111 },
+          { id: 29, name: '津南区', code: 120112 },
+          { id: 30, name: '北辰区', code: 120113 },
+          { id: 31, name: '武清区', code: 120114 },
+          { id: 32, name: '宝坻区', code: 120115 },
+          { id: 33, name: '滨海新区', code: 120116 },
+          { id: 34, name: '宁河区', code: 120117 },
+          { id: 35, name: '静海区', code: 120118 },
+          { id: 36, name: '蓟州区', code: 120119 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 37,
+    name: '河北省',
+    code: 130000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 38,
+        name: '石家庄市',
+        code: 130100,
+        parentOrganId: 37,
+        areas: [
+          { id: 39, name: '长安区', code: 130102 },
+          { id: 40, name: '桥西区', code: 130104 },
+          { id: 41, name: '新华区', code: 130105 },
+          { id: 42, name: '井陉矿区', code: 130107 },
+          { id: 43, name: '裕华区', code: 130108 },
+          { id: 44, name: '藁城区', code: 130109 },
+          { id: 45, name: '鹿泉区', code: 130110 },
+          { id: 46, name: '栾城区', code: 130111 },
+          { id: 47, name: '井陉县', code: 130121 },
+          { id: 48, name: '正定县', code: 130123 },
+          { id: 49, name: '行唐县', code: 130125 },
+          { id: 50, name: '灵寿县', code: 130126 },
+          { id: 51, name: '高邑县', code: 130127 },
+          { id: 52, name: '深泽县', code: 130128 },
+          { id: 53, name: '赞皇县', code: 130129 },
+          { id: 54, name: '无极县', code: 130130 },
+          { id: 55, name: '平山县', code: 130131 },
+          { id: 56, name: '元氏县', code: 130132 },
+          { id: 57, name: '赵县', code: 130133 },
+          { id: 58, name: '辛集市', code: 130181 },
+          { id: 59, name: '晋州市', code: 130183 },
+          { id: 60, name: '新乐市', code: 130184 }
+        ]
+      },
+      {
+        id: 61,
+        name: '唐山市',
+        code: 130200,
+        parentOrganId: 37,
+        areas: [
+          { id: 62, name: '路南区', code: 130202 },
+          { id: 63, name: '路北区', code: 130203 },
+          { id: 64, name: '古冶区', code: 130204 },
+          { id: 65, name: '开平区', code: 130205 },
+          { id: 66, name: '丰南区', code: 130207 },
+          { id: 67, name: '丰润区', code: 130208 },
+          { id: 68, name: '曹妃甸区', code: 130209 },
+          { id: 69, name: '滦县', code: 130223 },
+          { id: 70, name: '滦南县', code: 130224 },
+          { id: 71, name: '乐亭县', code: 130225 },
+          { id: 72, name: '迁西县', code: 130227 },
+          { id: 73, name: '玉田县', code: 130229 },
+          { id: 74, name: '遵化市', code: 130281 },
+          { id: 75, name: '迁安市', code: 130283 }
+        ]
+      },
+      {
+        id: 76,
+        name: '秦皇岛市',
+        code: 130300,
+        parentOrganId: 37,
+        areas: [
+          { id: 77, name: '海港区', code: 130302 },
+          { id: 78, name: '山海关区', code: 130303 },
+          { id: 79, name: '北戴河区', code: 130304 },
+          { id: 80, name: '抚宁区', code: 130306 },
+          { id: 81, name: '青龙满族自治县', code: 130321 },
+          { id: 82, name: '昌黎县', code: 130322 },
+          { id: 83, name: '卢龙县', code: 130324 }
+        ]
+      },
+      {
+        id: 84,
+        name: '邯郸市',
+        code: 130400,
+        parentOrganId: 37,
+        areas: [
+          { id: 85, name: '邯山区', code: 130402 },
+          { id: 86, name: '丛台区', code: 130403 },
+          { id: 87, name: '复兴区', code: 130404 },
+          { id: 88, name: '峰峰矿区', code: 130406 },
+          { id: 89, name: '临漳县', code: 130423 },
+          { id: 90, name: '成安县', code: 130424 },
+          { id: 91, name: '大名县', code: 130425 },
+          { id: 92, name: '涉县', code: 130426 },
+          { id: 93, name: '磁县', code: 130427 },
+          { id: 94, name: '肥乡区', code: 130407 },
+          { id: 95, name: '永年区', code: 130408 },
+          { id: 96, name: '邱县', code: 130430 },
+          { id: 97, name: '鸡泽县', code: 130431 },
+          { id: 98, name: '广平县', code: 130432 },
+          { id: 99, name: '馆陶县', code: 130433 },
+          { id: 100, name: '魏县', code: 130434 },
+          { id: 101, name: '曲周县', code: 130435 },
+          { id: 102, name: '武安市', code: 130481 }
+        ]
+      },
+      {
+        id: 103,
+        name: '邢台市',
+        code: 130500,
+        parentOrganId: 37,
+        areas: [
+          { id: 104, name: '桥东区', code: 130502 },
+          { id: 105, name: '桥西区', code: 130503 },
+          { id: 106, name: '邢台县', code: 130521 },
+          { id: 107, name: '临城县', code: 130522 },
+          { id: 108, name: '内丘县', code: 130523 },
+          { id: 109, name: '柏乡县', code: 130524 },
+          { id: 110, name: '隆尧县', code: 130525 },
+          { id: 111, name: '任县', code: 130526 },
+          { id: 112, name: '南和县', code: 130527 },
+          { id: 113, name: '宁晋县', code: 130528 },
+          { id: 114, name: '巨鹿县', code: 130529 },
+          { id: 115, name: '新河县', code: 130530 },
+          { id: 116, name: '广宗县', code: 130531 },
+          { id: 117, name: '平乡县', code: 130532 },
+          { id: 118, name: '威县', code: 130533 },
+          { id: 119, name: '清河县', code: 130534 },
+          { id: 120, name: '临西县', code: 130535 },
+          { id: 121, name: '南宫市', code: 130581 },
+          { id: 122, name: '沙河市', code: 130582 }
+        ]
+      },
+      {
+        id: 123,
+        name: '保定市',
+        code: 130600,
+        parentOrganId: 37,
+        areas: [
+          { id: 124, name: '竞秀区', code: 130602 },
+          { id: 125, name: '莲池区', code: 130606 },
+          { id: 126, name: '满城区', code: 130607 },
+          { id: 127, name: '清苑区', code: 130608 },
+          { id: 128, name: '徐水区', code: 130609 },
+          { id: 129, name: '涞水县', code: 130623 },
+          { id: 130, name: '阜平县', code: 130624 },
+          { id: 131, name: '定兴县', code: 130626 },
+          { id: 132, name: '唐县', code: 130627 },
+          { id: 133, name: '高阳县', code: 130628 },
+          { id: 134, name: '容城县', code: 130629 },
+          { id: 135, name: '涞源县', code: 130630 },
+          { id: 136, name: '望都县', code: 130631 },
+          { id: 137, name: '安新县', code: 130632 },
+          { id: 138, name: '易县', code: 130633 },
+          { id: 139, name: '曲阳县', code: 130634 },
+          { id: 140, name: '蠡县', code: 130635 },
+          { id: 141, name: '顺平县', code: 130636 },
+          { id: 142, name: '博野县', code: 130637 },
+          { id: 143, name: '雄县', code: 130638 },
+          { id: 144, name: '涿州市', code: 130681 },
+          { id: 145, name: '定州市', code: 130682 },
+          { id: 146, name: '安国市', code: 130683 },
+          { id: 147, name: '高碑店市', code: 130684 }
+        ]
+      },
+      {
+        id: 148,
+        name: '张家口市',
+        code: 130700,
+        parentOrganId: 37,
+        areas: [
+          { id: 149, name: '桥东区', code: 130702 },
+          { id: 150, name: '桥西区', code: 130703 },
+          { id: 151, name: '宣化区', code: 130705 },
+          { id: 152, name: '下花园区', code: 130706 },
+          { id: 153, name: '万全区', code: 130708 },
+          { id: 154, name: '崇礼区', code: 130709 },
+          { id: 155, name: '张北县', code: 130722 },
+          { id: 156, name: '康保县', code: 130723 },
+          { id: 157, name: '沽源县', code: 130724 },
+          { id: 158, name: '尚义县', code: 130725 },
+          { id: 159, name: '蔚县', code: 130726 },
+          { id: 160, name: '阳原县', code: 130727 },
+          { id: 161, name: '怀安县', code: 130728 },
+          { id: 162, name: '怀来县', code: 130730 },
+          { id: 163, name: '涿鹿县', code: 130731 },
+          { id: 164, name: '赤城县', code: 130732 }
+        ]
+      },
+      {
+        id: 165,
+        name: '承德市',
+        code: 130800,
+        parentOrganId: 37,
+        areas: [
+          { id: 166, name: '双桥区', code: 130802 },
+          { id: 167, name: '双滦区', code: 130803 },
+          { id: 168, name: '鹰手营子矿区', code: 130804 },
+          { id: 169, name: '承德县', code: 130821 },
+          { id: 170, name: '兴隆县', code: 130822 },
+          { id: 171, name: '平泉市', code: 130881 },
+          { id: 172, name: '滦平县', code: 130824 },
+          { id: 173, name: '隆化县', code: 130825 },
+          { id: 174, name: '丰宁满族自治县', code: 130826 },
+          { id: 175, name: '宽城满族自治县', code: 130827 },
+          { id: 176, name: '围场满族蒙古族自治县', code: 130828 }
+        ]
+      },
+      {
+        id: 177,
+        name: '沧州市',
+        code: 130900,
+        parentOrganId: 37,
+        areas: [
+          { id: 178, name: '新华区', code: 130902 },
+          { id: 179, name: '运河区', code: 130903 },
+          { id: 180, name: '沧县', code: 130921 },
+          { id: 181, name: '青县', code: 130922 },
+          { id: 182, name: '东光县', code: 130923 },
+          { id: 183, name: '海兴县', code: 130924 },
+          { id: 184, name: '盐山县', code: 130925 },
+          { id: 185, name: '肃宁县', code: 130926 },
+          { id: 186, name: '南皮县', code: 130927 },
+          { id: 187, name: '吴桥县', code: 130928 },
+          { id: 188, name: '献县', code: 130929 },
+          { id: 189, name: '孟村回族自治县', code: 130930 },
+          { id: 190, name: '泊头市', code: 130981 },
+          { id: 191, name: '任丘市', code: 130982 },
+          { id: 192, name: '黄骅市', code: 130983 },
+          { id: 193, name: '河间市', code: 130984 }
+        ]
+      },
+      {
+        id: 194,
+        name: '廊坊市',
+        code: 131000,
+        parentOrganId: 37,
+        areas: [
+          { id: 195, name: '安次区', code: 131002 },
+          { id: 196, name: '广阳区', code: 131003 },
+          { id: 197, name: '固安县', code: 131022 },
+          { id: 198, name: '永清县', code: 131023 },
+          { id: 199, name: '香河县', code: 131024 },
+          { id: 200, name: '大城县', code: 131025 },
+          { id: 201, name: '文安县', code: 131026 },
+          { id: 202, name: '大厂回族自治县', code: 131028 },
+          { id: 203, name: '霸州市', code: 131081 },
+          { id: 204, name: '三河市', code: 131082 }
+        ]
+      },
+      {
+        id: 205,
+        name: '衡水市',
+        code: 131100,
+        parentOrganId: 37,
+        areas: [
+          { id: 206, name: '桃城区', code: 131102 },
+          { id: 207, name: '冀州区', code: 131103 },
+          { id: 208, name: '枣强县', code: 131121 },
+          { id: 209, name: '武邑县', code: 131122 },
+          { id: 210, name: '武强县', code: 131123 },
+          { id: 211, name: '饶阳县', code: 131124 },
+          { id: 212, name: '安平县', code: 131125 },
+          { id: 213, name: '故城县', code: 131126 },
+          { id: 214, name: '景县', code: 131127 },
+          { id: 215, name: '阜城县', code: 131128 },
+          { id: 216, name: '深州市', code: 131182 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 217,
+    name: '山西省',
+    code: 140000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 218,
+        name: '太原市',
+        code: 140100,
+        parentOrganId: 217,
+        areas: [
+          { id: 219, name: '小店区', code: 140105 },
+          { id: 220, name: '迎泽区', code: 140106 },
+          { id: 221, name: '杏花岭区', code: 140107 },
+          { id: 222, name: '尖草坪区', code: 140108 },
+          { id: 223, name: '万柏林区', code: 140109 },
+          { id: 224, name: '晋源区', code: 140110 },
+          { id: 225, name: '清徐县', code: 140121 },
+          { id: 226, name: '阳曲县', code: 140122 },
+          { id: 227, name: '娄烦县', code: 140123 },
+          { id: 228, name: '古交市', code: 140181 }
+        ]
+      },
+      {
+        id: 229,
+        name: '大同市',
+        code: 140200,
+        parentOrganId: 217,
+        areas: [
+          { id: 230, name: '城区', code: 140202 },
+          { id: 231, name: '矿区', code: 140203 },
+          { id: 232, name: '南郊区', code: 140211 },
+          { id: 233, name: '新荣区', code: 140212 },
+          { id: 234, name: '阳高县', code: 140221 },
+          { id: 235, name: '天镇县', code: 140222 },
+          { id: 236, name: '广灵县', code: 140223 },
+          { id: 237, name: '灵丘县', code: 140224 },
+          { id: 238, name: '浑源县', code: 140225 },
+          { id: 239, name: '左云县', code: 140226 },
+          { id: 240, name: '大同县', code: 140227 }
+        ]
+      },
+      {
+        id: 241,
+        name: '阳泉市',
+        code: 140300,
+        parentOrganId: 217,
+        areas: [
+          { id: 242, name: '城区', code: 140302 },
+          { id: 243, name: '矿区', code: 140303 },
+          { id: 244, name: '郊区', code: 140311 },
+          { id: 245, name: '平定县', code: 140321 },
+          { id: 246, name: '盂县', code: 140322 }
+        ]
+      },
+      {
+        id: 247,
+        name: '长治市',
+        code: 140400,
+        parentOrganId: 217,
+        areas: [
+          { id: 248, name: '城区', code: 140402 },
+          { id: 249, name: '郊区', code: 140411 },
+          { id: 250, name: '长治县', code: 140421 },
+          { id: 251, name: '襄垣县', code: 140423 },
+          { id: 252, name: '屯留县', code: 140424 },
+          { id: 253, name: '平顺县', code: 140425 },
+          { id: 254, name: '黎城县', code: 140426 },
+          { id: 255, name: '壶关县', code: 140427 },
+          { id: 256, name: '长子县', code: 140428 },
+          { id: 257, name: '武乡县', code: 140429 },
+          { id: 258, name: '沁县', code: 140430 },
+          { id: 259, name: '沁源县', code: 140431 },
+          { id: 260, name: '潞城市', code: 140481 }
+        ]
+      },
+      {
+        id: 261,
+        name: '晋城市',
+        code: 140500,
+        parentOrganId: 217,
+        areas: [
+          { id: 262, name: '城区', code: 140502 },
+          { id: 263, name: '沁水县', code: 140521 },
+          { id: 264, name: '阳城县', code: 140522 },
+          { id: 265, name: '陵川县', code: 140524 },
+          { id: 266, name: '泽州县', code: 140525 },
+          { id: 267, name: '高平市', code: 140581 }
+        ]
+      },
+      {
+        id: 268,
+        name: '朔州市',
+        code: 140600,
+        parentOrganId: 217,
+        areas: [
+          { id: 269, name: '朔城区', code: 140602 },
+          { id: 270, name: '平鲁区', code: 140603 },
+          { id: 271, name: '山阴县', code: 140621 },
+          { id: 272, name: '应县', code: 140622 },
+          { id: 273, name: '右玉县', code: 140623 },
+          { id: 274, name: '怀仁县', code: 140624 }
+        ]
+      },
+      {
+        id: 275,
+        name: '晋中市',
+        code: 140700,
+        parentOrganId: 217,
+        areas: [
+          { id: 276, name: '榆次区', code: 140702 },
+          { id: 277, name: '榆社县', code: 140721 },
+          { id: 278, name: '左权县', code: 140722 },
+          { id: 279, name: '和顺县', code: 140723 },
+          { id: 280, name: '昔阳县', code: 140724 },
+          { id: 281, name: '寿阳县', code: 140725 },
+          { id: 282, name: '太谷县', code: 140726 },
+          { id: 283, name: '祁县', code: 140727 },
+          { id: 284, name: '平遥县', code: 140728 },
+          { id: 285, name: '灵石县', code: 140729 },
+          { id: 286, name: '介休市', code: 140781 }
+        ]
+      },
+      {
+        id: 287,
+        name: '运城市',
+        code: 140800,
+        parentOrganId: 217,
+        areas: [
+          { id: 288, name: '盐湖区', code: 140802 },
+          { id: 289, name: '临猗县', code: 140821 },
+          { id: 290, name: '万荣县', code: 140822 },
+          { id: 291, name: '闻喜县', code: 140823 },
+          { id: 292, name: '稷山县', code: 140824 },
+          { id: 293, name: '新绛县', code: 140825 },
+          { id: 294, name: '绛县', code: 140826 },
+          { id: 295, name: '垣曲县', code: 140827 },
+          { id: 296, name: '夏县', code: 140828 },
+          { id: 297, name: '平陆县', code: 140829 },
+          { id: 298, name: '芮城县', code: 140830 },
+          { id: 299, name: '永济市', code: 140881 },
+          { id: 300, name: '河津市', code: 140882 }
+        ]
+      },
+      {
+        id: 301,
+        name: '忻州市',
+        code: 140900,
+        parentOrganId: 217,
+        areas: [
+          { id: 302, name: '忻府区', code: 140902 },
+          { id: 303, name: '定襄县', code: 140921 },
+          { id: 304, name: '五台县', code: 140922 },
+          { id: 305, name: '代县', code: 140923 },
+          { id: 306, name: '繁峙县', code: 140924 },
+          { id: 307, name: '宁武县', code: 140925 },
+          { id: 308, name: '静乐县', code: 140926 },
+          { id: 309, name: '神池县', code: 140927 },
+          { id: 310, name: '五寨县', code: 140928 },
+          { id: 311, name: '岢岚县', code: 140929 },
+          { id: 312, name: '河曲县', code: 140930 },
+          { id: 313, name: '保德县', code: 140931 },
+          { id: 314, name: '偏关县', code: 140932 },
+          { id: 315, name: '原平市', code: 140981 }
+        ]
+      },
+      {
+        id: 316,
+        name: '临汾市',
+        code: 141000,
+        parentOrganId: 217,
+        areas: [
+          { id: 317, name: '尧都区', code: 141002 },
+          { id: 318, name: '曲沃县', code: 141021 },
+          { id: 319, name: '翼城县', code: 141022 },
+          { id: 320, name: '襄汾县', code: 141023 },
+          { id: 321, name: '洪洞县', code: 141024 },
+          { id: 322, name: '古县', code: 141025 },
+          { id: 323, name: '安泽县', code: 141026 },
+          { id: 324, name: '浮山县', code: 141027 },
+          { id: 325, name: '吉县', code: 141028 },
+          { id: 326, name: '乡宁县', code: 141029 },
+          { id: 327, name: '大宁县', code: 141030 },
+          { id: 328, name: '隰县', code: 141031 },
+          { id: 329, name: '永和县', code: 141032 },
+          { id: 330, name: '蒲县', code: 141033 },
+          { id: 331, name: '汾西县', code: 141034 },
+          { id: 332, name: '侯马市', code: 141081 },
+          { id: 333, name: '霍州市', code: 141082 }
+        ]
+      },
+      {
+        id: 334,
+        name: '吕梁市',
+        code: 141100,
+        parentOrganId: 217,
+        areas: [
+          { id: 335, name: '离石区', code: 141102 },
+          { id: 336, name: '文水县', code: 141121 },
+          { id: 337, name: '交城县', code: 141122 },
+          { id: 338, name: '兴县', code: 141123 },
+          { id: 339, name: '临县', code: 141124 },
+          { id: 340, name: '柳林县', code: 141125 },
+          { id: 341, name: '石楼县', code: 141126 },
+          { id: 342, name: '岚县', code: 141127 },
+          { id: 343, name: '方山县', code: 141128 },
+          { id: 344, name: '中阳县', code: 141129 },
+          { id: 345, name: '交口县', code: 141130 },
+          { id: 346, name: '孝义市', code: 141181 },
+          { id: 347, name: '汾阳市', code: 141182 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 348,
+    name: '内蒙古自治区',
+    code: 150000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 349,
+        name: '呼和浩特市',
+        code: 150100,
+        parentOrganId: 348,
+        areas: [
+          { id: 350, name: '新城区', code: 150102 },
+          { id: 351, name: '回民区', code: 150103 },
+          { id: 352, name: '玉泉区', code: 150104 },
+          { id: 353, name: '赛罕区', code: 150105 },
+          { id: 354, name: '土默特左旗', code: 150121 },
+          { id: 355, name: '托克托县', code: 150122 },
+          { id: 356, name: '和林格尔县', code: 150123 },
+          { id: 357, name: '清水河县', code: 150124 },
+          { id: 358, name: '武川县', code: 150125 }
+        ]
+      },
+      {
+        id: 359,
+        name: '包头市',
+        code: 150200,
+        parentOrganId: 348,
+        areas: [
+          { id: 360, name: '东河区', code: 150202 },
+          { id: 361, name: '昆都仑区', code: 150203 },
+          { id: 362, name: '青山区', code: 150204 },
+          { id: 363, name: '石拐区', code: 150205 },
+          { id: 364, name: '白云鄂博矿区', code: 150206 },
+          { id: 365, name: '九原区', code: 150207 },
+          { id: 366, name: '土默特右旗', code: 150221 },
+          { id: 367, name: '固阳县', code: 150222 },
+          { id: 368, name: '达尔罕茂明安联合旗', code: 150223 }
+        ]
+      },
+      {
+        id: 369,
+        name: '乌海市',
+        code: 150300,
+        parentOrganId: 348,
+        areas: [
+          { id: 370, name: '海勃湾区', code: 150302 },
+          { id: 371, name: '海南区', code: 150303 },
+          { id: 372, name: '乌达区', code: 150304 }
+        ]
+      },
+      {
+        id: 373,
+        name: '赤峰市',
+        code: 150400,
+        parentOrganId: 348,
+        areas: [
+          { id: 374, name: '红山区', code: 150402 },
+          { id: 375, name: '元宝山区', code: 150403 },
+          { id: 376, name: '松山区', code: 150404 },
+          { id: 377, name: '阿鲁科尔沁旗', code: 150421 },
+          { id: 378, name: '巴林左旗', code: 150422 },
+          { id: 379, name: '巴林右旗', code: 150423 },
+          { id: 380, name: '林西县', code: 150424 },
+          { id: 381, name: '克什克腾旗', code: 150425 },
+          { id: 382, name: '翁牛特旗', code: 150426 },
+          { id: 383, name: '喀喇沁旗', code: 150428 },
+          { id: 384, name: '宁城县', code: 150429 },
+          { id: 385, name: '敖汉旗', code: 150430 }
+        ]
+      },
+      {
+        id: 386,
+        name: '通辽市',
+        code: 150500,
+        parentOrganId: 348,
+        areas: [
+          { id: 387, name: '科尔沁区', code: 150502 },
+          { id: 388, name: '科尔沁左翼中旗', code: 150521 },
+          { id: 389, name: '科尔沁左翼后旗', code: 150522 },
+          { id: 390, name: '开鲁县', code: 150523 },
+          { id: 391, name: '库伦旗', code: 150524 },
+          { id: 392, name: '奈曼旗', code: 150525 },
+          { id: 393, name: '扎鲁特旗', code: 150526 },
+          { id: 394, name: '霍林郭勒市', code: 150581 }
+        ]
+      },
+      {
+        id: 395,
+        name: '鄂尔多斯市',
+        code: 150600,
+        parentOrganId: 348,
+        areas: [
+          { id: 396, name: '东胜区', code: 150602 },
+          { id: 397, name: '康巴什区', code: 150603 },
+          { id: 398, name: '达拉特旗', code: 150621 },
+          { id: 399, name: '准格尔旗', code: 150622 },
+          { id: 400, name: '鄂托克前旗', code: 150623 },
+          { id: 401, name: '鄂托克旗', code: 150624 },
+          { id: 402, name: '杭锦旗', code: 150625 },
+          { id: 403, name: '乌审旗', code: 150626 },
+          { id: 404, name: '伊金霍洛旗', code: 150627 }
+        ]
+      },
+      {
+        id: 405,
+        name: '呼伦贝尔市',
+        code: 150700,
+        parentOrganId: 348,
+        areas: [
+          { id: 406, name: '海拉尔区', code: 150702 },
+          { id: 407, name: '扎赉诺尔区', code: 150703 },
+          { id: 408, name: '阿荣旗', code: 150721 },
+          { id: 409, name: '莫力达瓦达斡尔族自治旗', code: 150722 },
+          { id: 410, name: '鄂伦春自治旗', code: 150723 },
+          { id: 411, name: '鄂温克族自治旗', code: 150724 },
+          { id: 412, name: '陈巴尔虎旗', code: 150725 },
+          { id: 413, name: '新巴尔虎左旗', code: 150726 },
+          { id: 414, name: '新巴尔虎右旗', code: 150727 },
+          { id: 415, name: '满洲里市', code: 150781 },
+          { id: 416, name: '牙克石市', code: 150782 },
+          { id: 417, name: '扎兰屯市', code: 150783 },
+          { id: 418, name: '额尔古纳市', code: 150784 },
+          { id: 419, name: '根河市', code: 150785 }
+        ]
+      },
+      {
+        id: 420,
+        name: '巴彦淖尔市',
+        code: 150800,
+        parentOrganId: 348,
+        areas: [
+          { id: 421, name: '临河区', code: 150802 },
+          { id: 422, name: '五原县', code: 150821 },
+          { id: 423, name: '磴口县', code: 150822 },
+          { id: 424, name: '乌拉特前旗', code: 150823 },
+          { id: 425, name: '乌拉特中旗', code: 150824 },
+          { id: 426, name: '乌拉特后旗', code: 150825 },
+          { id: 427, name: '杭锦后旗', code: 150826 }
+        ]
+      },
+      {
+        id: 428,
+        name: '乌兰察布市',
+        code: 150900,
+        parentOrganId: 348,
+        areas: [
+          { id: 429, name: '集宁区', code: 150902 },
+          { id: 430, name: '卓资县', code: 150921 },
+          { id: 431, name: '化德县', code: 150922 },
+          { id: 432, name: '商都县', code: 150923 },
+          { id: 433, name: '兴和县', code: 150924 },
+          { id: 434, name: '凉城县', code: 150925 },
+          { id: 435, name: '察哈尔右翼前旗', code: 150926 },
+          { id: 436, name: '察哈尔右翼中旗', code: 150927 },
+          { id: 437, name: '察哈尔右翼后旗', code: 150928 },
+          { id: 438, name: '四子王旗', code: 150929 },
+          { id: 439, name: '丰镇市', code: 150981 }
+        ]
+      },
+      {
+        id: 440,
+        name: '兴安盟',
+        code: 152200,
+        parentOrganId: 348,
+        areas: [
+          { id: 441, name: '乌兰浩特市', code: 152201 },
+          { id: 442, name: '阿尔山市', code: 152202 },
+          { id: 443, name: '科尔沁右翼前旗', code: 152221 },
+          { id: 444, name: '科尔沁右翼中旗', code: 152222 },
+          { id: 445, name: '扎赉特旗', code: 152223 },
+          { id: 446, name: '突泉县', code: 152224 }
+        ]
+      },
+      {
+        id: 447,
+        name: '锡林郭勒盟',
+        code: 152500,
+        parentOrganId: 348,
+        areas: [
+          { id: 448, name: '二连浩特市', code: 152501 },
+          { id: 449, name: '锡林浩特市', code: 152502 },
+          { id: 450, name: '阿巴嘎旗', code: 152522 },
+          { id: 451, name: '苏尼特左旗', code: 152523 },
+          { id: 452, name: '苏尼特右旗', code: 152524 },
+          { id: 453, name: '东乌珠穆沁旗', code: 152525 },
+          { id: 454, name: '西乌珠穆沁旗', code: 152526 },
+          { id: 455, name: '太仆寺旗', code: 152527 },
+          { id: 456, name: '镶黄旗', code: 152528 },
+          { id: 457, name: '正镶白旗', code: 152529 },
+          { id: 458, name: '正蓝旗', code: 152530 },
+          { id: 459, name: '多伦县', code: 152531 }
+        ]
+      },
+      {
+        id: 460,
+        name: '阿拉善盟',
+        code: 152900,
+        parentOrganId: 348,
+        areas: [
+          { id: 461, name: '阿拉善左旗', code: 152921 },
+          { id: 462, name: '阿拉善右旗', code: 152922 },
+          { id: 463, name: '额济纳旗', code: 152923 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 464,
+    name: '辽宁省',
+    code: 210000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 465,
+        name: '沈阳市',
+        code: 210100,
+        parentOrganId: 464,
+        areas: [
+          { id: 466, name: '和平区', code: 210102 },
+          { id: 467, name: '沈河区', code: 210103 },
+          { id: 468, name: '大东区', code: 210104 },
+          { id: 469, name: '皇姑区', code: 210105 },
+          { id: 470, name: '铁西区', code: 210106 },
+          { id: 471, name: '苏家屯区', code: 210111 },
+          { id: 472, name: '浑南区', code: 210112 },
+          { id: 473, name: '沈北新区', code: 210113 },
+          { id: 474, name: '于洪区', code: 210114 },
+          { id: 475, name: '辽中区', code: 210115 },
+          { id: 476, name: '康平县', code: 210123 },
+          { id: 477, name: '法库县', code: 210124 },
+          { id: 478, name: '新民市', code: 210181 }
+        ]
+      },
+      {
+        id: 479,
+        name: '大连市',
+        code: 210200,
+        parentOrganId: 464,
+        areas: [
+          { id: 480, name: '中山区', code: 210202 },
+          { id: 481, name: '西岗区', code: 210203 },
+          { id: 482, name: '沙河口区', code: 210204 },
+          { id: 483, name: '甘井子区', code: 210211 },
+          { id: 484, name: '旅顺口区', code: 210212 },
+          { id: 485, name: '金州区', code: 210213 },
+          { id: 486, name: '普兰店区', code: 210214 },
+          { id: 487, name: '长海县', code: 210224 },
+          { id: 488, name: '瓦房店市', code: 210281 },
+          { id: 489, name: '庄河市', code: 210283 }
+        ]
+      },
+      {
+        id: 490,
+        name: '鞍山市',
+        code: 210300,
+        parentOrganId: 464,
+        areas: [
+          { id: 491, name: '铁东区', code: 210302 },
+          { id: 492, name: '铁西区', code: 210303 },
+          { id: 493, name: '立山区', code: 210304 },
+          { id: 494, name: '千山区', code: 210311 },
+          { id: 495, name: '台安县', code: 210321 },
+          { id: 496, name: '岫岩满族自治县', code: 210323 },
+          { id: 497, name: '海城市', code: 210381 }
+        ]
+      },
+      {
+        id: 498,
+        name: '抚顺市',
+        code: 210400,
+        parentOrganId: 464,
+        areas: [
+          { id: 499, name: '新抚区', code: 210402 },
+          { id: 500, name: '东洲区', code: 210403 },
+          { id: 501, name: '望花区', code: 210404 },
+          { id: 502, name: '顺城区', code: 210411 },
+          { id: 503, name: '抚顺县', code: 210421 },
+          { id: 504, name: '新宾满族自治县', code: 210422 },
+          { id: 505, name: '清原满族自治县', code: 210423 }
+        ]
+      },
+      {
+        id: 506,
+        name: '本溪市',
+        code: 210500,
+        parentOrganId: 464,
+        areas: [
+          { id: 507, name: '平山区', code: 210502 },
+          { id: 508, name: '溪湖区', code: 210503 },
+          { id: 509, name: '明山区', code: 210504 },
+          { id: 510, name: '南芬区', code: 210505 },
+          { id: 511, name: '本溪满族自治县', code: 210521 },
+          { id: 512, name: '桓仁满族自治县', code: 210522 }
+        ]
+      },
+      {
+        id: 513,
+        name: '丹东市',
+        code: 210600,
+        parentOrganId: 464,
+        areas: [
+          { id: 514, name: '元宝区', code: 210602 },
+          { id: 515, name: '振兴区', code: 210603 },
+          { id: 516, name: '振安区', code: 210604 },
+          { id: 517, name: '宽甸满族自治县', code: 210624 },
+          { id: 518, name: '东港市', code: 210681 },
+          { id: 519, name: '凤城市', code: 210682 }
+        ]
+      },
+      {
+        id: 520,
+        name: '锦州市',
+        code: 210700,
+        parentOrganId: 464,
+        areas: [
+          { id: 521, name: '古塔区', code: 210702 },
+          { id: 522, name: '凌河区', code: 210703 },
+          { id: 523, name: '太和区', code: 210711 },
+          { id: 524, name: '黑山县', code: 210726 },
+          { id: 525, name: '义县', code: 210727 },
+          { id: 526, name: '凌海市', code: 210781 },
+          { id: 527, name: '北镇市', code: 210782 }
+        ]
+      },
+      {
+        id: 528,
+        name: '营口市',
+        code: 210800,
+        parentOrganId: 464,
+        areas: [
+          { id: 529, name: '站前区', code: 210802 },
+          { id: 530, name: '西市区', code: 210803 },
+          { id: 531, name: '鲅鱼圈区', code: 210804 },
+          { id: 532, name: '老边区', code: 210811 },
+          { id: 533, name: '盖州市', code: 210881 },
+          { id: 534, name: '大石桥市', code: 210882 }
+        ]
+      },
+      {
+        id: 535,
+        name: '阜新市',
+        code: 210900,
+        parentOrganId: 464,
+        areas: [
+          { id: 536, name: '海州区', code: 210902 },
+          { id: 537, name: '新邱区', code: 210903 },
+          { id: 538, name: '太平区', code: 210904 },
+          { id: 539, name: '清河门区', code: 210905 },
+          { id: 540, name: '细河区', code: 210911 },
+          { id: 541, name: '阜新蒙古族自治县', code: 210921 },
+          { id: 542, name: '彰武县', code: 210922 }
+        ]
+      },
+      {
+        id: 543,
+        name: '辽阳市',
+        code: 211000,
+        parentOrganId: 464,
+        areas: [
+          { id: 544, name: '白塔区', code: 211002 },
+          { id: 545, name: '文圣区', code: 211003 },
+          { id: 546, name: '宏伟区', code: 211004 },
+          { id: 547, name: '弓长岭区', code: 211005 },
+          { id: 548, name: '太子河区', code: 211011 },
+          { id: 549, name: '辽阳县', code: 211021 },
+          { id: 550, name: '灯塔市', code: 211081 }
+        ]
+      },
+      {
+        id: 551,
+        name: '盘锦市',
+        code: 211100,
+        parentOrganId: 464,
+        areas: [
+          { id: 552, name: '双台子区', code: 211102 },
+          { id: 553, name: '兴隆台区', code: 211103 },
+          { id: 554, name: '大洼区', code: 211104 },
+          { id: 555, name: '盘山县', code: 211122 }
+        ]
+      },
+      {
+        id: 556,
+        name: '铁岭市',
+        code: 211200,
+        parentOrganId: 464,
+        areas: [
+          { id: 557, name: '银州区', code: 211202 },
+          { id: 558, name: '清河区', code: 211204 },
+          { id: 559, name: '铁岭县', code: 211221 },
+          { id: 560, name: '西丰县', code: 211223 },
+          { id: 561, name: '昌图县', code: 211224 },
+          { id: 562, name: '调兵山市', code: 211281 },
+          { id: 563, name: '开原市', code: 211282 }
+        ]
+      },
+      {
+        id: 564,
+        name: '朝阳市',
+        code: 211300,
+        parentOrganId: 464,
+        areas: [
+          { id: 565, name: '双塔区', code: 211302 },
+          { id: 566, name: '龙城区', code: 211303 },
+          { id: 567, name: '朝阳县', code: 211321 },
+          { id: 568, name: '建平县', code: 211322 },
+          { id: 569, name: '喀喇沁左翼蒙古族自治县', code: 211324 },
+          { id: 570, name: '北票市', code: 211381 },
+          { id: 571, name: '凌源市', code: 211382 }
+        ]
+      },
+      {
+        id: 572,
+        name: '葫芦岛市',
+        code: 211400,
+        parentOrganId: 464,
+        areas: [
+          { id: 573, name: '连山区', code: 211402 },
+          { id: 574, name: '龙港区', code: 211403 },
+          { id: 575, name: '南票区', code: 211404 },
+          { id: 576, name: '绥中县', code: 211421 },
+          { id: 577, name: '建昌县', code: 211422 },
+          { id: 578, name: '兴城市', code: 211481 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 579,
+    name: '吉林省',
+    code: 220000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 580,
+        name: '长春市',
+        code: 220100,
+        parentOrganId: 579,
+        areas: [
+          { id: 581, name: '南关区', code: 220102 },
+          { id: 582, name: '宽城区', code: 220103 },
+          { id: 583, name: '朝阳区', code: 220104 },
+          { id: 584, name: '二道区', code: 220105 },
+          { id: 585, name: '绿园区', code: 220106 },
+          { id: 586, name: '双阳区', code: 220112 },
+          { id: 587, name: '九台区', code: 220113 },
+          { id: 588, name: '农安县', code: 220122 },
+          { id: 589, name: '榆树市', code: 220182 },
+          { id: 590, name: '德惠市', code: 220183 }
+        ]
+      },
+      {
+        id: 591,
+        name: '吉林市',
+        code: 220200,
+        parentOrganId: 579,
+        areas: [
+          { id: 592, name: '昌邑区', code: 220202 },
+          { id: 593, name: '龙潭区', code: 220203 },
+          { id: 594, name: '船营区', code: 220204 },
+          { id: 595, name: '丰满区', code: 220211 },
+          { id: 596, name: '永吉县', code: 220221 },
+          { id: 597, name: '蛟河市', code: 220281 },
+          { id: 598, name: '桦甸市', code: 220282 },
+          { id: 599, name: '舒兰市', code: 220283 },
+          { id: 600, name: '磐石市', code: 220284 }
+        ]
+      },
+      {
+        id: 601,
+        name: '四平市',
+        code: 220300,
+        parentOrganId: 579,
+        areas: [
+          { id: 602, name: '铁西区', code: 220302 },
+          { id: 603, name: '铁东区', code: 220303 },
+          { id: 604, name: '梨树县', code: 220322 },
+          { id: 605, name: '伊通满族自治县', code: 220323 },
+          { id: 606, name: '公主岭市', code: 220381 },
+          { id: 607, name: '双辽市', code: 220382 }
+        ]
+      },
+      {
+        id: 608,
+        name: '辽源市',
+        code: 220400,
+        parentOrganId: 579,
+        areas: [
+          { id: 609, name: '龙山区', code: 220402 },
+          { id: 610, name: '西安区', code: 220403 },
+          { id: 611, name: '东丰县', code: 220421 },
+          { id: 612, name: '东辽县', code: 220422 }
+        ]
+      },
+      {
+        id: 613,
+        name: '通化市',
+        code: 220500,
+        parentOrganId: 579,
+        areas: [
+          { id: 614, name: '东昌区', code: 220502 },
+          { id: 615, name: '二道江区', code: 220503 },
+          { id: 616, name: '通化县', code: 220521 },
+          { id: 617, name: '辉南县', code: 220523 },
+          { id: 618, name: '柳河县', code: 220524 },
+          { id: 619, name: '梅河口市', code: 220581 },
+          { id: 620, name: '集安市', code: 220582 }
+        ]
+      },
+      {
+        id: 621,
+        name: '白山市',
+        code: 220600,
+        parentOrganId: 579,
+        areas: [
+          { id: 622, name: '浑江区', code: 220602 },
+          { id: 623, name: '江源区', code: 220605 },
+          { id: 624, name: '抚松县', code: 220621 },
+          { id: 625, name: '靖宇县', code: 220622 },
+          { id: 626, name: '长白朝鲜族自治县', code: 220623 },
+          { id: 627, name: '临江市', code: 220681 }
+        ]
+      },
+      {
+        id: 628,
+        name: '松原市',
+        code: 220700,
+        parentOrganId: 579,
+        areas: [
+          { id: 629, name: '宁江区', code: 220702 },
+          { id: 630, name: '前郭尔罗斯蒙古族自治县', code: 220721 },
+          { id: 631, name: '长岭县', code: 220722 },
+          { id: 632, name: '乾安县', code: 220723 },
+          { id: 633, name: '扶余市', code: 220781 }
+        ]
+      },
+      {
+        id: 634,
+        name: '白城市',
+        code: 220800,
+        parentOrganId: 579,
+        areas: [
+          { id: 635, name: '洮北区', code: 220802 },
+          { id: 636, name: '镇赉县', code: 220821 },
+          { id: 637, name: '通榆县', code: 220822 },
+          { id: 638, name: '洮南市', code: 220881 },
+          { id: 639, name: '大安市', code: 220882 }
+        ]
+      },
+      {
+        id: 640,
+        name: '延边朝鲜族自治州',
+        code: 222400,
+        parentOrganId: 579,
+        areas: [
+          { id: 641, name: '延吉市', code: 222401 },
+          { id: 642, name: '图们市', code: 222402 },
+          { id: 643, name: '敦化市', code: 222403 },
+          { id: 644, name: '珲春市', code: 222404 },
+          { id: 645, name: '龙井市', code: 222405 },
+          { id: 646, name: '和龙市', code: 222406 },
+          { id: 647, name: '汪清县', code: 222424 },
+          { id: 648, name: '安图县', code: 222426 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 649,
+    name: '黑龙江省',
+    code: 230000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 650,
+        name: '哈尔滨市',
+        code: 230100,
+        parentOrganId: 649,
+        areas: [
+          { id: 651, name: '道里区', code: 230102 },
+          { id: 652, name: '南岗区', code: 230103 },
+          { id: 653, name: '道外区', code: 230104 },
+          { id: 654, name: '平房区', code: 230108 },
+          { id: 655, name: '松北区', code: 230109 },
+          { id: 656, name: '香坊区', code: 230110 },
+          { id: 657, name: '呼兰区', code: 230111 },
+          { id: 658, name: '阿城区', code: 230112 },
+          { id: 659, name: '双城区', code: 230113 },
+          { id: 660, name: '依兰县', code: 230123 },
+          { id: 661, name: '方正县', code: 230124 },
+          { id: 662, name: '宾县', code: 230125 },
+          { id: 663, name: '巴彦县', code: 230126 },
+          { id: 664, name: '木兰县', code: 230127 },
+          { id: 665, name: '通河县', code: 230128 },
+          { id: 666, name: '延寿县', code: 230129 },
+          { id: 667, name: '尚志市', code: 230183 },
+          { id: 668, name: '五常市', code: 230184 }
+        ]
+      },
+      {
+        id: 669,
+        name: '齐齐哈尔市',
+        code: 230200,
+        parentOrganId: 649,
+        areas: [
+          { id: 670, name: '龙沙区', code: 230202 },
+          { id: 671, name: '建华区', code: 230203 },
+          { id: 672, name: '铁锋区', code: 230204 },
+          { id: 673, name: '昂昂溪区', code: 230205 },
+          { id: 674, name: '富拉尔基区', code: 230206 },
+          { id: 675, name: '碾子山区', code: 230207 },
+          { id: 676, name: '梅里斯达斡尔族区', code: 230208 },
+          { id: 677, name: '龙江县', code: 230221 },
+          { id: 678, name: '依安县', code: 230223 },
+          { id: 679, name: '泰来县', code: 230224 },
+          { id: 680, name: '甘南县', code: 230225 },
+          { id: 681, name: '富裕县', code: 230227 },
+          { id: 682, name: '克山县', code: 230229 },
+          { id: 683, name: '克东县', code: 230230 },
+          { id: 684, name: '拜泉县', code: 230231 },
+          { id: 685, name: '讷河市', code: 230281 }
+        ]
+      },
+      {
+        id: 686,
+        name: '鸡西市',
+        code: 230300,
+        parentOrganId: 649,
+        areas: [
+          { id: 687, name: '鸡冠区', code: 230302 },
+          { id: 688, name: '恒山区', code: 230303 },
+          { id: 689, name: '滴道区', code: 230304 },
+          { id: 690, name: '梨树区', code: 230305 },
+          { id: 691, name: '城子河区', code: 230306 },
+          { id: 692, name: '麻山区', code: 230307 },
+          { id: 693, name: '鸡东县', code: 230321 },
+          { id: 694, name: '虎林市', code: 230381 },
+          { id: 695, name: '密山市', code: 230382 }
+        ]
+      },
+      {
+        id: 696,
+        name: '鹤岗市',
+        code: 230400,
+        parentOrganId: 649,
+        areas: [
+          { id: 697, name: '向阳区', code: 230402 },
+          { id: 698, name: '工农区', code: 230403 },
+          { id: 699, name: '南山区', code: 230404 },
+          { id: 700, name: '兴安区', code: 230405 },
+          { id: 701, name: '东山区', code: 230406 },
+          { id: 702, name: '兴山区', code: 230407 },
+          { id: 703, name: '萝北县', code: 230421 },
+          { id: 704, name: '绥滨县', code: 230422 }
+        ]
+      },
+      {
+        id: 705,
+        name: '双鸭山市',
+        code: 230500,
+        parentOrganId: 649,
+        areas: [
+          { id: 706, name: '尖山区', code: 230502 },
+          { id: 707, name: '岭东区', code: 230503 },
+          { id: 708, name: '四方台区', code: 230505 },
+          { id: 709, name: '宝山区', code: 230506 },
+          { id: 710, name: '集贤县', code: 230521 },
+          { id: 711, name: '友谊县', code: 230522 },
+          { id: 712, name: '宝清县', code: 230523 },
+          { id: 713, name: '饶河县', code: 230524 }
+        ]
+      },
+      {
+        id: 714,
+        name: '大庆市',
+        code: 230600,
+        parentOrganId: 649,
+        areas: [
+          { id: 715, name: '萨尔图区', code: 230602 },
+          { id: 716, name: '龙凤区', code: 230603 },
+          { id: 717, name: '让胡路区', code: 230604 },
+          { id: 718, name: '红岗区', code: 230605 },
+          { id: 719, name: '大同区', code: 230606 },
+          { id: 720, name: '肇州县', code: 230621 },
+          { id: 721, name: '肇源县', code: 230622 },
+          { id: 722, name: '林甸县', code: 230623 },
+          { id: 723, name: '杜尔伯特蒙古族自治县', code: 230624 }
+        ]
+      },
+      {
+        id: 724,
+        name: '伊春市',
+        code: 230700,
+        parentOrganId: 649,
+        areas: [
+          { id: 725, name: '伊春区', code: 230702 },
+          { id: 726, name: '南岔区', code: 230703 },
+          { id: 727, name: '友好区', code: 230704 },
+          { id: 728, name: '西林区', code: 230705 },
+          { id: 729, name: '翠峦区', code: 230706 },
+          { id: 730, name: '新青区', code: 230707 },
+          { id: 731, name: '美溪区', code: 230708 },
+          { id: 732, name: '金山屯区', code: 230709 },
+          { id: 733, name: '五营区', code: 230710 },
+          { id: 734, name: '乌马河区', code: 230711 },
+          { id: 735, name: '汤旺河区', code: 230712 },
+          { id: 736, name: '带岭区', code: 230713 },
+          { id: 737, name: '乌伊岭区', code: 230714 },
+          { id: 738, name: '红星区', code: 230715 },
+          { id: 739, name: '上甘岭区', code: 230716 },
+          { id: 740, name: '嘉荫县', code: 230722 },
+          { id: 741, name: '铁力市', code: 230781 }
+        ]
+      },
+      {
+        id: 742,
+        name: '佳木斯市',
+        code: 230800,
+        parentOrganId: 649,
+        areas: [
+          { id: 743, name: '向阳区', code: 230803 },
+          { id: 744, name: '前进区', code: 230804 },
+          { id: 745, name: '东风区', code: 230805 },
+          { id: 746, name: '郊区', code: 230811 },
+          { id: 747, name: '桦南县', code: 230822 },
+          { id: 748, name: '桦川县', code: 230826 },
+          { id: 749, name: '汤原县', code: 230828 },
+          { id: 750, name: '同江市', code: 230881 },
+          { id: 751, name: '富锦市', code: 230882 },
+          { id: 752, name: '抚远市', code: 230883 }
+        ]
+      },
+      {
+        id: 753,
+        name: '七台河市',
+        code: 230900,
+        parentOrganId: 649,
+        areas: [
+          { id: 754, name: '新兴区', code: 230902 },
+          { id: 755, name: '桃山区', code: 230903 },
+          { id: 756, name: '茄子河区', code: 230904 },
+          { id: 757, name: '勃利县', code: 230921 }
+        ]
+      },
+      {
+        id: 758,
+        name: '牡丹江市',
+        code: 231000,
+        parentOrganId: 649,
+        areas: [
+          { id: 759, name: '东安区', code: 231002 },
+          { id: 760, name: '阳明区', code: 231003 },
+          { id: 761, name: '爱民区', code: 231004 },
+          { id: 762, name: '西安区', code: 231005 },
+          { id: 763, name: '林口县', code: 231025 },
+          { id: 764, name: '绥芬河市', code: 231081 },
+          { id: 765, name: '海林市', code: 231083 },
+          { id: 766, name: '宁安市', code: 231084 },
+          { id: 767, name: '穆棱市', code: 231085 },
+          { id: 768, name: '东宁市', code: 231086 }
+        ]
+      },
+      {
+        id: 769,
+        name: '黑河市',
+        code: 231100,
+        parentOrganId: 649,
+        areas: [
+          { id: 770, name: '爱辉区', code: 231102 },
+          { id: 771, name: '嫩江县', code: 231121 },
+          { id: 772, name: '逊克县', code: 231123 },
+          { id: 773, name: '孙吴县', code: 231124 },
+          { id: 774, name: '北安市', code: 231181 },
+          { id: 775, name: '五大连池市', code: 231182 }
+        ]
+      },
+      {
+        id: 776,
+        name: '绥化市',
+        code: 231200,
+        parentOrganId: 649,
+        areas: [
+          { id: 777, name: '北林区', code: 231202 },
+          { id: 778, name: '望奎县', code: 231221 },
+          { id: 779, name: '兰西县', code: 231222 },
+          { id: 780, name: '青冈县', code: 231223 },
+          { id: 781, name: '庆安县', code: 231224 },
+          { id: 782, name: '明水县', code: 231225 },
+          { id: 783, name: '绥棱县', code: 231226 },
+          { id: 784, name: '安达市', code: 231281 },
+          { id: 785, name: '肇东市', code: 231282 },
+          { id: 786, name: '海伦市', code: 231283 }
+        ]
+      },
+      {
+        id: 787,
+        name: '大兴安岭地区',
+        code: 232700,
+        parentOrganId: 649,
+        areas: [
+          { id: 788, name: '加格达奇区', code: 232701 },
+          { id: 789, name: '呼玛县', code: 232721 },
+          { id: 790, name: '塔河县', code: 232722 },
+          { id: 791, name: '漠河县', code: 232723 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 792,
+    name: '上海市',
+    code: 310000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 793,
+        name: '上海城区',
+        code: 310100,
+        parentOrganId: 792,
+        areas: [
+          { id: 794, name: '黄浦区', code: 310101 },
+          { id: 795, name: '徐汇区', code: 310104 },
+          { id: 796, name: '长宁区', code: 310105 },
+          { id: 797, name: '静安区', code: 310106 },
+          { id: 798, name: '普陀区', code: 310107 },
+          { id: 799, name: '虹口区', code: 310109 },
+          { id: 800, name: '杨浦区', code: 310110 },
+          { id: 801, name: '闵行区', code: 310112 },
+          { id: 802, name: '宝山区', code: 310113 },
+          { id: 803, name: '嘉定区', code: 310114 },
+          { id: 804, name: '浦东新区', code: 310115 },
+          { id: 805, name: '金山区', code: 310116 },
+          { id: 806, name: '松江区', code: 310117 },
+          { id: 807, name: '青浦区', code: 310118 },
+          { id: 808, name: '奉贤区', code: 310120 },
+          { id: 809, name: '崇明区', code: 310151 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 810,
+    name: '江苏省',
+    code: 320000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 811,
+        name: '南京市',
+        code: 320100,
+        parentOrganId: 810,
+        areas: [
+          { id: 812, name: '玄武区', code: 320102 },
+          { id: 813, name: '秦淮区', code: 320104 },
+          { id: 814, name: '建邺区', code: 320105 },
+          { id: 815, name: '鼓楼区', code: 320106 },
+          { id: 816, name: '浦口区', code: 320111 },
+          { id: 817, name: '栖霞区', code: 320113 },
+          { id: 818, name: '雨花台区', code: 320114 },
+          { id: 819, name: '江宁区', code: 320115 },
+          { id: 820, name: '六合区', code: 320116 },
+          { id: 821, name: '溧水区', code: 320117 },
+          { id: 822, name: '高淳区', code: 320118 }
+        ]
+      },
+      {
+        id: 823,
+        name: '无锡市',
+        code: 320200,
+        parentOrganId: 810,
+        areas: [
+          { id: 824, name: '锡山区', code: 320205 },
+          { id: 825, name: '惠山区', code: 320206 },
+          { id: 826, name: '滨湖区', code: 320211 },
+          { id: 827, name: '梁溪区', code: 320213 },
+          { id: 828, name: '新吴区', code: 320214 },
+          { id: 829, name: '江阴市', code: 320281 },
+          { id: 830, name: '宜兴市', code: 320282 }
+        ]
+      },
+      {
+        id: 831,
+        name: '徐州市',
+        code: 320300,
+        parentOrganId: 810,
+        areas: [
+          { id: 832, name: '鼓楼区', code: 320302 },
+          { id: 833, name: '云龙区', code: 320303 },
+          { id: 834, name: '贾汪区', code: 320305 },
+          { id: 835, name: '泉山区', code: 320311 },
+          { id: 836, name: '铜山区', code: 320312 },
+          { id: 837, name: '丰县', code: 320321 },
+          { id: 838, name: '沛县', code: 320322 },
+          { id: 839, name: '睢宁县', code: 320324 },
+          { id: 840, name: '新沂市', code: 320381 },
+          { id: 841, name: '邳州市', code: 320382 }
+        ]
+      },
+      {
+        id: 842,
+        name: '常州市',
+        code: 320400,
+        parentOrganId: 810,
+        areas: [
+          { id: 843, name: '天宁区', code: 320402 },
+          { id: 844, name: '钟楼区', code: 320404 },
+          { id: 845, name: '新北区', code: 320411 },
+          { id: 846, name: '武进区', code: 320412 },
+          { id: 847, name: '金坛区', code: 320413 },
+          { id: 848, name: '溧阳市', code: 320481 }
+        ]
+      },
+      {
+        id: 849,
+        name: '苏州市',
+        code: 320500,
+        parentOrganId: 810,
+        areas: [
+          { id: 850, name: '虎丘区', code: 320505 },
+          { id: 851, name: '吴中区', code: 320506 },
+          { id: 852, name: '相城区', code: 320507 },
+          { id: 853, name: '姑苏区', code: 320508 },
+          { id: 854, name: '吴江区', code: 320509 },
+          { id: 855, name: '常熟市', code: 320581 },
+          { id: 856, name: '张家港市', code: 320582 },
+          { id: 857, name: '昆山市', code: 320583 },
+          { id: 858, name: '太仓市', code: 320585 }
+        ]
+      },
+      {
+        id: 859,
+        name: '南通市',
+        code: 320600,
+        parentOrganId: 810,
+        areas: [
+          { id: 860, name: '崇川区', code: 320602 },
+          { id: 861, name: '港闸区', code: 320611 },
+          { id: 862, name: '通州区', code: 320612 },
+          { id: 863, name: '海安县', code: 320621 },
+          { id: 864, name: '如东县', code: 320623 },
+          { id: 865, name: '启东市', code: 320681 },
+          { id: 866, name: '如皋市', code: 320682 },
+          { id: 867, name: '海门市', code: 320684 }
+        ]
+      },
+      {
+        id: 868,
+        name: '连云港市',
+        code: 320700,
+        parentOrganId: 810,
+        areas: [
+          { id: 869, name: '连云区', code: 320703 },
+          { id: 870, name: '海州区', code: 320706 },
+          { id: 871, name: '赣榆区', code: 320707 },
+          { id: 872, name: '东海县', code: 320722 },
+          { id: 873, name: '灌云县', code: 320723 },
+          { id: 874, name: '灌南县', code: 320724 }
+        ]
+      },
+      {
+        id: 875,
+        name: '淮安市',
+        code: 320800,
+        parentOrganId: 810,
+        areas: [
+          { id: 876, name: '清江浦区', code: 320812 },
+          { id: 877, name: '淮安区', code: 320803 },
+          { id: 878, name: '淮阴区', code: 320804 },
+          { id: 879, name: '洪泽区', code: 320813 },
+          { id: 880, name: '涟水县', code: 320826 },
+          { id: 881, name: '盱眙县', code: 320830 },
+          { id: 882, name: '金湖县', code: 320831 }
+        ]
+      },
+      {
+        id: 883,
+        name: '盐城市',
+        code: 320900,
+        parentOrganId: 810,
+        areas: [
+          { id: 884, name: '亭湖区', code: 320902 },
+          { id: 885, name: '盐都区', code: 320903 },
+          { id: 886, name: '大丰区', code: 320904 },
+          { id: 887, name: '响水县', code: 320921 },
+          { id: 888, name: '滨海县', code: 320922 },
+          { id: 889, name: '阜宁县', code: 320923 },
+          { id: 890, name: '射阳县', code: 320924 },
+          { id: 891, name: '建湖县', code: 320925 },
+          { id: 892, name: '东台市', code: 320981 }
+        ]
+      },
+      {
+        id: 893,
+        name: '扬州市',
+        code: 321000,
+        parentOrganId: 810,
+        areas: [
+          { id: 894, name: '广陵区', code: 321002 },
+          { id: 895, name: '邗江区', code: 321003 },
+          { id: 896, name: '江都区', code: 321012 },
+          { id: 897, name: '宝应县', code: 321023 },
+          { id: 898, name: '仪征市', code: 321081 },
+          { id: 899, name: '高邮市', code: 321084 }
+        ]
+      },
+      {
+        id: 900,
+        name: '镇江市',
+        code: 321100,
+        parentOrganId: 810,
+        areas: [
+          { id: 901, name: '京口区', code: 321102 },
+          { id: 902, name: '润州区', code: 321111 },
+          { id: 903, name: '丹徒区', code: 321112 },
+          { id: 904, name: '丹阳市', code: 321181 },
+          { id: 905, name: '扬中市', code: 321182 },
+          { id: 906, name: '句容市', code: 321183 }
+        ]
+      },
+      {
+        id: 907,
+        name: '泰州市',
+        code: 321200,
+        parentOrganId: 810,
+        areas: [
+          { id: 908, name: '海陵区', code: 321202 },
+          { id: 909, name: '高港区', code: 321203 },
+          { id: 910, name: '姜堰区', code: 321204 },
+          { id: 911, name: '兴化市', code: 321281 },
+          { id: 912, name: '靖江市', code: 321282 },
+          { id: 913, name: '泰兴市', code: 321283 }
+        ]
+      },
+      {
+        id: 914,
+        name: '宿迁市',
+        code: 321300,
+        parentOrganId: 810,
+        areas: [
+          { id: 915, name: '宿城区', code: 321302 },
+          { id: 916, name: '宿豫区', code: 321311 },
+          { id: 917, name: '沭阳县', code: 321322 },
+          { id: 918, name: '泗阳县', code: 321323 },
+          { id: 919, name: '泗洪县', code: 321324 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 920,
+    name: '浙江省',
+    code: 330000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 921,
+        name: '杭州市',
+        code: 330100,
+        parentOrganId: 920,
+        areas: [
+          { id: 922, name: '上城区', code: 330102 },
+          { id: 923, name: '下城区', code: 330103 },
+          { id: 924, name: '江干区', code: 330104 },
+          { id: 925, name: '拱墅区', code: 330105 },
+          { id: 926, name: '西湖区', code: 330106 },
+          { id: 927, name: '滨江区', code: 330108 },
+          { id: 928, name: '萧山区', code: 330109 },
+          { id: 929, name: '余杭区', code: 330110 },
+          { id: 930, name: '富阳区', code: 330111 },
+          { id: 931, name: '桐庐县', code: 330122 },
+          { id: 932, name: '淳安县', code: 330127 },
+          { id: 933, name: '建德市', code: 330182 },
+          { id: 934, name: '临安市', code: 330185 }
+        ]
+      },
+      {
+        id: 935,
+        name: '宁波市',
+        code: 330200,
+        parentOrganId: 920,
+        areas: [
+          { id: 936, name: '海曙区', code: 330203 },
+          { id: 937, name: '江北区', code: 330205 },
+          { id: 938, name: '北仑区', code: 330206 },
+          { id: 939, name: '镇海区', code: 330211 },
+          { id: 940, name: '鄞州区', code: 330212 },
+          { id: 941, name: '象山县', code: 330225 },
+          { id: 942, name: '宁海县', code: 330226 },
+          { id: 943, name: '余姚市', code: 330281 },
+          { id: 944, name: '慈溪市', code: 330282 },
+          { id: 945, name: '奉化区', code: 330213 }
+        ]
+      },
+      {
+        id: 946,
+        name: '温州市',
+        code: 330300,
+        parentOrganId: 920,
+        areas: [
+          { id: 947, name: '鹿城区', code: 330302 },
+          { id: 948, name: '龙湾区', code: 330303 },
+          { id: 949, name: '瓯海区', code: 330304 },
+          { id: 950, name: '洞头区', code: 330305 },
+          { id: 951, name: '永嘉县', code: 330324 },
+          { id: 952, name: '平阳县', code: 330326 },
+          { id: 953, name: '苍南县', code: 330327 },
+          { id: 954, name: '文成县', code: 330328 },
+          { id: 955, name: '泰顺县', code: 330329 },
+          { id: 956, name: '瑞安市', code: 330381 },
+          { id: 957, name: '乐清市', code: 330382 }
+        ]
+      },
+      {
+        id: 958,
+        name: '嘉兴市',
+        code: 330400,
+        parentOrganId: 920,
+        areas: [
+          { id: 959, name: '南湖区', code: 330402 },
+          { id: 960, name: '秀洲区', code: 330411 },
+          { id: 961, name: '嘉善县', code: 330421 },
+          { id: 962, name: '海盐县', code: 330424 },
+          { id: 963, name: '海宁市', code: 330481 },
+          { id: 964, name: '平湖市', code: 330482 },
+          { id: 965, name: '桐乡市', code: 330483 }
+        ]
+      },
+      {
+        id: 966,
+        name: '湖州市',
+        code: 330500,
+        parentOrganId: 920,
+        areas: [
+          { id: 967, name: '吴兴区', code: 330502 },
+          { id: 968, name: '南浔区', code: 330503 },
+          { id: 969, name: '德清县', code: 330521 },
+          { id: 970, name: '长兴县', code: 330522 },
+          { id: 971, name: '安吉县', code: 330523 }
+        ]
+      },
+      {
+        id: 972,
+        name: '绍兴市',
+        code: 330600,
+        parentOrganId: 920,
+        areas: [
+          { id: 973, name: '越城区', code: 330602 },
+          { id: 974, name: '柯桥区', code: 330603 },
+          { id: 975, name: '上虞区', code: 330604 },
+          { id: 976, name: '新昌县', code: 330624 },
+          { id: 977, name: '诸暨市', code: 330681 },
+          { id: 978, name: '嵊州市', code: 330683 }
+        ]
+      },
+      {
+        id: 979,
+        name: '金华市',
+        code: 330700,
+        parentOrganId: 920,
+        areas: [
+          { id: 980, name: '婺城区', code: 330702 },
+          { id: 981, name: '金东区', code: 330703 },
+          { id: 982, name: '武义县', code: 330723 },
+          { id: 983, name: '浦江县', code: 330726 },
+          { id: 984, name: '磐安县', code: 330727 },
+          { id: 985, name: '兰溪市', code: 330781 },
+          { id: 986, name: '义乌市', code: 330782 },
+          { id: 987, name: '东阳市', code: 330783 },
+          { id: 988, name: '永康市', code: 330784 }
+        ]
+      },
+      {
+        id: 989,
+        name: '衢州市',
+        code: 330800,
+        parentOrganId: 920,
+        areas: [
+          { id: 990, name: '柯城区', code: 330802 },
+          { id: 991, name: '衢江区', code: 330803 },
+          { id: 992, name: '常山县', code: 330822 },
+          { id: 993, name: '开化县', code: 330824 },
+          { id: 994, name: '龙游县', code: 330825 },
+          { id: 995, name: '江山市', code: 330881 }
+        ]
+      },
+      {
+        id: 996,
+        name: '舟山市',
+        code: 330900,
+        parentOrganId: 920,
+        areas: [
+          { id: 997, name: '定海区', code: 330902 },
+          { id: 998, name: '普陀区', code: 330903 },
+          { id: 999, name: '岱山县', code: 330921 },
+          { id: 1000, name: '嵊泗县', code: 330922 }
+        ]
+      },
+      {
+        id: 1001,
+        name: '台州市',
+        code: 331000,
+        parentOrganId: 920,
+        areas: [
+          { id: 1002, name: '椒江区', code: 331002 },
+          { id: 1003, name: '黄岩区', code: 331003 },
+          { id: 1004, name: '路桥区', code: 331004 },
+          { id: 1005, name: '玉环市', code: 331021 },
+          { id: 1006, name: '三门县', code: 331022 },
+          { id: 1007, name: '天台县', code: 331023 },
+          { id: 1008, name: '仙居县', code: 331024 },
+          { id: 1009, name: '温岭市', code: 331081 },
+          { id: 1010, name: '临海市', code: 331082 }
+        ]
+      },
+      {
+        id: 1011,
+        name: '丽水市',
+        code: 331100,
+        parentOrganId: 920,
+        areas: [
+          { id: 1012, name: '莲都区', code: 331102 },
+          { id: 1013, name: '青田县', code: 331121 },
+          { id: 1014, name: '缙云县', code: 331122 },
+          { id: 1015, name: '遂昌县', code: 331123 },
+          { id: 1016, name: '松阳县', code: 331124 },
+          { id: 1017, name: '云和县', code: 331125 },
+          { id: 1018, name: '庆元县', code: 331126 },
+          { id: 1019, name: '景宁畲族自治县', code: 331127 },
+          { id: 1020, name: '龙泉市', code: 331181 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 1021,
+    name: '安徽省',
+    code: 340000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 1022,
+        name: '合肥市',
+        code: 340100,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1023, name: '瑶海区', code: 340102 },
+          { id: 1024, name: '庐阳区', code: 340103 },
+          { id: 1025, name: '蜀山区', code: 340104 },
+          { id: 1026, name: '包河区', code: 340111 },
+          { id: 1027, name: '长丰县', code: 340121 },
+          { id: 1028, name: '肥东县', code: 340122 },
+          { id: 1029, name: '肥西县', code: 340123 },
+          { id: 1030, name: '庐江县', code: 340124 },
+          { id: 1031, name: '巢湖市', code: 340181 }
+        ]
+      },
+      {
+        id: 1032,
+        name: '芜湖市',
+        code: 340200,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1033, name: '镜湖区', code: 340202 },
+          { id: 1034, name: '弋江区', code: 340203 },
+          { id: 1035, name: '鸠江区', code: 340207 },
+          { id: 1036, name: '三山区', code: 340208 },
+          { id: 1037, name: '芜湖县', code: 340221 },
+          { id: 1038, name: '繁昌县', code: 340222 },
+          { id: 1039, name: '南陵县', code: 340223 },
+          { id: 1040, name: '无为县', code: 340225 }
+        ]
+      },
+      {
+        id: 1041,
+        name: '蚌埠市',
+        code: 340300,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1042, name: '龙子湖区', code: 340302 },
+          { id: 1043, name: '蚌山区', code: 340303 },
+          { id: 1044, name: '禹会区', code: 340304 },
+          { id: 1045, name: '淮上区', code: 340311 },
+          { id: 1046, name: '怀远县', code: 340321 },
+          { id: 1047, name: '五河县', code: 340322 },
+          { id: 1048, name: '固镇县', code: 340323 }
+        ]
+      },
+      {
+        id: 1049,
+        name: '淮南市',
+        code: 340400,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1050, name: '大通区', code: 340402 },
+          { id: 1051, name: '田家庵区', code: 340403 },
+          { id: 1052, name: '谢家集区', code: 340404 },
+          { id: 1053, name: '八公山区', code: 340405 },
+          { id: 1054, name: '潘集区', code: 340406 },
+          { id: 1055, name: '凤台县', code: 340421 },
+          { id: 1056, name: '寿县', code: 340422 }
+        ]
+      },
+      {
+        id: 1057,
+        name: '马鞍山市',
+        code: 340500,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1058, name: '花山区', code: 340503 },
+          { id: 1059, name: '雨山区', code: 340504 },
+          { id: 1060, name: '博望区', code: 340506 },
+          { id: 1061, name: '当涂县', code: 340521 },
+          { id: 1062, name: '含山县', code: 340522 },
+          { id: 1063, name: '和县', code: 340523 }
+        ]
+      },
+      {
+        id: 1064,
+        name: '淮北市',
+        code: 340600,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1065, name: '杜集区', code: 340602 },
+          { id: 1066, name: '相山区', code: 340603 },
+          { id: 1067, name: '烈山区', code: 340604 },
+          { id: 1068, name: '濉溪县', code: 340621 }
+        ]
+      },
+      {
+        id: 1069,
+        name: '铜陵市',
+        code: 340700,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1070, name: '铜官区', code: 340705 },
+          { id: 1071, name: '义安区', code: 340706 },
+          { id: 1072, name: '郊区', code: 340711 },
+          { id: 1073, name: '枞阳县', code: 340722 }
+        ]
+      },
+      {
+        id: 1074,
+        name: '安庆市',
+        code: 340800,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1075, name: '迎江区', code: 340802 },
+          { id: 1076, name: '大观区', code: 340803 },
+          { id: 1077, name: '宜秀区', code: 340811 },
+          { id: 1078, name: '怀宁县', code: 340822 },
+          { id: 1079, name: '潜山县', code: 340824 },
+          { id: 1080, name: '太湖县', code: 340825 },
+          { id: 1081, name: '宿松县', code: 340826 },
+          { id: 1082, name: '望江县', code: 340827 },
+          { id: 1083, name: '岳西县', code: 340828 },
+          { id: 1084, name: '桐城市', code: 340881 }
+        ]
+      },
+      {
+        id: 1085,
+        name: '黄山市',
+        code: 341000,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1086, name: '屯溪区', code: 341002 },
+          { id: 1087, name: '黄山区', code: 341003 },
+          { id: 1088, name: '徽州区', code: 341004 },
+          { id: 1089, name: '歙县', code: 341021 },
+          { id: 1090, name: '休宁县', code: 341022 },
+          { id: 1091, name: '黟县', code: 341023 },
+          { id: 1092, name: '祁门县', code: 341024 }
+        ]
+      },
+      {
+        id: 1093,
+        name: '滁州市',
+        code: 341100,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1094, name: '琅琊区', code: 341102 },
+          { id: 1095, name: '南谯区', code: 341103 },
+          { id: 1096, name: '来安县', code: 341122 },
+          { id: 1097, name: '全椒县', code: 341124 },
+          { id: 1098, name: '定远县', code: 341125 },
+          { id: 1099, name: '凤阳县', code: 341126 },
+          { id: 1100, name: '天长市', code: 341181 },
+          { id: 1101, name: '明光市', code: 341182 }
+        ]
+      },
+      {
+        id: 1102,
+        name: '阜阳市',
+        code: 341200,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1103, name: '颍州区', code: 341202 },
+          { id: 1104, name: '颍东区', code: 341203 },
+          { id: 1105, name: '颍泉区', code: 341204 },
+          { id: 1106, name: '临泉县', code: 341221 },
+          { id: 1107, name: '太和县', code: 341222 },
+          { id: 1108, name: '阜南县', code: 341225 },
+          { id: 1109, name: '颍上县', code: 341226 },
+          { id: 1110, name: '界首市', code: 341282 }
+        ]
+      },
+      {
+        id: 1111,
+        name: '宿州市',
+        code: 341300,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1112, name: '埇桥区', code: 341302 },
+          { id: 1113, name: '砀山县', code: 341321 },
+          { id: 1114, name: '萧县', code: 341322 },
+          { id: 1115, name: '灵璧县', code: 341323 },
+          { id: 1116, name: '泗县', code: 341324 }
+        ]
+      },
+      {
+        id: 1117,
+        name: '六安市',
+        code: 341500,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1118, name: '金安区', code: 341502 },
+          { id: 1119, name: '裕安区', code: 341503 },
+          { id: 1120, name: '叶集区', code: 341504 },
+          { id: 1121, name: '霍邱县', code: 341522 },
+          { id: 1122, name: '舒城县', code: 341523 },
+          { id: 1123, name: '金寨县', code: 341524 },
+          { id: 1124, name: '霍山县', code: 341525 }
+        ]
+      },
+      {
+        id: 1125,
+        name: '亳州市',
+        code: 341600,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1126, name: '谯城区', code: 341602 },
+          { id: 1127, name: '涡阳县', code: 341621 },
+          { id: 1128, name: '蒙城县', code: 341622 },
+          { id: 1129, name: '利辛县', code: 341623 }
+        ]
+      },
+      {
+        id: 1130,
+        name: '池州市',
+        code: 341700,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1131, name: '贵池区', code: 341702 },
+          { id: 1132, name: '东至县', code: 341721 },
+          { id: 1133, name: '石台县', code: 341722 },
+          { id: 1134, name: '青阳县', code: 341723 }
+        ]
+      },
+      {
+        id: 1135,
+        name: '宣城市',
+        code: 341800,
+        parentOrganId: 1021,
+        areas: [
+          { id: 1136, name: '宣州区', code: 341802 },
+          { id: 1137, name: '郎溪县', code: 341821 },
+          { id: 1138, name: '广德县', code: 341822 },
+          { id: 1139, name: '泾县', code: 341823 },
+          { id: 1140, name: '绩溪县', code: 341824 },
+          { id: 1141, name: '旌德县', code: 341825 },
+          { id: 1142, name: '宁国市', code: 341881 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 1143,
+    name: '福建省',
+    code: 350000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 1144,
+        name: '福州市',
+        code: 350100,
+        parentOrganId: 1143,
+        areas: [
+          { id: 1145, name: '鼓楼区', code: 350102 },
+          { id: 1146, name: '台江区', code: 350103 },
+          { id: 1147, name: '仓山区', code: 350104 },
+          { id: 1148, name: '马尾区', code: 350105 },
+          { id: 1149, name: '晋安区', code: 350111 },
+          { id: 1150, name: '闽侯县', code: 350121 },
+          { id: 1151, name: '连江县', code: 350122 },
+          { id: 1152, name: '罗源县', code: 350123 },
+          { id: 1153, name: '闽清县', code: 350124 },
+          { id: 1154, name: '永泰县', code: 350125 },
+          { id: 1155, name: '平潭县', code: 350128 },
+          { id: 1156, name: '福清市', code: 350181 },
+          { id: 1157, name: '长乐市', code: 350182 }
+        ]
+      },
+      {
+        id: 1158,
+        name: '厦门市',
+        code: 350200,
+        parentOrganId: 1143,
+        areas: [
+          { id: 1159, name: '思明区', code: 350203 },
+          { id: 1160, name: '海沧区', code: 350205 },
+          { id: 1161, name: '湖里区', code: 350206 },
+          { id: 1162, name: '集美区', code: 350211 },
+          { id: 1163, name: '同安区', code: 350212 },
+          { id: 1164, name: '翔安区', code: 350213 }
+        ]
+      },
+      {
+        id: 1165,
+        name: '莆田市',
+        code: 350300,
+        parentOrganId: 1143,
+        areas: [
+          { id: 1166, name: '城厢区', code: 350302 },
+          { id: 1167, name: '涵江区', code: 350303 },
+          { id: 1168, name: '荔城区', code: 350304 },
+          { id: 1169, name: '秀屿区', code: 350305 },
+          { id: 1170, name: '仙游县', code: 350322 }
+        ]
+      },
+      {
+        id: 1171,
+        name: '三明市',
+        code: 350400,
+        parentOrganId: 1143,
+        areas: [
+          { id: 1172, name: '梅列区', code: 350402 },
+          { id: 1173, name: '三元区', code: 350403 },
+          { id: 1174, name: '明溪县', code: 350421 },
+          { id: 1175, name: '清流县', code: 350423 },
+          { id: 1176, name: '宁化县', code: 350424 },
+          { id: 1177, name: '大田县', code: 350425 },
+          { id: 1178, name: '尤溪县', code: 350426 },
+          { id: 1179, name: '沙县', code: 350427 },
+          { id: 1180, name: '将乐县', code: 350428 },
+          { id: 1181, name: '泰宁县', code: 350429 },
+          { id: 1182, name: '建宁县', code: 350430 },
+          { id: 1183, name: '永安市', code: 350481 }
+        ]
+      },
+      {
+        id: 1184,
+        name: '泉州市',
+        code: 350500,
+        parentOrganId: 1143,
+        areas: [
+          { id: 1185, name: '鲤城区', code: 350502 },
+          { id: 1186, name: '丰泽区', code: 350503 },
+          { id: 1187, name: '洛江区', code: 350504 },
+          { id: 1188, name: '泉港区', code: 350505 },
+          { id: 1189, name: '惠安县', code: 350521 },
+          { id: 1190, name: '安溪县', code: 350524 },
+          { id: 1191, name: '永春县', code: 350525 },
+          { id: 1192, name: '德化县', code: 350526 },
+          { id: 1193, name: '金门县', code: 350527 },
+          { id: 1194, name: '石狮市', code: 350581 },
+          { id: 1195, name: '晋江市', code: 350582 },
+          { id: 1196, name: '南安市', code: 350583 }
+        ]
+      },
+      {
+        id: 1197,
+        name: '漳州市',
+        code: 350600,
+        parentOrganId: 1143,
+        areas: [
+          { id: 1198, name: '芗城区', code: 350602 },
+          { id: 1199, name: '龙文区', code: 350603 },
+          { id: 1200, name: '云霄县', code: 350622 },
+          { id: 1201, name: '漳浦县', code: 350623 },
+          { id: 1202, name: '诏安县', code: 350624 },
+          { id: 1203, name: '长泰县', code: 350625 },
+          { id: 1204, name: '东山县', code: 350626 },
+          { id: 1205, name: '南靖县', code: 350627 },
+          { id: 1206, name: '平和县', code: 350628 },
+          { id: 1207, name: '华安县', code: 350629 },
+          { id: 1208, name: '龙海市', code: 350681 }
+        ]
+      },
+      {
+        id: 1209,
+        name: '南平市',
+        code: 350700,
+        parentOrganId: 1143,
+        areas: [
+          { id: 1210, name: '延平区', code: 350702 },
+          { id: 1211, name: '建阳区', code: 350703 },
+          { id: 1212, name: '顺昌县', code: 350721 },
+          { id: 1213, name: '浦城县', code: 350722 },
+          { id: 1214, name: '光泽县', code: 350723 },
+          { id: 1215, name: '松溪县', code: 350724 },
+          { id: 1216, name: '政和县', code: 350725 },
+          { id: 1217, name: '邵武市', code: 350781 },
+          { id: 1218, name: '武夷山市', code: 350782 },
+          { id: 1219, name: '建瓯市', code: 350783 }
+        ]
+      },
+      {
+        id: 1220,
+        name: '龙岩市',
+        code: 350800,
+        parentOrganId: 1143,
+        areas: [
+          { id: 1221, name: '新罗区', code: 350802 },
+          { id: 1222, name: '永定区', code: 350803 },
+          { id: 1223, name: '长汀县', code: 350821 },
+          { id: 1224, name: '上杭县', code: 350823 },
+          { id: 1225, name: '武平县', code: 350824 },
+          { id: 1226, name: '连城县', code: 350825 },
+          { id: 1227, name: '漳平市', code: 350881 }
+        ]
+      },
+      {
+        id: 1228,
+        name: '宁德市',
+        code: 350900,
+        parentOrganId: 1143,
+        areas: [
+          { id: 1229, name: '蕉城区', code: 350902 },
+          { id: 1230, name: '霞浦县', code: 350921 },
+          { id: 1231, name: '古田县', code: 350922 },
+          { id: 1232, name: '屏南县', code: 350923 },
+          { id: 1233, name: '寿宁县', code: 350924 },
+          { id: 1234, name: '周宁县', code: 350925 },
+          { id: 1235, name: '柘荣县', code: 350926 },
+          { id: 1236, name: '福安市', code: 350981 },
+          { id: 1237, name: '福鼎市', code: 350982 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 1238,
+    name: '江西省',
+    code: 360000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 1239,
+        name: '南昌市',
+        code: 360100,
+        parentOrganId: 1238,
+        areas: [
+          { id: 1240, name: '东湖区', code: 360102 },
+          { id: 1241, name: '西湖区', code: 360103 },
+          { id: 1242, name: '青云谱区', code: 360104 },
+          { id: 1243, name: '湾里区', code: 360105 },
+          { id: 1244, name: '青山湖区', code: 360111 },
+          { id: 1245, name: '新建区', code: 360112 },
+          { id: 1246, name: '南昌县', code: 360121 },
+          { id: 1247, name: '安义县', code: 360123 },
+          { id: 1248, name: '进贤县', code: 360124 }
+        ]
+      },
+      {
+        id: 1249,
+        name: '景德镇市',
+        code: 360200,
+        parentOrganId: 1238,
+        areas: [
+          { id: 1250, name: '昌江区', code: 360202 },
+          { id: 1251, name: '珠山区', code: 360203 },
+          { id: 1252, name: '浮梁县', code: 360222 },
+          { id: 1253, name: '乐平市', code: 360281 }
+        ]
+      },
+      {
+        id: 1254,
+        name: '萍乡市',
+        code: 360300,
+        parentOrganId: 1238,
+        areas: [
+          { id: 1255, name: '安源区', code: 360302 },
+          { id: 1256, name: '湘东区', code: 360313 },
+          { id: 1257, name: '莲花县', code: 360321 },
+          { id: 1258, name: '上栗县', code: 360322 },
+          { id: 1259, name: '芦溪县', code: 360323 }
+        ]
+      },
+      {
+        id: 1260,
+        name: '九江市',
+        code: 360400,
+        parentOrganId: 1238,
+        areas: [
+          { id: 1261, name: '濂溪区', code: 360402 },
+          { id: 1262, name: '浔阳区', code: 360403 },
+          { id: 1263, name: '九江县', code: 360421 },
+          { id: 1264, name: '武宁县', code: 360423 },
+          { id: 1265, name: '修水县', code: 360424 },
+          { id: 1266, name: '永修县', code: 360425 },
+          { id: 1267, name: '德安县', code: 360426 },
+          { id: 1268, name: '庐山市', code: 360483 },
+          { id: 1269, name: '都昌县', code: 360428 },
+          { id: 1270, name: '湖口县', code: 360429 },
+          { id: 1271, name: '彭泽县', code: 360430 },
+          { id: 1272, name: '瑞昌市', code: 360481 },
+          { id: 1273, name: '共青城市', code: 360482 }
+        ]
+      },
+      {
+        id: 1274,
+        name: '新余市',
+        code: 360500,
+        parentOrganId: 1238,
+        areas: [
+          { id: 1275, name: '渝水区', code: 360502 },
+          { id: 1276, name: '分宜县', code: 360521 }
+        ]
+      },
+      {
+        id: 1277,
+        name: '鹰潭市',
+        code: 360600,
+        parentOrganId: 1238,
+        areas: [
+          { id: 1278, name: '月湖区', code: 360602 },
+          { id: 1279, name: '余江县', code: 360622 },
+          { id: 1280, name: '贵溪市', code: 360681 }
+        ]
+      },
+      {
+        id: 1281,
+        name: '赣州市',
+        code: 360700,
+        parentOrganId: 1238,
+        areas: [
+          { id: 1282, name: '章贡区', code: 360702 },
+          { id: 1283, name: '南康区', code: 360703 },
+          { id: 1284, name: '赣县区', code: 360704 },
+          { id: 1285, name: '信丰县', code: 360722 },
+          { id: 1286, name: '大余县', code: 360723 },
+          { id: 1287, name: '上犹县', code: 360724 },
+          { id: 1288, name: '崇义县', code: 360725 },
+          { id: 1289, name: '安远县', code: 360726 },
+          { id: 1290, name: '龙南县', code: 360727 },
+          { id: 1291, name: '定南县', code: 360728 },
+          { id: 1292, name: '全南县', code: 360729 },
+          { id: 1293, name: '宁都县', code: 360730 },
+          { id: 1294, name: '于都县', code: 360731 },
+          { id: 1295, name: '兴国县', code: 360732 },
+          { id: 1296, name: '会昌县', code: 360733 },
+          { id: 1297, name: '寻乌县', code: 360734 },
+          { id: 1298, name: '石城县', code: 360735 },
+          { id: 1299, name: '瑞金市', code: 360781 }
+        ]
+      },
+      {
+        id: 1300,
+        name: '吉安市',
+        code: 360800,
+        parentOrganId: 1238,
+        areas: [
+          { id: 1301, name: '吉州区', code: 360802 },
+          { id: 1302, name: '青原区', code: 360803 },
+          { id: 1303, name: '吉安县', code: 360821 },
+          { id: 1304, name: '吉水县', code: 360822 },
+          { id: 1305, name: '峡江县', code: 360823 },
+          { id: 1306, name: '新干县', code: 360824 },
+          { id: 1307, name: '永丰县', code: 360825 },
+          { id: 1308, name: '泰和县', code: 360826 },
+          { id: 1309, name: '遂川县', code: 360827 },
+          { id: 1310, name: '万安县', code: 360828 },
+          { id: 1311, name: '安福县', code: 360829 },
+          { id: 1312, name: '永新县', code: 360830 },
+          { id: 1313, name: '井冈山市', code: 360881 }
+        ]
+      },
+      {
+        id: 1314,
+        name: '宜春市',
+        code: 360900,
+        parentOrganId: 1238,
+        areas: [
+          { id: 1315, name: '袁州区', code: 360902 },
+          { id: 1316, name: '奉新县', code: 360921 },
+          { id: 1317, name: '万载县', code: 360922 },
+          { id: 1318, name: '上高县', code: 360923 },
+          { id: 1319, name: '宜丰县', code: 360924 },
+          { id: 1320, name: '靖安县', code: 360925 },
+          { id: 1321, name: '铜鼓县', code: 360926 },
+          { id: 1322, name: '丰城市', code: 360981 },
+          { id: 1323, name: '樟树市', code: 360982 },
+          { id: 1324, name: '高安市', code: 360983 }
+        ]
+      },
+      {
+        id: 1325,
+        name: '抚州市',
+        code: 361000,
+        parentOrganId: 1238,
+        areas: [
+          { id: 1326, name: '临川区', code: 361002 },
+          { id: 1327, name: '南城县', code: 361021 },
+          { id: 1328, name: '黎川县', code: 361022 },
+          { id: 1329, name: '南丰县', code: 361023 },
+          { id: 1330, name: '崇仁县', code: 361024 },
+          { id: 1331, name: '乐安县', code: 361025 },
+          { id: 1332, name: '宜黄县', code: 361026 },
+          { id: 1333, name: '金溪县', code: 361027 },
+          { id: 1334, name: '资溪县', code: 361028 },
+          { id: 1335, name: '东乡区', code: 361003 },
+          { id: 1336, name: '广昌县', code: 361030 }
+        ]
+      },
+      {
+        id: 1337,
+        name: '上饶市',
+        code: 361100,
+        parentOrganId: 1238,
+        areas: [
+          { id: 1338, name: '信州区', code: 361102 },
+          { id: 1339, name: '广丰区', code: 361103 },
+          { id: 1340, name: '上饶县', code: 361121 },
+          { id: 1341, name: '玉山县', code: 361123 },
+          { id: 1342, name: '铅山县', code: 361124 },
+          { id: 1343, name: '横峰县', code: 361125 },
+          { id: 1344, name: '弋阳县', code: 361126 },
+          { id: 1345, name: '余干县', code: 361127 },
+          { id: 1346, name: '鄱阳县', code: 361128 },
+          { id: 1347, name: '万年县', code: 361129 },
+          { id: 1348, name: '婺源县', code: 361130 },
+          { id: 1349, name: '德兴市', code: 361181 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 1350,
+    name: '山东省',
+    code: 370000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 1351,
+        name: '济南市',
+        code: 370100,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1352, name: '历下区', code: 370102 },
+          { id: 1353, name: '市中区', code: 370103 },
+          { id: 1354, name: '槐荫区', code: 370104 },
+          { id: 1355, name: '天桥区', code: 370105 },
+          { id: 1356, name: '历城区', code: 370112 },
+          { id: 1357, name: '长清区', code: 370113 },
+          { id: 1358, name: '平阴县', code: 370124 },
+          { id: 1359, name: '济阳县', code: 370125 },
+          { id: 1360, name: '商河县', code: 370126 },
+          { id: 1361, name: '章丘区', code: 370114 }
+        ]
+      },
+      {
+        id: 1362,
+        name: '青岛市',
+        code: 370200,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1363, name: '市南区', code: 370202 },
+          { id: 1364, name: '市北区', code: 370203 },
+          { id: 1365, name: '黄岛区', code: 370211 },
+          { id: 1366, name: '崂山区', code: 370212 },
+          { id: 1367, name: '李沧区', code: 370213 },
+          { id: 1368, name: '城阳区', code: 370214 },
+          { id: 1369, name: '胶州市', code: 370281 },
+          { id: 1370, name: '即墨市', code: 370282 },
+          { id: 1371, name: '平度市', code: 370283 },
+          { id: 1372, name: '莱西市', code: 370285 }
+        ]
+      },
+      {
+        id: 1373,
+        name: '淄博市',
+        code: 370300,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1374, name: '淄川区', code: 370302 },
+          { id: 1375, name: '张店区', code: 370303 },
+          { id: 1376, name: '博山区', code: 370304 },
+          { id: 1377, name: '临淄区', code: 370305 },
+          { id: 1378, name: '周村区', code: 370306 },
+          { id: 1379, name: '桓台县', code: 370321 },
+          { id: 1380, name: '高青县', code: 370322 },
+          { id: 1381, name: '沂源县', code: 370323 }
+        ]
+      },
+      {
+        id: 1382,
+        name: '枣庄市',
+        code: 370400,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1383, name: '市中区', code: 370402 },
+          { id: 1384, name: '薛城区', code: 370403 },
+          { id: 1385, name: '峄城区', code: 370404 },
+          { id: 1386, name: '台儿庄区', code: 370405 },
+          { id: 1387, name: '山亭区', code: 370406 },
+          { id: 1388, name: '滕州市', code: 370481 }
+        ]
+      },
+      {
+        id: 1389,
+        name: '东营市',
+        code: 370500,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1390, name: '东营区', code: 370502 },
+          { id: 1391, name: '河口区', code: 370503 },
+          { id: 1392, name: '垦利区', code: 370505 },
+          { id: 1393, name: '利津县', code: 370522 },
+          { id: 1394, name: '广饶县', code: 370523 }
+        ]
+      },
+      {
+        id: 1395,
+        name: '烟台市',
+        code: 370600,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1396, name: '芝罘区', code: 370602 },
+          { id: 1397, name: '福山区', code: 370611 },
+          { id: 1398, name: '牟平区', code: 370612 },
+          { id: 1399, name: '莱山区', code: 370613 },
+          { id: 1400, name: '长岛县', code: 370634 },
+          { id: 1401, name: '龙口市', code: 370681 },
+          { id: 1402, name: '莱阳市', code: 370682 },
+          { id: 1403, name: '莱州市', code: 370683 },
+          { id: 1404, name: '蓬莱市', code: 370684 },
+          { id: 1405, name: '招远市', code: 370685 },
+          { id: 1406, name: '栖霞市', code: 370686 },
+          { id: 1407, name: '海阳市', code: 370687 }
+        ]
+      },
+      {
+        id: 1408,
+        name: '潍坊市',
+        code: 370700,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1409, name: '潍城区', code: 370702 },
+          { id: 1410, name: '寒亭区', code: 370703 },
+          { id: 1411, name: '坊子区', code: 370704 },
+          { id: 1412, name: '奎文区', code: 370705 },
+          { id: 1413, name: '临朐县', code: 370724 },
+          { id: 1414, name: '昌乐县', code: 370725 },
+          { id: 1415, name: '青州市', code: 370781 },
+          { id: 1416, name: '诸城市', code: 370782 },
+          { id: 1417, name: '寿光市', code: 370783 },
+          { id: 1418, name: '安丘市', code: 370784 },
+          { id: 1419, name: '高密市', code: 370785 },
+          { id: 1420, name: '昌邑市', code: 370786 }
+        ]
+      },
+      {
+        id: 1421,
+        name: '济宁市',
+        code: 370800,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1422, name: '任城区', code: 370811 },
+          { id: 1423, name: '兖州区', code: 370812 },
+          { id: 1424, name: '微山县', code: 370826 },
+          { id: 1425, name: '鱼台县', code: 370827 },
+          { id: 1426, name: '金乡县', code: 370828 },
+          { id: 1427, name: '嘉祥县', code: 370829 },
+          { id: 1428, name: '汶上县', code: 370830 },
+          { id: 1429, name: '泗水县', code: 370831 },
+          { id: 1430, name: '梁山县', code: 370832 },
+          { id: 1431, name: '曲阜市', code: 370881 },
+          { id: 1432, name: '邹城市', code: 370883 }
+        ]
+      },
+      {
+        id: 1433,
+        name: '泰安市',
+        code: 370900,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1434, name: '泰山区', code: 370902 },
+          { id: 1435, name: '岱岳区', code: 370911 },
+          { id: 1436, name: '宁阳县', code: 370921 },
+          { id: 1437, name: '东平县', code: 370923 },
+          { id: 1438, name: '新泰市', code: 370982 },
+          { id: 1439, name: '肥城市', code: 370983 }
+        ]
+      },
+      {
+        id: 1440,
+        name: '威海市',
+        code: 371000,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1441, name: '环翠区', code: 371002 },
+          { id: 1442, name: '文登区', code: 371003 },
+          { id: 1443, name: '荣成市', code: 371082 },
+          { id: 1444, name: '乳山市', code: 371083 }
+        ]
+      },
+      {
+        id: 1445,
+        name: '日照市',
+        code: 371100,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1446, name: '东港区', code: 371102 },
+          { id: 1447, name: '岚山区', code: 371103 },
+          { id: 1448, name: '五莲县', code: 371121 },
+          { id: 1449, name: '莒县', code: 371122 }
+        ]
+      },
+      {
+        id: 1450,
+        name: '莱芜市',
+        code: 371200,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1451, name: '莱城区', code: 371202 },
+          { id: 1452, name: '钢城区', code: 371203 }
+        ]
+      },
+      {
+        id: 1453,
+        name: '临沂市',
+        code: 371300,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1454, name: '兰山区', code: 371302 },
+          { id: 1455, name: '罗庄区', code: 371311 },
+          { id: 1456, name: '河东区', code: 371312 },
+          { id: 1457, name: '沂南县', code: 371321 },
+          { id: 1458, name: '郯城县', code: 371322 },
+          { id: 1459, name: '沂水县', code: 371323 },
+          { id: 1460, name: '兰陵县', code: 371324 },
+          { id: 1461, name: '费县', code: 371325 },
+          { id: 1462, name: '平邑县', code: 371326 },
+          { id: 1463, name: '莒南县', code: 371327 },
+          { id: 1464, name: '蒙阴县', code: 371328 },
+          { id: 1465, name: '临沭县', code: 371329 }
+        ]
+      },
+      {
+        id: 1466,
+        name: '德州市',
+        code: 371400,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1467, name: '德城区', code: 371402 },
+          { id: 1468, name: '陵城区', code: 371403 },
+          { id: 1469, name: '宁津县', code: 371422 },
+          { id: 1470, name: '庆云县', code: 371423 },
+          { id: 1471, name: '临邑县', code: 371424 },
+          { id: 1472, name: '齐河县', code: 371425 },
+          { id: 1473, name: '平原县', code: 371426 },
+          { id: 1474, name: '夏津县', code: 371427 },
+          { id: 1475, name: '武城县', code: 371428 },
+          { id: 1476, name: '乐陵市', code: 371481 },
+          { id: 1477, name: '禹城市', code: 371482 }
+        ]
+      },
+      {
+        id: 1478,
+        name: '聊城市',
+        code: 371500,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1479, name: '东昌府区', code: 371502 },
+          { id: 1480, name: '阳谷县', code: 371521 },
+          { id: 1481, name: '莘县', code: 371522 },
+          { id: 1482, name: '茌平县', code: 371523 },
+          { id: 1483, name: '东阿县', code: 371524 },
+          { id: 1484, name: '冠县', code: 371525 },
+          { id: 1485, name: '高唐县', code: 371526 },
+          { id: 1486, name: '临清市', code: 371581 }
+        ]
+      },
+      {
+        id: 1487,
+        name: '滨州市',
+        code: 371600,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1488, name: '滨城区', code: 371602 },
+          { id: 1489, name: '沾化区', code: 371603 },
+          { id: 1490, name: '惠民县', code: 371621 },
+          { id: 1491, name: '阳信县', code: 371622 },
+          { id: 1492, name: '无棣县', code: 371623 },
+          { id: 1493, name: '博兴县', code: 371625 },
+          { id: 1494, name: '邹平县', code: 371626 }
+        ]
+      },
+      {
+        id: 1495,
+        name: '菏泽市',
+        code: 371700,
+        parentOrganId: 1350,
+        areas: [
+          { id: 1496, name: '牡丹区', code: 371702 },
+          { id: 1497, name: '定陶区', code: 371703 },
+          { id: 1498, name: '曹县', code: 371721 },
+          { id: 1499, name: '单县', code: 371722 },
+          { id: 1500, name: '成武县', code: 371723 },
+          { id: 1501, name: '巨野县', code: 371724 },
+          { id: 1502, name: '郓城县', code: 371725 },
+          { id: 1503, name: '鄄城县', code: 371726 },
+          { id: 1504, name: '东明县', code: 371728 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 1505,
+    name: '河南省',
+    code: 410000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 1506,
+        name: '郑州市',
+        code: 410100,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1507, name: '中原区', code: 410102 },
+          { id: 1508, name: '二七区', code: 410103 },
+          { id: 1509, name: '管城回族区', code: 410104 },
+          { id: 1510, name: '金水区', code: 410105 },
+          { id: 1511, name: '上街区', code: 410106 },
+          { id: 1512, name: '惠济区', code: 410108 },
+          { id: 1513, name: '中牟县', code: 410122 },
+          { id: 1514, name: '巩义市', code: 410181 },
+          { id: 1515, name: '荥阳市', code: 410182 },
+          { id: 1516, name: '新密市', code: 410183 },
+          { id: 1517, name: '新郑市', code: 410184 },
+          { id: 1518, name: '登封市', code: 410185 }
+        ]
+      },
+      {
+        id: 1519,
+        name: '开封市',
+        code: 410200,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1520, name: '龙亭区', code: 410202 },
+          { id: 1521, name: '顺河回族区', code: 410203 },
+          { id: 1522, name: '鼓楼区', code: 410204 },
+          { id: 1523, name: '禹王台区', code: 410205 },
+          { id: 1524, name: '祥符区', code: 410212 },
+          { id: 1525, name: '杞县', code: 410221 },
+          { id: 1526, name: '通许县', code: 410222 },
+          { id: 1527, name: '尉氏县', code: 410223 },
+          { id: 1528, name: '兰考县', code: 410225 }
+        ]
+      },
+      {
+        id: 1529,
+        name: '洛阳市',
+        code: 410300,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1530, name: '老城区', code: 410302 },
+          { id: 1531, name: '西工区', code: 410303 },
+          { id: 1532, name: '瀍河回族区', code: 410304 },
+          { id: 1533, name: '涧西区', code: 410305 },
+          { id: 1534, name: '吉利区', code: 410306 },
+          { id: 1535, name: '洛龙区', code: 410311 },
+          { id: 1536, name: '孟津县', code: 410322 },
+          { id: 1537, name: '新安县', code: 410323 },
+          { id: 1538, name: '栾川县', code: 410324 },
+          { id: 1539, name: '嵩县', code: 410325 },
+          { id: 1540, name: '汝阳县', code: 410326 },
+          { id: 1541, name: '宜阳县', code: 410327 },
+          { id: 1542, name: '洛宁县', code: 410328 },
+          { id: 1543, name: '伊川县', code: 410329 },
+          { id: 1544, name: '偃师市', code: 410381 }
+        ]
+      },
+      {
+        id: 1545,
+        name: '平顶山市',
+        code: 410400,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1546, name: '新华区', code: 410402 },
+          { id: 1547, name: '卫东区', code: 410403 },
+          { id: 1548, name: '石龙区', code: 410404 },
+          { id: 1549, name: '湛河区', code: 410411 },
+          { id: 1550, name: '宝丰县', code: 410421 },
+          { id: 1551, name: '叶县', code: 410422 },
+          { id: 1552, name: '鲁山县', code: 410423 },
+          { id: 1553, name: '郏县', code: 410425 },
+          { id: 1554, name: '舞钢市', code: 410481 },
+          { id: 1555, name: '汝州市', code: 410482 }
+        ]
+      },
+      {
+        id: 1556,
+        name: '安阳市',
+        code: 410500,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1557, name: '文峰区', code: 410502 },
+          { id: 1558, name: '北关区', code: 410503 },
+          { id: 1559, name: '殷都区', code: 410505 },
+          { id: 1560, name: '龙安区', code: 410506 },
+          { id: 1561, name: '安阳县', code: 410522 },
+          { id: 1562, name: '汤阴县', code: 410523 },
+          { id: 1563, name: '滑县', code: 410526 },
+          { id: 1564, name: '内黄县', code: 410527 },
+          { id: 1565, name: '林州市', code: 410581 }
+        ]
+      },
+      {
+        id: 1566,
+        name: '鹤壁市',
+        code: 410600,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1567, name: '鹤山区', code: 410602 },
+          { id: 1568, name: '山城区', code: 410603 },
+          { id: 1569, name: '淇滨区', code: 410611 },
+          { id: 1570, name: '浚县', code: 410621 },
+          { id: 1571, name: '淇县', code: 410622 }
+        ]
+      },
+      {
+        id: 1572,
+        name: '新乡市',
+        code: 410700,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1573, name: '红旗区', code: 410702 },
+          { id: 1574, name: '卫滨区', code: 410703 },
+          { id: 1575, name: '凤泉区', code: 410704 },
+          { id: 1576, name: '牧野区', code: 410711 },
+          { id: 1577, name: '新乡县', code: 410721 },
+          { id: 1578, name: '获嘉县', code: 410724 },
+          { id: 1579, name: '原阳县', code: 410725 },
+          { id: 1580, name: '延津县', code: 410726 },
+          { id: 1581, name: '封丘县', code: 410727 },
+          { id: 1582, name: '长垣县', code: 410728 },
+          { id: 1583, name: '卫辉市', code: 410781 },
+          { id: 1584, name: '辉县市', code: 410782 }
+        ]
+      },
+      {
+        id: 1585,
+        name: '焦作市',
+        code: 410800,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1586, name: '解放区', code: 410802 },
+          { id: 1587, name: '中站区', code: 410803 },
+          { id: 1588, name: '马村区', code: 410804 },
+          { id: 1589, name: '山阳区', code: 410811 },
+          { id: 1590, name: '修武县', code: 410821 },
+          { id: 1591, name: '博爱县', code: 410822 },
+          { id: 1592, name: '武陟县', code: 410823 },
+          { id: 1593, name: '温县', code: 410825 },
+          { id: 1594, name: '沁阳市', code: 410882 },
+          { id: 1595, name: '孟州市', code: 410883 }
+        ]
+      },
+      {
+        id: 1596,
+        name: '濮阳市',
+        code: 410900,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1597, name: '华龙区', code: 410902 },
+          { id: 1598, name: '清丰县', code: 410922 },
+          { id: 1599, name: '南乐县', code: 410923 },
+          { id: 1600, name: '范县', code: 410926 },
+          { id: 1601, name: '台前县', code: 410927 },
+          { id: 1602, name: '濮阳县', code: 410928 }
+        ]
+      },
+      {
+        id: 1603,
+        name: '许昌市',
+        code: 411000,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1604, name: '魏都区', code: 411002 },
+          { id: 1605, name: '建安区', code: 411003 },
+          { id: 1606, name: '鄢陵县', code: 411024 },
+          { id: 1607, name: '襄城县', code: 411025 },
+          { id: 1608, name: '禹州市', code: 411081 },
+          { id: 1609, name: '长葛市', code: 411082 }
+        ]
+      },
+      {
+        id: 1610,
+        name: '漯河市',
+        code: 411100,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1611, name: '源汇区', code: 411102 },
+          { id: 1612, name: '郾城区', code: 411103 },
+          { id: 1613, name: '召陵区', code: 411104 },
+          { id: 1614, name: '舞阳县', code: 411121 },
+          { id: 1615, name: '临颍县', code: 411122 }
+        ]
+      },
+      {
+        id: 1616,
+        name: '三门峡市',
+        code: 411200,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1617, name: '湖滨区', code: 411202 },
+          { id: 1618, name: '陕州区', code: 411203 },
+          { id: 1619, name: '渑池县', code: 411221 },
+          { id: 1620, name: '卢氏县', code: 411224 },
+          { id: 1621, name: '义马市', code: 411281 },
+          { id: 1622, name: '灵宝市', code: 411282 }
+        ]
+      },
+      {
+        id: 1623,
+        name: '南阳市',
+        code: 411300,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1624, name: '宛城区', code: 411302 },
+          { id: 1625, name: '卧龙区', code: 411303 },
+          { id: 1626, name: '南召县', code: 411321 },
+          { id: 1627, name: '方城县', code: 411322 },
+          { id: 1628, name: '西峡县', code: 411323 },
+          { id: 1629, name: '镇平县', code: 411324 },
+          { id: 1630, name: '内乡县', code: 411325 },
+          { id: 1631, name: '淅川县', code: 411326 },
+          { id: 1632, name: '社旗县', code: 411327 },
+          { id: 1633, name: '唐河县', code: 411328 },
+          { id: 1634, name: '新野县', code: 411329 },
+          { id: 1635, name: '桐柏县', code: 411330 },
+          { id: 1636, name: '邓州市', code: 411381 }
+        ]
+      },
+      {
+        id: 1637,
+        name: '商丘市',
+        code: 411400,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1638, name: '梁园区', code: 411402 },
+          { id: 1639, name: '睢阳区', code: 411403 },
+          { id: 1640, name: '民权县', code: 411421 },
+          { id: 1641, name: '睢县', code: 411422 },
+          { id: 1642, name: '宁陵县', code: 411423 },
+          { id: 1643, name: '柘城县', code: 411424 },
+          { id: 1644, name: '虞城县', code: 411425 },
+          { id: 1645, name: '夏邑县', code: 411426 },
+          { id: 1646, name: '永城市', code: 411481 }
+        ]
+      },
+      {
+        id: 1647,
+        name: '信阳市',
+        code: 411500,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1648, name: '浉河区', code: 411502 },
+          { id: 1649, name: '平桥区', code: 411503 },
+          { id: 1650, name: '罗山县', code: 411521 },
+          { id: 1651, name: '光山县', code: 411522 },
+          { id: 1652, name: '新县', code: 411523 },
+          { id: 1653, name: '商城县', code: 411524 },
+          { id: 1654, name: '固始县', code: 411525 },
+          { id: 1655, name: '潢川县', code: 411526 },
+          { id: 1656, name: '淮滨县', code: 411527 },
+          { id: 1657, name: '息县', code: 411528 }
+        ]
+      },
+      {
+        id: 1658,
+        name: '周口市',
+        code: 411600,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1659, name: '川汇区', code: 411602 },
+          { id: 1660, name: '扶沟县', code: 411621 },
+          { id: 1661, name: '西华县', code: 411622 },
+          { id: 1662, name: '商水县', code: 411623 },
+          { id: 1663, name: '沈丘县', code: 411624 },
+          { id: 1664, name: '郸城县', code: 411625 },
+          { id: 1665, name: '淮阳县', code: 411626 },
+          { id: 1666, name: '太康县', code: 411627 },
+          { id: 1667, name: '鹿邑县', code: 411628 },
+          { id: 1668, name: '项城市', code: 411681 }
+        ]
+      },
+      {
+        id: 1669,
+        name: '驻马店市',
+        code: 411700,
+        parentOrganId: 1505,
+        areas: [
+          { id: 1670, name: '驿城区', code: 411702 },
+          { id: 1671, name: '西平县', code: 411721 },
+          { id: 1672, name: '上蔡县', code: 411722 },
+          { id: 1673, name: '平舆县', code: 411723 },
+          { id: 1674, name: '正阳县', code: 411724 },
+          { id: 1675, name: '确山县', code: 411725 },
+          { id: 1676, name: '泌阳县', code: 411726 },
+          { id: 1677, name: '汝南县', code: 411727 },
+          { id: 1678, name: '遂平县', code: 411728 },
+          { id: 1679, name: '新蔡县', code: 411729 }
+        ]
+      },
+      { id: 1680, name: '济源市', code: 419001, parentOrganId: 1505 }
+    ]
+  },
+  {
+    id: 1681,
+    name: '湖北省',
+    code: 420000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 1682,
+        name: '武汉市',
+        code: 420100,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1683, name: '江岸区', code: 420102 },
+          { id: 1684, name: '江汉区', code: 420103 },
+          { id: 1685, name: '硚口区', code: 420104 },
+          { id: 1686, name: '汉阳区', code: 420105 },
+          { id: 1687, name: '武昌区', code: 420106 },
+          { id: 1688, name: '青山区', code: 420107 },
+          { id: 1689, name: '洪山区', code: 420111 },
+          { id: 1690, name: '东西湖区', code: 420112 },
+          { id: 1691, name: '汉南区', code: 420113 },
+          { id: 1692, name: '蔡甸区', code: 420114 },
+          { id: 1693, name: '江夏区', code: 420115 },
+          { id: 1694, name: '黄陂区', code: 420116 },
+          { id: 1695, name: '新洲区', code: 420117 }
+        ]
+      },
+      {
+        id: 1696,
+        name: '黄石市',
+        code: 420200,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1697, name: '黄石港区', code: 420202 },
+          { id: 1698, name: '西塞山区', code: 420203 },
+          { id: 1699, name: '下陆区', code: 420204 },
+          { id: 1700, name: '铁山区', code: 420205 },
+          { id: 1701, name: '阳新县', code: 420222 },
+          { id: 1702, name: '大冶市', code: 420281 }
+        ]
+      },
+      {
+        id: 1703,
+        name: '十堰市',
+        code: 420300,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1704, name: '茅箭区', code: 420302 },
+          { id: 1705, name: '张湾区', code: 420303 },
+          { id: 1706, name: '郧阳区', code: 420304 },
+          { id: 1707, name: '郧西县', code: 420322 },
+          { id: 1708, name: '竹山县', code: 420323 },
+          { id: 1709, name: '竹溪县', code: 420324 },
+          { id: 1710, name: '房县', code: 420325 },
+          { id: 1711, name: '丹江口市', code: 420381 }
+        ]
+      },
+      {
+        id: 1712,
+        name: '宜昌市',
+        code: 420500,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1713, name: '西陵区', code: 420502 },
+          { id: 1714, name: '伍家岗区', code: 420503 },
+          { id: 1715, name: '点军区', code: 420504 },
+          { id: 1716, name: '猇亭区', code: 420505 },
+          { id: 1717, name: '夷陵区', code: 420506 },
+          { id: 1718, name: '远安县', code: 420525 },
+          { id: 1719, name: '兴山县', code: 420526 },
+          { id: 1720, name: '秭归县', code: 420527 },
+          { id: 1721, name: '长阳土家族自治县', code: 420528 },
+          { id: 1722, name: '五峰土家族自治县', code: 420529 },
+          { id: 1723, name: '宜都市', code: 420581 },
+          { id: 1724, name: '当阳市', code: 420582 },
+          { id: 1725, name: '枝江市', code: 420583 }
+        ]
+      },
+      {
+        id: 1726,
+        name: '襄阳市',
+        code: 420600,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1727, name: '襄城区', code: 420602 },
+          { id: 1728, name: '樊城区', code: 420606 },
+          { id: 1729, name: '襄州区', code: 420607 },
+          { id: 1730, name: '南漳县', code: 420624 },
+          { id: 1731, name: '谷城县', code: 420625 },
+          { id: 1732, name: '保康县', code: 420626 },
+          { id: 1733, name: '老河口市', code: 420682 },
+          { id: 1734, name: '枣阳市', code: 420683 },
+          { id: 1735, name: '宜城市', code: 420684 }
+        ]
+      },
+      {
+        id: 1736,
+        name: '鄂州市',
+        code: 420700,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1737, name: '梁子湖区', code: 420702 },
+          { id: 1738, name: '华容区', code: 420703 },
+          { id: 1739, name: '鄂城区', code: 420704 }
+        ]
+      },
+      {
+        id: 1740,
+        name: '荆门市',
+        code: 420800,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1741, name: '东宝区', code: 420802 },
+          { id: 1742, name: '掇刀区', code: 420804 },
+          { id: 1743, name: '京山县', code: 420821 },
+          { id: 1744, name: '沙洋县', code: 420822 },
+          { id: 1745, name: '钟祥市', code: 420881 }
+        ]
+      },
+      {
+        id: 1746,
+        name: '孝感市',
+        code: 420900,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1747, name: '孝南区', code: 420902 },
+          { id: 1748, name: '孝昌县', code: 420921 },
+          { id: 1749, name: '大悟县', code: 420922 },
+          { id: 1750, name: '云梦县', code: 420923 },
+          { id: 1751, name: '应城市', code: 420981 },
+          { id: 1752, name: '安陆市', code: 420982 },
+          { id: 1753, name: '汉川市', code: 420984 }
+        ]
+      },
+      {
+        id: 1754,
+        name: '荆州市',
+        code: 421000,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1755, name: '沙市区', code: 421002 },
+          { id: 1756, name: '荆州区', code: 421003 },
+          { id: 1757, name: '公安县', code: 421022 },
+          { id: 1758, name: '监利县', code: 421023 },
+          { id: 1759, name: '江陵县', code: 421024 },
+          { id: 1760, name: '石首市', code: 421081 },
+          { id: 1761, name: '洪湖市', code: 421083 },
+          { id: 1762, name: '松滋市', code: 421087 }
+        ]
+      },
+      {
+        id: 1763,
+        name: '黄冈市',
+        code: 421100,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1764, name: '黄州区', code: 421102 },
+          { id: 1765, name: '团风县', code: 421121 },
+          { id: 1766, name: '红安县', code: 421122 },
+          { id: 1767, name: '罗田县', code: 421123 },
+          { id: 1768, name: '英山县', code: 421124 },
+          { id: 1769, name: '浠水县', code: 421125 },
+          { id: 1770, name: '蕲春县', code: 421126 },
+          { id: 1771, name: '黄梅县', code: 421127 },
+          { id: 1772, name: '麻城市', code: 421181 },
+          { id: 1773, name: '武穴市', code: 421182 }
+        ]
+      },
+      {
+        id: 1774,
+        name: '咸宁市',
+        code: 421200,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1775, name: '咸安区', code: 421202 },
+          { id: 1776, name: '嘉鱼县', code: 421221 },
+          { id: 1777, name: '通城县', code: 421222 },
+          { id: 1778, name: '崇阳县', code: 421223 },
+          { id: 1779, name: '通山县', code: 421224 },
+          { id: 1780, name: '赤壁市', code: 421281 }
+        ]
+      },
+      {
+        id: 1781,
+        name: '随州市',
+        code: 421300,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1782, name: '曾都区', code: 421303 },
+          { id: 1783, name: '随县', code: 421321 },
+          { id: 1784, name: '广水市', code: 421381 }
+        ]
+      },
+      {
+        id: 1785,
+        name: '恩施土家族苗族自治州',
+        code: 422800,
+        parentOrganId: 1681,
+        areas: [
+          { id: 1786, name: '恩施市', code: 422801 },
+          { id: 1787, name: '利川市', code: 422802 },
+          { id: 1788, name: '建始县', code: 422822 },
+          { id: 1789, name: '巴东县', code: 422823 },
+          { id: 1790, name: '宣恩县', code: 422825 },
+          { id: 1791, name: '咸丰县', code: 422826 },
+          { id: 1792, name: '来凤县', code: 422827 },
+          { id: 1793, name: '鹤峰县', code: 422828 }
+        ]
+      },
+      { id: 1794, name: '潜江市', code: 429005, parentOrganId: 1681 },
+      { id: 1795, name: '神农架林区', code: 429021, parentOrganId: 1681 },
+      { id: 1796, name: '天门市', code: 429006, parentOrganId: 1681 },
+      { id: 1797, name: '仙桃市', code: 429004, parentOrganId: 1681 }
+    ]
+  },
+  {
+    id: 1798,
+    name: '湖南省',
+    code: 430000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 1799,
+        name: '长沙市',
+        code: 430100,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1800, name: '芙蓉区', code: 430102 },
+          { id: 1801, name: '天心区', code: 430103 },
+          { id: 1802, name: '岳麓区', code: 430104 },
+          { id: 1803, name: '开福区', code: 430105 },
+          { id: 1804, name: '雨花区', code: 430111 },
+          { id: 1805, name: '望城区', code: 430112 },
+          { id: 1806, name: '长沙县', code: 430121 },
+          { id: 1807, name: '宁乡市', code: 430124 },
+          { id: 1808, name: '浏阳市', code: 430181 }
+        ]
+      },
+      {
+        id: 1809,
+        name: '株洲市',
+        code: 430200,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1810, name: '荷塘区', code: 430202 },
+          { id: 1811, name: '芦淞区', code: 430203 },
+          { id: 1812, name: '石峰区', code: 430204 },
+          { id: 1813, name: '天元区', code: 430211 },
+          { id: 1814, name: '株洲县', code: 430221 },
+          { id: 1815, name: '攸县', code: 430223 },
+          { id: 1816, name: '茶陵县', code: 430224 },
+          { id: 1817, name: '炎陵县', code: 430225 },
+          { id: 1818, name: '醴陵市', code: 430281 }
+        ]
+      },
+      {
+        id: 1819,
+        name: '湘潭市',
+        code: 430300,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1820, name: '雨湖区', code: 430302 },
+          { id: 1821, name: '岳塘区', code: 430304 },
+          { id: 1822, name: '湘潭县', code: 430321 },
+          { id: 1823, name: '湘乡市', code: 430381 },
+          { id: 1824, name: '韶山市', code: 430382 }
+        ]
+      },
+      {
+        id: 1825,
+        name: '衡阳市',
+        code: 430400,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1826, name: '珠晖区', code: 430405 },
+          { id: 1827, name: '雁峰区', code: 430406 },
+          { id: 1828, name: '石鼓区', code: 430407 },
+          { id: 1829, name: '蒸湘区', code: 430408 },
+          { id: 1830, name: '南岳区', code: 430412 },
+          { id: 1831, name: '衡阳县', code: 430421 },
+          { id: 1832, name: '衡南县', code: 430422 },
+          { id: 1833, name: '衡山县', code: 430423 },
+          { id: 1834, name: '衡东县', code: 430424 },
+          { id: 1835, name: '祁东县', code: 430426 },
+          { id: 1836, name: '耒阳市', code: 430481 },
+          { id: 1837, name: '常宁市', code: 430482 }
+        ]
+      },
+      {
+        id: 1838,
+        name: '邵阳市',
+        code: 430500,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1839, name: '双清区', code: 430502 },
+          { id: 1840, name: '大祥区', code: 430503 },
+          { id: 1841, name: '北塔区', code: 430511 },
+          { id: 1842, name: '邵东县', code: 430521 },
+          { id: 1843, name: '新邵县', code: 430522 },
+          { id: 1844, name: '邵阳县', code: 430523 },
+          { id: 1845, name: '隆回县', code: 430524 },
+          { id: 1846, name: '洞口县', code: 430525 },
+          { id: 1847, name: '绥宁县', code: 430527 },
+          { id: 1848, name: '新宁县', code: 430528 },
+          { id: 1849, name: '城步苗族自治县', code: 430529 },
+          { id: 1850, name: '武冈市', code: 430581 }
+        ]
+      },
+      {
+        id: 1851,
+        name: '岳阳市',
+        code: 430600,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1852, name: '岳阳楼区', code: 430602 },
+          { id: 1853, name: '云溪区', code: 430603 },
+          { id: 1854, name: '君山区', code: 430611 },
+          { id: 1855, name: '岳阳县', code: 430621 },
+          { id: 1856, name: '华容县', code: 430623 },
+          { id: 1857, name: '湘阴县', code: 430624 },
+          { id: 1858, name: '平江县', code: 430626 },
+          { id: 1859, name: '汨罗市', code: 430681 },
+          { id: 1860, name: '临湘市', code: 430682 }
+        ]
+      },
+      {
+        id: 1861,
+        name: '常德市',
+        code: 430700,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1862, name: '武陵区', code: 430702 },
+          { id: 1863, name: '鼎城区', code: 430703 },
+          { id: 1864, name: '安乡县', code: 430721 },
+          { id: 1865, name: '汉寿县', code: 430722 },
+          { id: 1866, name: '澧县', code: 430723 },
+          { id: 1867, name: '临澧县', code: 430724 },
+          { id: 1868, name: '桃源县', code: 430725 },
+          { id: 1869, name: '石门县', code: 430726 },
+          { id: 1870, name: '津市市', code: 430781 }
+        ]
+      },
+      {
+        id: 1871,
+        name: '张家界市',
+        code: 430800,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1872, name: '永定区', code: 430802 },
+          { id: 1873, name: '武陵源区', code: 430811 },
+          { id: 1874, name: '慈利县', code: 430821 },
+          { id: 1875, name: '桑植县', code: 430822 }
+        ]
+      },
+      {
+        id: 1876,
+        name: '益阳市',
+        code: 430900,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1877, name: '资阳区', code: 430902 },
+          { id: 1878, name: '赫山区', code: 430903 },
+          { id: 1879, name: '南县', code: 430921 },
+          { id: 1880, name: '桃江县', code: 430922 },
+          { id: 1881, name: '安化县', code: 430923 },
+          { id: 1882, name: '沅江市', code: 430981 }
+        ]
+      },
+      {
+        id: 1883,
+        name: '郴州市',
+        code: 431000,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1884, name: '北湖区', code: 431002 },
+          { id: 1885, name: '苏仙区', code: 431003 },
+          { id: 1886, name: '桂阳县', code: 431021 },
+          { id: 1887, name: '宜章县', code: 431022 },
+          { id: 1888, name: '永兴县', code: 431023 },
+          { id: 1889, name: '嘉禾县', code: 431024 },
+          { id: 1890, name: '临武县', code: 431025 },
+          { id: 1891, name: '汝城县', code: 431026 },
+          { id: 1892, name: '桂东县', code: 431027 },
+          { id: 1893, name: '安仁县', code: 431028 },
+          { id: 1894, name: '资兴市', code: 431081 }
+        ]
+      },
+      {
+        id: 1895,
+        name: '永州市',
+        code: 431100,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1896, name: '零陵区', code: 431102 },
+          { id: 1897, name: '冷水滩区', code: 431103 },
+          { id: 1898, name: '祁阳县', code: 431121 },
+          { id: 1899, name: '东安县', code: 431122 },
+          { id: 1900, name: '双牌县', code: 431123 },
+          { id: 1901, name: '道县', code: 431124 },
+          { id: 1902, name: '江永县', code: 431125 },
+          { id: 1903, name: '宁远县', code: 431126 },
+          { id: 1904, name: '蓝山县', code: 431127 },
+          { id: 1905, name: '新田县', code: 431128 },
+          { id: 1906, name: '江华瑶族自治县', code: 431129 }
+        ]
+      },
+      {
+        id: 1907,
+        name: '怀化市',
+        code: 431200,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1908, name: '鹤城区', code: 431202 },
+          { id: 1909, name: '中方县', code: 431221 },
+          { id: 1910, name: '沅陵县', code: 431222 },
+          { id: 1911, name: '辰溪县', code: 431223 },
+          { id: 1912, name: '溆浦县', code: 431224 },
+          { id: 1913, name: '会同县', code: 431225 },
+          { id: 1914, name: '麻阳苗族自治县', code: 431226 },
+          { id: 1915, name: '新晃侗族自治县', code: 431227 },
+          { id: 1916, name: '芷江侗族自治县', code: 431228 },
+          { id: 1917, name: '靖州苗族侗族自治县', code: 431229 },
+          { id: 1918, name: '通道侗族自治县', code: 431230 },
+          { id: 1919, name: '洪江市', code: 431281 }
+        ]
+      },
+      {
+        id: 1920,
+        name: '娄底市',
+        code: 431300,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1921, name: '娄星区', code: 431302 },
+          { id: 1922, name: '双峰县', code: 431321 },
+          { id: 1923, name: '新化县', code: 431322 },
+          { id: 1924, name: '冷水江市', code: 431381 },
+          { id: 1925, name: '涟源市', code: 431382 }
+        ]
+      },
+      {
+        id: 1926,
+        name: '湘西土家族苗族自治州',
+        code: 433100,
+        parentOrganId: 1798,
+        areas: [
+          { id: 1927, name: '吉首市', code: 433101 },
+          { id: 1928, name: '泸溪县', code: 433122 },
+          { id: 1929, name: '凤凰县', code: 433123 },
+          { id: 1930, name: '花垣县', code: 433124 },
+          { id: 1931, name: '保靖县', code: 433125 },
+          { id: 1932, name: '古丈县', code: 433126 },
+          { id: 1933, name: '永顺县', code: 433127 },
+          { id: 1934, name: '龙山县', code: 433130 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 1935,
+    name: '广东省',
+    code: 440000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 1936,
+        name: '广州市',
+        code: 440100,
+        parentOrganId: 1935,
+        areas: [
+          { id: 1937, name: '荔湾区', code: 440103 },
+          { id: 1938, name: '越秀区', code: 440104 },
+          { id: 1939, name: '海珠区', code: 440105 },
+          { id: 1940, name: '天河区', code: 440106 },
+          { id: 1941, name: '白云区', code: 440111 },
+          { id: 1942, name: '黄埔区', code: 440112 },
+          { id: 1943, name: '番禺区', code: 440113 },
+          { id: 1944, name: '花都区', code: 440114 },
+          { id: 1945, name: '南沙区', code: 440115 },
+          { id: 1946, name: '从化区', code: 440117 },
+          { id: 1947, name: '增城区', code: 440118 }
+        ]
+      },
+      {
+        id: 1948,
+        name: '韶关市',
+        code: 440200,
+        parentOrganId: 1935,
+        areas: [
+          { id: 1949, name: '武江区', code: 440203 },
+          { id: 1950, name: '浈江区', code: 440204 },
+          { id: 1951, name: '曲江区', code: 440205 },
+          { id: 1952, name: '始兴县', code: 440222 },
+          { id: 1953, name: '仁化县', code: 440224 },
+          { id: 1954, name: '翁源县', code: 440229 },
+          { id: 1955, name: '乳源瑶族自治县', code: 440232 },
+          { id: 1956, name: '新丰县', code: 440233 },
+          { id: 1957, name: '乐昌市', code: 440281 },
+          { id: 1958, name: '南雄市', code: 440282 }
+        ]
+      },
+      {
+        id: 1959,
+        name: '深圳市',
+        code: 440300,
+        parentOrganId: 1935,
+        areas: [
+          { id: 1960, name: '罗湖区', code: 440303 },
+          { id: 1961, name: '福田区', code: 440304 },
+          { id: 1962, name: '南山区', code: 440305 },
+          { id: 1963, name: '宝安区', code: 440306 },
+          { id: 1964, name: '龙岗区', code: 440307 },
+          { id: 1965, name: '盐田区', code: 440308 },
+          { id: 1966, name: '龙华区', code: 440309 },
+          { id: 1967, name: '坪山区', code: 440310 }
+        ]
+      },
+      {
+        id: 1968,
+        name: '珠海市',
+        code: 440400,
+        parentOrganId: 1935,
+        areas: [
+          { id: 1969, name: '香洲区', code: 440402 },
+          { id: 1970, name: '斗门区', code: 440403 },
+          { id: 1971, name: '金湾区', code: 440404 }
+        ]
+      },
+      {
+        id: 1972,
+        name: '汕头市',
+        code: 440500,
+        parentOrganId: 1935,
+        areas: [
+          { id: 1973, name: '龙湖区', code: 440507 },
+          { id: 1974, name: '金平区', code: 440511 },
+          { id: 1975, name: '濠江区', code: 440512 },
+          { id: 1976, name: '潮阳区', code: 440513 },
+          { id: 1977, name: '潮南区', code: 440514 },
+          { id: 1978, name: '澄海区', code: 440515 },
+          { id: 1979, name: '南澳县', code: 440523 }
+        ]
+      },
+      {
+        id: 1980,
+        name: '佛山市',
+        code: 440600,
+        parentOrganId: 1935,
+        areas: [
+          { id: 1981, name: '禅城区', code: 440604 },
+          { id: 1982, name: '南海区', code: 440605 },
+          { id: 1983, name: '顺德区', code: 440606 },
+          { id: 1984, name: '三水区', code: 440607 },
+          { id: 1985, name: '高明区', code: 440608 }
+        ]
+      },
+      {
+        id: 1986,
+        name: '江门市',
+        code: 440700,
+        parentOrganId: 1935,
+        areas: [
+          { id: 1987, name: '蓬江区', code: 440703 },
+          { id: 1988, name: '江海区', code: 440704 },
+          { id: 1989, name: '新会区', code: 440705 },
+          { id: 1990, name: '台山市', code: 440781 },
+          { id: 1991, name: '开平市', code: 440783 },
+          { id: 1992, name: '鹤山市', code: 440784 },
+          { id: 1993, name: '恩平市', code: 440785 }
+        ]
+      },
+      {
+        id: 1994,
+        name: '湛江市',
+        code: 440800,
+        parentOrganId: 1935,
+        areas: [
+          { id: 1995, name: '赤坎区', code: 440802 },
+          { id: 1996, name: '霞山区', code: 440803 },
+          { id: 1997, name: '坡头区', code: 440804 },
+          { id: 1998, name: '麻章区', code: 440811 },
+          { id: 1999, name: '遂溪县', code: 440823 },
+          { id: 2000, name: '徐闻县', code: 440825 },
+          { id: 2001, name: '廉江市', code: 440881 },
+          { id: 2002, name: '雷州市', code: 440882 },
+          { id: 2003, name: '吴川市', code: 440883 }
+        ]
+      },
+      {
+        id: 2004,
+        name: '茂名市',
+        code: 440900,
+        parentOrganId: 1935,
+        areas: [
+          { id: 2005, name: '茂南区', code: 440902 },
+          { id: 2006, name: '电白区', code: 440904 },
+          { id: 2007, name: '高州市', code: 440981 },
+          { id: 2008, name: '化州市', code: 440982 },
+          { id: 2009, name: '信宜市', code: 440983 }
+        ]
+      },
+      {
+        id: 2010,
+        name: '肇庆市',
+        code: 441200,
+        parentOrganId: 1935,
+        areas: [
+          { id: 2011, name: '端州区', code: 441202 },
+          { id: 2012, name: '鼎湖区', code: 441203 },
+          { id: 2013, name: '高要区', code: 441204 },
+          { id: 2014, name: '广宁县', code: 441223 },
+          { id: 2015, name: '怀集县', code: 441224 },
+          { id: 2016, name: '封开县', code: 441225 },
+          { id: 2017, name: '德庆县', code: 441226 },
+          { id: 2018, name: '四会市', code: 441284 }
+        ]
+      },
+      {
+        id: 2019,
+        name: '惠州市',
+        code: 441300,
+        parentOrganId: 1935,
+        areas: [
+          { id: 2020, name: '惠城区', code: 441302 },
+          { id: 2021, name: '惠阳区', code: 441303 },
+          { id: 2022, name: '博罗县', code: 441322 },
+          { id: 2023, name: '惠东县', code: 441323 },
+          { id: 2024, name: '龙门县', code: 441324 }
+        ]
+      },
+      {
+        id: 2025,
+        name: '梅州市',
+        code: 441400,
+        parentOrganId: 1935,
+        areas: [
+          { id: 2026, name: '梅江区', code: 441402 },
+          { id: 2027, name: '梅县区', code: 441403 },
+          { id: 2028, name: '大埔县', code: 441422 },
+          { id: 2029, name: '丰顺县', code: 441423 },
+          { id: 2030, name: '五华县', code: 441424 },
+          { id: 2031, name: '平远县', code: 441426 },
+          { id: 2032, name: '蕉岭县', code: 441427 },
+          { id: 2033, name: '兴宁市', code: 441481 }
+        ]
+      },
+      {
+        id: 2034,
+        name: '汕尾市',
+        code: 441500,
+        parentOrganId: 1935,
+        areas: [
+          { id: 2035, name: '城区', code: 441502 },
+          { id: 2036, name: '海丰县', code: 441521 },
+          { id: 2037, name: '陆河县', code: 441523 },
+          { id: 2038, name: '陆丰市', code: 441581 }
+        ]
+      },
+      {
+        id: 2039,
+        name: '河源市',
+        code: 441600,
+        parentOrganId: 1935,
+        areas: [
+          { id: 2040, name: '源城区', code: 441602 },
+          { id: 2041, name: '紫金县', code: 441621 },
+          { id: 2042, name: '龙川县', code: 441622 },
+          { id: 2043, name: '连平县', code: 441623 },
+          { id: 2044, name: '和平县', code: 441624 },
+          { id: 2045, name: '东源县', code: 441625 }
+        ]
+      },
+      {
+        id: 2046,
+        name: '阳江市',
+        code: 441700,
+        parentOrganId: 1935,
+        areas: [
+          { id: 2047, name: '江城区', code: 441702 },
+          { id: 2048, name: '阳东区', code: 441704 },
+          { id: 2049, name: '阳西县', code: 441721 },
+          { id: 2050, name: '阳春市', code: 441781 }
+        ]
+      },
+      {
+        id: 2051,
+        name: '清远市',
+        code: 441800,
+        parentOrganId: 1935,
+        areas: [
+          { id: 2052, name: '清城区', code: 441802 },
+          { id: 2053, name: '清新区', code: 441803 },
+          { id: 2054, name: '佛冈县', code: 441821 },
+          { id: 2055, name: '阳山县', code: 441823 },
+          { id: 2056, name: '连山壮族瑶族自治县', code: 441825 },
+          { id: 2057, name: '连南瑶族自治县', code: 441826 },
+          { id: 2058, name: '英德市', code: 441881 },
+          { id: 2059, name: '连州市', code: 441882 }
+        ]
+      },
+      { id: 2060, name: '东莞市', code: 441900, parentOrganId: 1935 },
+      { id: 2061, name: '中山市', code: 442000, parentOrganId: 1935 },
+      {
+        id: 2062,
+        name: '潮州市',
+        code: 445100,
+        parentOrganId: 1935,
+        areas: [
+          { id: 2063, name: '湘桥区', code: 445102 },
+          { id: 2064, name: '潮安区', code: 445103 },
+          { id: 2065, name: '饶平县', code: 445122 }
+        ]
+      },
+      {
+        id: 2066,
+        name: '揭阳市',
+        code: 445200,
+        parentOrganId: 1935,
+        areas: [
+          { id: 2067, name: '榕城区', code: 445202 },
+          { id: 2068, name: '揭东区', code: 445203 },
+          { id: 2069, name: '揭西县', code: 445222 },
+          { id: 2070, name: '惠来县', code: 445224 },
+          { id: 2071, name: '普宁市', code: 445281 }
+        ]
+      },
+      {
+        id: 2072,
+        name: '云浮市',
+        code: 445300,
+        parentOrganId: 1935,
+        areas: [
+          { id: 2073, name: '云城区', code: 445302 },
+          { id: 2074, name: '云安区', code: 445303 },
+          { id: 2075, name: '新兴县', code: 445321 },
+          { id: 2076, name: '郁南县', code: 445322 },
+          { id: 2077, name: '罗定市', code: 445381 }
+        ]
+      },
+      { id: 2078, name: '东沙群岛', code: 442100, parentOrganId: 1935 }
+    ]
+  },
+  {
+    id: 2079,
+    name: '广西壮族自治区',
+    code: 450000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 2080,
+        name: '南宁市',
+        code: 450100,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2081, name: '兴宁区', code: 450102 },
+          { id: 2082, name: '青秀区', code: 450103 },
+          { id: 2083, name: '江南区', code: 450105 },
+          { id: 2084, name: '西乡塘区', code: 450107 },
+          { id: 2085, name: '良庆区', code: 450108 },
+          { id: 2086, name: '邕宁区', code: 450109 },
+          { id: 2087, name: '武鸣区', code: 450110 },
+          { id: 2088, name: '隆安县', code: 450123 },
+          { id: 2089, name: '马山县', code: 450124 },
+          { id: 2090, name: '上林县', code: 450125 },
+          { id: 2091, name: '宾阳县', code: 450126 },
+          { id: 2092, name: '横县', code: 450127 }
+        ]
+      },
+      {
+        id: 2093,
+        name: '柳州市',
+        code: 450200,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2094, name: '城中区', code: 450202 },
+          { id: 2095, name: '鱼峰区', code: 450203 },
+          { id: 2096, name: '柳南区', code: 450204 },
+          { id: 2097, name: '柳北区', code: 450205 },
+          { id: 2098, name: '柳江区', code: 450206 },
+          { id: 2099, name: '柳城县', code: 450222 },
+          { id: 2100, name: '鹿寨县', code: 450223 },
+          { id: 2101, name: '融安县', code: 450224 },
+          { id: 2102, name: '融水苗族自治县', code: 450225 },
+          { id: 2103, name: '三江侗族自治县', code: 450226 }
+        ]
+      },
+      {
+        id: 2104,
+        name: '桂林市',
+        code: 450300,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2105, name: '秀峰区', code: 450302 },
+          { id: 2106, name: '叠彩区', code: 450303 },
+          { id: 2107, name: '象山区', code: 450304 },
+          { id: 2108, name: '七星区', code: 450305 },
+          { id: 2109, name: '雁山区', code: 450311 },
+          { id: 2110, name: '临桂区', code: 450312 },
+          { id: 2111, name: '阳朔县', code: 450321 },
+          { id: 2112, name: '灵川县', code: 450323 },
+          { id: 2113, name: '全州县', code: 450324 },
+          { id: 2114, name: '兴安县', code: 450325 },
+          { id: 2115, name: '永福县', code: 450326 },
+          { id: 2116, name: '灌阳县', code: 450327 },
+          { id: 2117, name: '龙胜各族自治县', code: 450328 },
+          { id: 2118, name: '资源县', code: 450329 },
+          { id: 2119, name: '平乐县', code: 450330 },
+          { id: 2120, name: '荔浦县', code: 450331 },
+          { id: 2121, name: '恭城瑶族自治县', code: 450332 }
+        ]
+      },
+      {
+        id: 2122,
+        name: '梧州市',
+        code: 450400,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2123, name: '万秀区', code: 450403 },
+          { id: 2124, name: '长洲区', code: 450405 },
+          { id: 2125, name: '龙圩区', code: 450406 },
+          { id: 2126, name: '苍梧县', code: 450421 },
+          { id: 2127, name: '藤县', code: 450422 },
+          { id: 2128, name: '蒙山县', code: 450423 },
+          { id: 2129, name: '岑溪市', code: 450481 }
+        ]
+      },
+      {
+        id: 2130,
+        name: '北海市',
+        code: 450500,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2131, name: '海城区', code: 450502 },
+          { id: 2132, name: '银海区', code: 450503 },
+          { id: 2133, name: '铁山港区', code: 450512 },
+          { id: 2134, name: '合浦县', code: 450521 }
+        ]
+      },
+      {
+        id: 2135,
+        name: '防城港市',
+        code: 450600,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2136, name: '港口区', code: 450602 },
+          { id: 2137, name: '防城区', code: 450603 },
+          { id: 2138, name: '上思县', code: 450621 },
+          { id: 2139, name: '东兴市', code: 450681 }
+        ]
+      },
+      {
+        id: 2140,
+        name: '钦州市',
+        code: 450700,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2141, name: '钦南区', code: 450702 },
+          { id: 2142, name: '钦北区', code: 450703 },
+          { id: 2143, name: '灵山县', code: 450721 },
+          { id: 2144, name: '浦北县', code: 450722 }
+        ]
+      },
+      {
+        id: 2145,
+        name: '贵港市',
+        code: 450800,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2146, name: '港北区', code: 450802 },
+          { id: 2147, name: '港南区', code: 450803 },
+          { id: 2148, name: '覃塘区', code: 450804 },
+          { id: 2149, name: '平南县', code: 450821 },
+          { id: 2150, name: '桂平市', code: 450881 }
+        ]
+      },
+      {
+        id: 2151,
+        name: '玉林市',
+        code: 450900,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2152, name: '玉州区', code: 450902 },
+          { id: 2153, name: '福绵区', code: 450903 },
+          { id: 2154, name: '容县', code: 450921 },
+          { id: 2155, name: '陆川县', code: 450922 },
+          { id: 2156, name: '博白县', code: 450923 },
+          { id: 2157, name: '兴业县', code: 450924 },
+          { id: 2158, name: '北流市', code: 450981 }
+        ]
+      },
+      {
+        id: 2159,
+        name: '百色市',
+        code: 451000,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2160, name: '右江区', code: 451002 },
+          { id: 2161, name: '田阳县', code: 451021 },
+          { id: 2162, name: '田东县', code: 451022 },
+          { id: 2163, name: '平果县', code: 451023 },
+          { id: 2164, name: '德保县', code: 451024 },
+          { id: 2165, name: '那坡县', code: 451026 },
+          { id: 2166, name: '凌云县', code: 451027 },
+          { id: 2167, name: '乐业县', code: 451028 },
+          { id: 2168, name: '田林县', code: 451029 },
+          { id: 2169, name: '西林县', code: 451030 },
+          { id: 2170, name: '隆林各族自治县', code: 451031 },
+          { id: 2171, name: '靖西市', code: 451081 }
+        ]
+      },
+      {
+        id: 2172,
+        name: '贺州市',
+        code: 451100,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2173, name: '八步区', code: 451102 },
+          { id: 2174, name: '平桂区', code: 451103 },
+          { id: 2175, name: '昭平县', code: 451121 },
+          { id: 2176, name: '钟山县', code: 451122 },
+          { id: 2177, name: '富川瑶族自治县', code: 451123 }
+        ]
+      },
+      {
+        id: 2178,
+        name: '河池市',
+        code: 451200,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2179, name: '金城江区', code: 451202 },
+          { id: 2180, name: '南丹县', code: 451221 },
+          { id: 2181, name: '天峨县', code: 451222 },
+          { id: 2182, name: '凤山县', code: 451223 },
+          { id: 2183, name: '东兰县', code: 451224 },
+          { id: 2184, name: '罗城仫佬族自治县', code: 451225 },
+          { id: 2185, name: '环江毛南族自治县', code: 451226 },
+          { id: 2186, name: '巴马瑶族自治县', code: 451227 },
+          { id: 2187, name: '都安瑶族自治县', code: 451228 },
+          { id: 2188, name: '大化瑶族自治县', code: 451229 },
+          { id: 2189, name: '宜州区', code: 451203 }
+        ]
+      },
+      {
+        id: 2190,
+        name: '来宾市',
+        code: 451300,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2191, name: '兴宾区', code: 451302 },
+          { id: 2192, name: '忻城县', code: 451321 },
+          { id: 2193, name: '象州县', code: 451322 },
+          { id: 2194, name: '武宣县', code: 451323 },
+          { id: 2195, name: '金秀瑶族自治县', code: 451324 },
+          { id: 2196, name: '合山市', code: 451381 }
+        ]
+      },
+      {
+        id: 2197,
+        name: '崇左市',
+        code: 451400,
+        parentOrganId: 2079,
+        areas: [
+          { id: 2198, name: '江州区', code: 451402 },
+          { id: 2199, name: '扶绥县', code: 451421 },
+          { id: 2200, name: '宁明县', code: 451422 },
+          { id: 2201, name: '龙州县', code: 451423 },
+          { id: 2202, name: '大新县', code: 451424 },
+          { id: 2203, name: '天等县', code: 451425 },
+          { id: 2204, name: '凭祥市', code: 451481 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 2205,
+    name: '海南省',
+    code: 460000,
+    parentOrganId: 0,
+    areas: [
+      { id: 2206, name: '白沙黎族自治县', code: 469025, parentOrganId: 2205 },
+      { id: 2207, name: '保亭黎族苗族自治县', code: 469029, parentOrganId: 2205 },
+      { id: 2208, name: '昌江黎族自治县', code: 469026, parentOrganId: 2205 },
+      { id: 2209, name: '澄迈县', code: 469023, parentOrganId: 2205 },
+      {
+        id: 2210,
+        name: '海口市',
+        code: 460100,
+        parentOrganId: 2205,
+        areas: [
+          { id: 2211, name: '秀英区', code: 460105 },
+          { id: 2212, name: '龙华区', code: 460106 },
+          { id: 2213, name: '琼山区', code: 460107 },
+          { id: 2214, name: '美兰区', code: 460108 }
+        ]
+      },
+      {
+        id: 2215,
+        name: '三亚市',
+        code: 460200,
+        parentOrganId: 2205,
+        areas: [
+          { id: 2216, name: '海棠区', code: 460202 },
+          { id: 2217, name: '吉阳区', code: 460203 },
+          { id: 2218, name: '天涯区', code: 460204 },
+          { id: 2219, name: '崖州区', code: 460205 }
+        ]
+      },
+      {
+        id: 2220,
+        name: '三沙市',
+        code: 460300,
+        parentOrganId: 2205,
+        areas: [
+          { id: 2221, name: '西沙群岛', code: 460321 },
+          { id: 2222, name: '南沙群岛', code: 460322 },
+          { id: 2223, name: '中沙群岛的岛礁及其海域', code: 460323 }
+        ]
+      },
+      { id: 2224, name: '儋州市', code: 460400, parentOrganId: 2205 },
+      { id: 2225, name: '定安县', code: 469021, parentOrganId: 2205 },
+      { id: 2226, name: '东方市', code: 469007, parentOrganId: 2205 },
+      { id: 2227, name: '乐东黎族自治县', code: 469027, parentOrganId: 2205 },
+      { id: 2228, name: '临高县', code: 469024, parentOrganId: 2205 },
+      { id: 2229, name: '陵水黎族自治县', code: 469028, parentOrganId: 2205 },
+      { id: 2230, name: '琼海市', code: 469002, parentOrganId: 2205 },
+      { id: 2231, name: '琼中黎族苗族自治县', code: 469030, parentOrganId: 2205 },
+      { id: 2232, name: '屯昌县', code: 469022, parentOrganId: 2205 },
+      { id: 2233, name: '万宁市', code: 469006, parentOrganId: 2205 },
+      { id: 2234, name: '文昌市', code: 469005, parentOrganId: 2205 },
+      { id: 2235, name: '五指山市', code: 469001, parentOrganId: 2205 }
+    ]
+  },
+  {
+    id: 2236,
+    name: '重庆市',
+    code: 500000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 2237,
+        name: '重庆城区',
+        code: 500100,
+        parentOrganId: 2236,
+        areas: [
+          { id: 2238, name: '万州区', code: 500101 },
+          { id: 2239, name: '涪陵区', code: 500102 },
+          { id: 2240, name: '渝中区', code: 500103 },
+          { id: 2241, name: '大渡口区', code: 500104 },
+          { id: 2242, name: '江北区', code: 500105 },
+          { id: 2243, name: '沙坪坝区', code: 500106 },
+          { id: 2244, name: '九龙坡区', code: 500107 },
+          { id: 2245, name: '南岸区', code: 500108 },
+          { id: 2246, name: '北碚区', code: 500109 },
+          { id: 2247, name: '綦江区', code: 500110 },
+          { id: 2248, name: '大足区', code: 500111 },
+          { id: 2249, name: '渝北区', code: 500112 },
+          { id: 2250, name: '巴南区', code: 500113 },
+          { id: 2251, name: '黔江区', code: 500114 },
+          { id: 2252, name: '长寿区', code: 500115 },
+          { id: 2253, name: '江津区', code: 500116 },
+          { id: 2254, name: '合川区', code: 500117 },
+          { id: 2255, name: '永川区', code: 500118 },
+          { id: 2256, name: '南川区', code: 500119 },
+          { id: 2257, name: '璧山区', code: 500120 },
+          { id: 2258, name: '铜梁区', code: 500151 },
+          { id: 2259, name: '潼南区', code: 500152 },
+          { id: 2260, name: '荣昌区', code: 500153 },
+          { id: 2261, name: '开州区', code: 500154 }
+        ]
+      },
+      {
+        id: 2262,
+        name: '重庆郊县',
+        code: 500200,
+        parentOrganId: 2236,
+        areas: [
+          { id: 2263, name: '梁平区', code: 500155 },
+          { id: 2264, name: '城口县', code: 500229 },
+          { id: 2265, name: '丰都县', code: 500230 },
+          { id: 2266, name: '垫江县', code: 500231 },
+          { id: 2267, name: '武隆区', code: 500156 },
+          { id: 2268, name: '忠县', code: 500233 },
+          { id: 2269, name: '云阳县', code: 500235 },
+          { id: 2270, name: '奉节县', code: 500236 },
+          { id: 2271, name: '巫山县', code: 500237 },
+          { id: 2272, name: '巫溪县', code: 500238 },
+          { id: 2273, name: '石柱土家族自治县', code: 500240 },
+          { id: 2274, name: '秀山土家族苗族自治县', code: 500241 },
+          { id: 2275, name: '酉阳土家族苗族自治县', code: 500242 },
+          { id: 2276, name: '彭水苗族土家族自治县', code: 500243 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 2277,
+    name: '四川省',
+    code: 510000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 2278,
+        name: '成都市',
+        code: 510100,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2279, name: '锦江区', code: 510104 },
+          { id: 2280, name: '青羊区', code: 510105 },
+          { id: 2281, name: '金牛区', code: 510106 },
+          { id: 2282, name: '武侯区', code: 510107 },
+          { id: 2283, name: '成华区', code: 510108 },
+          { id: 2284, name: '龙泉驿区', code: 510112 },
+          { id: 2285, name: '青白江区', code: 510113 },
+          { id: 2286, name: '新都区', code: 510114 },
+          { id: 2287, name: '温江区', code: 510115 },
+          { id: 2288, name: '双流区', code: 510116 },
+          { id: 2289, name: '金堂县', code: 510121 },
+          { id: 2290, name: '郫都区', code: 510117 },
+          { id: 2291, name: '大邑县', code: 510129 },
+          { id: 2292, name: '蒲江县', code: 510131 },
+          { id: 2293, name: '新津县', code: 510132 },
+          { id: 2294, name: '简阳市', code: 510185 },
+          { id: 2295, name: '都江堰市', code: 510181 },
+          { id: 2296, name: '彭州市', code: 510182 },
+          { id: 2297, name: '邛崃市', code: 510183 },
+          { id: 2298, name: '崇州市', code: 510184 }
+        ]
+      },
+      {
+        id: 2299,
+        name: '自贡市',
+        code: 510300,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2300, name: '自流井区', code: 510302 },
+          { id: 2301, name: '贡井区', code: 510303 },
+          { id: 2302, name: '大安区', code: 510304 },
+          { id: 2303, name: '沿滩区', code: 510311 },
+          { id: 2304, name: '荣县', code: 510321 },
+          { id: 2305, name: '富顺县', code: 510322 }
+        ]
+      },
+      {
+        id: 2306,
+        name: '攀枝花市',
+        code: 510400,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2307, name: '东区', code: 510402 },
+          { id: 2308, name: '西区', code: 510403 },
+          { id: 2309, name: '仁和区', code: 510411 },
+          { id: 2310, name: '米易县', code: 510421 },
+          { id: 2311, name: '盐边县', code: 510422 }
+        ]
+      },
+      {
+        id: 2312,
+        name: '泸州市',
+        code: 510500,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2313, name: '江阳区', code: 510502 },
+          { id: 2314, name: '纳溪区', code: 510503 },
+          { id: 2315, name: '龙马潭区', code: 510504 },
+          { id: 2316, name: '泸县', code: 510521 },
+          { id: 2317, name: '合江县', code: 510522 },
+          { id: 2318, name: '叙永县', code: 510524 },
+          { id: 2319, name: '古蔺县', code: 510525 }
+        ]
+      },
+      {
+        id: 2320,
+        name: '德阳市',
+        code: 510600,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2321, name: '旌阳区', code: 510603 },
+          { id: 2322, name: '中江县', code: 510623 },
+          { id: 2323, name: '罗江县', code: 510626 },
+          { id: 2324, name: '广汉市', code: 510681 },
+          { id: 2325, name: '什邡市', code: 510682 },
+          { id: 2326, name: '绵竹市', code: 510683 }
+        ]
+      },
+      {
+        id: 2327,
+        name: '绵阳市',
+        code: 510700,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2328, name: '涪城区', code: 510703 },
+          { id: 2329, name: '游仙区', code: 510704 },
+          { id: 2330, name: '安州区', code: 510705 },
+          { id: 2331, name: '三台县', code: 510722 },
+          { id: 2332, name: '盐亭县', code: 510723 },
+          { id: 2333, name: '梓潼县', code: 510725 },
+          { id: 2334, name: '北川羌族自治县', code: 510726 },
+          { id: 2335, name: '平武县', code: 510727 },
+          { id: 2336, name: '江油市', code: 510781 }
+        ]
+      },
+      {
+        id: 2337,
+        name: '广元市',
+        code: 510800,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2338, name: '利州区', code: 510802 },
+          { id: 2339, name: '昭化区', code: 510811 },
+          { id: 2340, name: '朝天区', code: 510812 },
+          { id: 2341, name: '旺苍县', code: 510821 },
+          { id: 2342, name: '青川县', code: 510822 },
+          { id: 2343, name: '剑阁县', code: 510823 },
+          { id: 2344, name: '苍溪县', code: 510824 }
+        ]
+      },
+      {
+        id: 2345,
+        name: '遂宁市',
+        code: 510900,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2346, name: '船山区', code: 510903 },
+          { id: 2347, name: '安居区', code: 510904 },
+          { id: 2348, name: '蓬溪县', code: 510921 },
+          { id: 2349, name: '射洪县', code: 510922 },
+          { id: 2350, name: '大英县', code: 510923 }
+        ]
+      },
+      {
+        id: 2351,
+        name: '内江市',
+        code: 511000,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2352, name: '市中区', code: 511002 },
+          { id: 2353, name: '东兴区', code: 511011 },
+          { id: 2354, name: '威远县', code: 511024 },
+          { id: 2355, name: '资中县', code: 511025 },
+          { id: 2356, name: '隆昌市', code: 511028 }
+        ]
+      },
+      {
+        id: 2357,
+        name: '乐山市',
+        code: 511100,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2358, name: '市中区', code: 511102 },
+          { id: 2359, name: '沙湾区', code: 511111 },
+          { id: 2360, name: '五通桥区', code: 511112 },
+          { id: 2361, name: '金口河区', code: 511113 },
+          { id: 2362, name: '犍为县', code: 511123 },
+          { id: 2363, name: '井研县', code: 511124 },
+          { id: 2364, name: '夹江县', code: 511126 },
+          { id: 2365, name: '沐川县', code: 511129 },
+          { id: 2366, name: '峨边彝族自治县', code: 511132 },
+          { id: 2367, name: '马边彝族自治县', code: 511133 },
+          { id: 2368, name: '峨眉山市', code: 511181 }
+        ]
+      },
+      {
+        id: 2369,
+        name: '南充市',
+        code: 511300,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2370, name: '顺庆区', code: 511302 },
+          { id: 2371, name: '高坪区', code: 511303 },
+          { id: 2372, name: '嘉陵区', code: 511304 },
+          { id: 2373, name: '南部县', code: 511321 },
+          { id: 2374, name: '营山县', code: 511322 },
+          { id: 2375, name: '蓬安县', code: 511323 },
+          { id: 2376, name: '仪陇县', code: 511324 },
+          { id: 2377, name: '西充县', code: 511325 },
+          { id: 2378, name: '阆中市', code: 511381 }
+        ]
+      },
+      {
+        id: 2379,
+        name: '眉山市',
+        code: 511400,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2380, name: '东坡区', code: 511402 },
+          { id: 2381, name: '彭山区', code: 511403 },
+          { id: 2382, name: '仁寿县', code: 511421 },
+          { id: 2383, name: '洪雅县', code: 511423 },
+          { id: 2384, name: '丹棱县', code: 511424 },
+          { id: 2385, name: '青神县', code: 511425 }
+        ]
+      },
+      {
+        id: 2386,
+        name: '宜宾市',
+        code: 511500,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2387, name: '翠屏区', code: 511502 },
+          { id: 2388, name: '南溪区', code: 511503 },
+          { id: 2389, name: '宜宾县', code: 511521 },
+          { id: 2390, name: '江安县', code: 511523 },
+          { id: 2391, name: '长宁县', code: 511524 },
+          { id: 2392, name: '高县', code: 511525 },
+          { id: 2393, name: '珙县', code: 511526 },
+          { id: 2394, name: '筠连县', code: 511527 },
+          { id: 2395, name: '兴文县', code: 511528 },
+          { id: 2396, name: '屏山县', code: 511529 }
+        ]
+      },
+      {
+        id: 2397,
+        name: '广安市',
+        code: 511600,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2398, name: '广安区', code: 511602 },
+          { id: 2399, name: '前锋区', code: 511603 },
+          { id: 2400, name: '岳池县', code: 511621 },
+          { id: 2401, name: '武胜县', code: 511622 },
+          { id: 2402, name: '邻水县', code: 511623 },
+          { id: 2403, name: '华蓥市', code: 511681 }
+        ]
+      },
+      {
+        id: 2404,
+        name: '达州市',
+        code: 511700,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2405, name: '通川区', code: 511702 },
+          { id: 2406, name: '达川区', code: 511703 },
+          { id: 2407, name: '宣汉县', code: 511722 },
+          { id: 2408, name: '开江县', code: 511723 },
+          { id: 2409, name: '大竹县', code: 511724 },
+          { id: 2410, name: '渠县', code: 511725 },
+          { id: 2411, name: '万源市', code: 511781 }
+        ]
+      },
+      {
+        id: 2412,
+        name: '雅安市',
+        code: 511800,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2413, name: '雨城区', code: 511802 },
+          { id: 2414, name: '名山区', code: 511803 },
+          { id: 2415, name: '荥经县', code: 511822 },
+          { id: 2416, name: '汉源县', code: 511823 },
+          { id: 2417, name: '石棉县', code: 511824 },
+          { id: 2418, name: '天全县', code: 511825 },
+          { id: 2419, name: '芦山县', code: 511826 },
+          { id: 2420, name: '宝兴县', code: 511827 }
+        ]
+      },
+      {
+        id: 2421,
+        name: '巴中市',
+        code: 511900,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2422, name: '巴州区', code: 511902 },
+          { id: 2423, name: '恩阳区', code: 511903 },
+          { id: 2424, name: '通江县', code: 511921 },
+          { id: 2425, name: '南江县', code: 511922 },
+          { id: 2426, name: '平昌县', code: 511923 }
+        ]
+      },
+      {
+        id: 2427,
+        name: '资阳市',
+        code: 512000,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2428, name: '雁江区', code: 512002 },
+          { id: 2429, name: '安岳县', code: 512021 },
+          { id: 2430, name: '乐至县', code: 512022 }
+        ]
+      },
+      {
+        id: 2431,
+        name: '阿坝藏族羌族自治州',
+        code: 513200,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2432, name: '马尔康市', code: 513201 },
+          { id: 2433, name: '汶川县', code: 513221 },
+          { id: 2434, name: '理县', code: 513222 },
+          { id: 2435, name: '茂县', code: 513223 },
+          { id: 2436, name: '松潘县', code: 513224 },
+          { id: 2437, name: '九寨沟县', code: 513225 },
+          { id: 2438, name: '金川县', code: 513226 },
+          { id: 2439, name: '小金县', code: 513227 },
+          { id: 2440, name: '黑水县', code: 513228 },
+          { id: 2441, name: '壤塘县', code: 513230 },
+          { id: 2442, name: '阿坝县', code: 513231 },
+          { id: 2443, name: '若尔盖县', code: 513232 },
+          { id: 2444, name: '红原县', code: 513233 }
+        ]
+      },
+      {
+        id: 2445,
+        name: '甘孜藏族自治州',
+        code: 513300,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2446, name: '康定市', code: 513301 },
+          { id: 2447, name: '泸定县', code: 513322 },
+          { id: 2448, name: '丹巴县', code: 513323 },
+          { id: 2449, name: '九龙县', code: 513324 },
+          { id: 2450, name: '雅江县', code: 513325 },
+          { id: 2451, name: '道孚县', code: 513326 },
+          { id: 2452, name: '炉霍县', code: 513327 },
+          { id: 2453, name: '甘孜县', code: 513328 },
+          { id: 2454, name: '新龙县', code: 513329 },
+          { id: 2455, name: '德格县', code: 513330 },
+          { id: 2456, name: '白玉县', code: 513331 },
+          { id: 2457, name: '石渠县', code: 513332 },
+          { id: 2458, name: '色达县', code: 513333 },
+          { id: 2459, name: '理塘县', code: 513334 },
+          { id: 2460, name: '巴塘县', code: 513335 },
+          { id: 2461, name: '乡城县', code: 513336 },
+          { id: 2462, name: '稻城县', code: 513337 },
+          { id: 2463, name: '得荣县', code: 513338 }
+        ]
+      },
+      {
+        id: 2464,
+        name: '凉山彝族自治州',
+        code: 513400,
+        parentOrganId: 2277,
+        areas: [
+          { id: 2465, name: '西昌市', code: 513401 },
+          { id: 2466, name: '木里藏族自治县', code: 513422 },
+          { id: 2467, name: '盐源县', code: 513423 },
+          { id: 2468, name: '德昌县', code: 513424 },
+          { id: 2469, name: '会理县', code: 513425 },
+          { id: 2470, name: '会东县', code: 513426 },
+          { id: 2471, name: '宁南县', code: 513427 },
+          { id: 2472, name: '普格县', code: 513428 },
+          { id: 2473, name: '布拖县', code: 513429 },
+          { id: 2474, name: '金阳县', code: 513430 },
+          { id: 2475, name: '昭觉县', code: 513431 },
+          { id: 2476, name: '喜德县', code: 513432 },
+          { id: 2477, name: '冕宁县', code: 513433 },
+          { id: 2478, name: '越西县', code: 513434 },
+          { id: 2479, name: '甘洛县', code: 513435 },
+          { id: 2480, name: '美姑县', code: 513436 },
+          { id: 2481, name: '雷波县', code: 513437 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 2482,
+    name: '贵州省',
+    code: 520000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 2483,
+        name: '贵阳市',
+        code: 520100,
+        parentOrganId: 2482,
+        areas: [
+          { id: 2484, name: '南明区', code: 520102 },
+          { id: 2485, name: '云岩区', code: 520103 },
+          { id: 2486, name: '花溪区', code: 520111 },
+          { id: 2487, name: '乌当区', code: 520112 },
+          { id: 2488, name: '白云区', code: 520113 },
+          { id: 2489, name: '观山湖区', code: 520115 },
+          { id: 2490, name: '开阳县', code: 520121 },
+          { id: 2491, name: '息烽县', code: 520122 },
+          { id: 2492, name: '修文县', code: 520123 },
+          { id: 2493, name: '清镇市', code: 520181 }
+        ]
+      },
+      {
+        id: 2494,
+        name: '六盘水市',
+        code: 520200,
+        parentOrganId: 2482,
+        areas: [
+          { id: 2495, name: '钟山区', code: 520201 },
+          { id: 2496, name: '六枝特区', code: 520203 },
+          { id: 2497, name: '水城县', code: 520221 },
+          { id: 2498, name: '盘州市', code: 520222 }
+        ]
+      },
+      {
+        id: 2499,
+        name: '遵义市',
+        code: 520300,
+        parentOrganId: 2482,
+        areas: [
+          { id: 2500, name: '红花岗区', code: 520302 },
+          { id: 2501, name: '汇川区', code: 520303 },
+          { id: 2502, name: '播州区', code: 520304 },
+          { id: 2503, name: '桐梓县', code: 520322 },
+          { id: 2504, name: '绥阳县', code: 520323 },
+          { id: 2505, name: '正安县', code: 520324 },
+          { id: 2506, name: '道真仡佬族苗族自治县', code: 520325 },
+          { id: 2507, name: '务川仡佬族苗族自治县', code: 520326 },
+          { id: 2508, name: '凤冈县', code: 520327 },
+          { id: 2509, name: '湄潭县', code: 520328 },
+          { id: 2510, name: '余庆县', code: 520329 },
+          { id: 2511, name: '习水县', code: 520330 },
+          { id: 2512, name: '赤水市', code: 520381 },
+          { id: 2513, name: '仁怀市', code: 520382 }
+        ]
+      },
+      {
+        id: 2514,
+        name: '安顺市',
+        code: 520400,
+        parentOrganId: 2482,
+        areas: [
+          { id: 2515, name: '西秀区', code: 520402 },
+          { id: 2516, name: '平坝区', code: 520403 },
+          { id: 2517, name: '普定县', code: 520422 },
+          { id: 2518, name: '镇宁布依族苗族自治县', code: 520423 },
+          { id: 2519, name: '关岭布依族苗族自治县', code: 520424 },
+          { id: 2520, name: '紫云苗族布依族自治县', code: 520425 }
+        ]
+      },
+      {
+        id: 2521,
+        name: '毕节市',
+        code: 520500,
+        parentOrganId: 2482,
+        areas: [
+          { id: 2522, name: '七星关区', code: 520502 },
+          { id: 2523, name: '大方县', code: 520521 },
+          { id: 2524, name: '黔西县', code: 520522 },
+          { id: 2525, name: '金沙县', code: 520523 },
+          { id: 2526, name: '织金县', code: 520524 },
+          { id: 2527, name: '纳雍县', code: 520525 },
+          { id: 2528, name: '威宁彝族回族苗族自治县', code: 520526 },
+          { id: 2529, name: '赫章县', code: 520527 }
+        ]
+      },
+      {
+        id: 2530,
+        name: '铜仁市',
+        code: 520600,
+        parentOrganId: 2482,
+        areas: [
+          { id: 2531, name: '碧江区', code: 520602 },
+          { id: 2532, name: '万山区', code: 520603 },
+          { id: 2533, name: '江口县', code: 520621 },
+          { id: 2534, name: '玉屏侗族自治县', code: 520622 },
+          { id: 2535, name: '石阡县', code: 520623 },
+          { id: 2536, name: '思南县', code: 520624 },
+          { id: 2537, name: '印江土家族苗族自治县', code: 520625 },
+          { id: 2538, name: '德江县', code: 520626 },
+          { id: 2539, name: '沿河土家族自治县', code: 520627 },
+          { id: 2540, name: '松桃苗族自治县', code: 520628 }
+        ]
+      },
+      {
+        id: 2541,
+        name: '黔西南布依族苗族自治州',
+        code: 522300,
+        parentOrganId: 2482,
+        areas: [
+          { id: 2542, name: '兴义市', code: 522301 },
+          { id: 2543, name: '兴仁县', code: 522322 },
+          { id: 2544, name: '普安县', code: 522323 },
+          { id: 2545, name: '晴隆县', code: 522324 },
+          { id: 2546, name: '贞丰县', code: 522325 },
+          { id: 2547, name: '望谟县', code: 522326 },
+          { id: 2548, name: '册亨县', code: 522327 },
+          { id: 2549, name: '安龙县', code: 522328 }
+        ]
+      },
+      {
+        id: 2550,
+        name: '黔东南苗族侗族自治州',
+        code: 522600,
+        parentOrganId: 2482,
+        areas: [
+          { id: 2551, name: '凯里市', code: 522601 },
+          { id: 2552, name: '黄平县', code: 522622 },
+          { id: 2553, name: '施秉县', code: 522623 },
+          { id: 2554, name: '三穗县', code: 522624 },
+          { id: 2555, name: '镇远县', code: 522625 },
+          { id: 2556, name: '岑巩县', code: 522626 },
+          { id: 2557, name: '天柱县', code: 522627 },
+          { id: 2558, name: '锦屏县', code: 522628 },
+          { id: 2559, name: '剑河县', code: 522629 },
+          { id: 2560, name: '台江县', code: 522630 },
+          { id: 2561, name: '黎平县', code: 522631 },
+          { id: 2562, name: '榕江县', code: 522632 },
+          { id: 2563, name: '从江县', code: 522633 },
+          { id: 2564, name: '雷山县', code: 522634 },
+          { id: 2565, name: '麻江县', code: 522635 },
+          { id: 2566, name: '丹寨县', code: 522636 }
+        ]
+      },
+      {
+        id: 2567,
+        name: '黔南布依族苗族自治州',
+        code: 522700,
+        parentOrganId: 2482,
+        areas: [
+          { id: 2568, name: '都匀市', code: 522701 },
+          { id: 2569, name: '福泉市', code: 522702 },
+          { id: 2570, name: '荔波县', code: 522722 },
+          { id: 2571, name: '贵定县', code: 522723 },
+          { id: 2572, name: '瓮安县', code: 522725 },
+          { id: 2573, name: '独山县', code: 522726 },
+          { id: 2574, name: '平塘县', code: 522727 },
+          { id: 2575, name: '罗甸县', code: 522728 },
+          { id: 2576, name: '长顺县', code: 522729 },
+          { id: 2577, name: '龙里县', code: 522730 },
+          { id: 2578, name: '惠水县', code: 522731 },
+          { id: 2579, name: '三都水族自治县', code: 522732 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 2580,
+    name: '云南省',
+    code: 530000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 2581,
+        name: '昆明市',
+        code: 530100,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2582, name: '五华区', code: 530102 },
+          { id: 2583, name: '盘龙区', code: 530103 },
+          { id: 2584, name: '官渡区', code: 530111 },
+          { id: 2585, name: '西山区', code: 530112 },
+          { id: 2586, name: '东川区', code: 530113 },
+          { id: 2587, name: '呈贡区', code: 530114 },
+          { id: 2588, name: '晋宁区', code: 530115 },
+          { id: 2589, name: '富民县', code: 530124 },
+          { id: 2590, name: '宜良县', code: 530125 },
+          { id: 2591, name: '石林彝族自治县', code: 530126 },
+          { id: 2592, name: '嵩明县', code: 530127 },
+          { id: 2593, name: '禄劝彝族苗族自治县', code: 530128 },
+          { id: 2594, name: '寻甸回族彝族自治县', code: 530129 },
+          { id: 2595, name: '安宁市', code: 530181 }
+        ]
+      },
+      {
+        id: 2596,
+        name: '曲靖市',
+        code: 530300,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2597, name: '麒麟区', code: 530302 },
+          { id: 2598, name: '沾益区', code: 530303 },
+          { id: 2599, name: '马龙县', code: 530321 },
+          { id: 2600, name: '陆良县', code: 530322 },
+          { id: 2601, name: '师宗县', code: 530323 },
+          { id: 2602, name: '罗平县', code: 530324 },
+          { id: 2603, name: '富源县', code: 530325 },
+          { id: 2604, name: '会泽县', code: 530326 },
+          { id: 2605, name: '宣威市', code: 530381 }
+        ]
+      },
+      {
+        id: 2606,
+        name: '玉溪市',
+        code: 530400,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2607, name: '红塔区', code: 530402 },
+          { id: 2608, name: '江川区', code: 530403 },
+          { id: 2609, name: '澄江县', code: 530422 },
+          { id: 2610, name: '通海县', code: 530423 },
+          { id: 2611, name: '华宁县', code: 530424 },
+          { id: 2612, name: '易门县', code: 530425 },
+          { id: 2613, name: '峨山彝族自治县', code: 530426 },
+          { id: 2614, name: '新平彝族傣族自治县', code: 530427 },
+          { id: 2615, name: '元江哈尼族彝族傣族自治县', code: 530428 }
+        ]
+      },
+      {
+        id: 2616,
+        name: '保山市',
+        code: 530500,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2617, name: '隆阳区', code: 530502 },
+          { id: 2618, name: '施甸县', code: 530521 },
+          { id: 2619, name: '龙陵县', code: 530523 },
+          { id: 2620, name: '昌宁县', code: 530524 },
+          { id: 2621, name: '腾冲市', code: 530581 }
+        ]
+      },
+      {
+        id: 2622,
+        name: '昭通市',
+        code: 530600,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2623, name: '昭阳区', code: 530602 },
+          { id: 2624, name: '鲁甸县', code: 530621 },
+          { id: 2625, name: '巧家县', code: 530622 },
+          { id: 2626, name: '盐津县', code: 530623 },
+          { id: 2627, name: '大关县', code: 530624 },
+          { id: 2628, name: '永善县', code: 530625 },
+          { id: 2629, name: '绥江县', code: 530626 },
+          { id: 2630, name: '镇雄县', code: 530627 },
+          { id: 2631, name: '彝良县', code: 530628 },
+          { id: 2632, name: '威信县', code: 530629 },
+          { id: 2633, name: '水富县', code: 530630 }
+        ]
+      },
+      {
+        id: 2634,
+        name: '丽江市',
+        code: 530700,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2635, name: '古城区', code: 530702 },
+          { id: 2636, name: '玉龙纳西族自治县', code: 530721 },
+          { id: 2637, name: '永胜县', code: 530722 },
+          { id: 2638, name: '华坪县', code: 530723 },
+          { id: 2639, name: '宁蒗彝族自治县', code: 530724 }
+        ]
+      },
+      {
+        id: 2640,
+        name: '普洱市',
+        code: 530800,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2641, name: '思茅区', code: 530802 },
+          { id: 2642, name: '宁洱哈尼族彝族自治县', code: 530821 },
+          { id: 2643, name: '墨江哈尼族自治县', code: 530822 },
+          { id: 2644, name: '景东彝族自治县', code: 530823 },
+          { id: 2645, name: '景谷傣族彝族自治县', code: 530824 },
+          { id: 2646, name: '镇沅彝族哈尼族拉祜族自治县', code: 530825 },
+          { id: 2647, name: '江城哈尼族彝族自治县', code: 530826 },
+          { id: 2648, name: '孟连傣族拉祜族佤族自治县', code: 530827 },
+          { id: 2649, name: '澜沧拉祜族自治县', code: 530828 },
+          { id: 2650, name: '西盟佤族自治县', code: 530829 }
+        ]
+      },
+      {
+        id: 2651,
+        name: '临沧市',
+        code: 530900,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2652, name: '临翔区', code: 530902 },
+          { id: 2653, name: '凤庆县', code: 530921 },
+          { id: 2654, name: '云县', code: 530922 },
+          { id: 2655, name: '永德县', code: 530923 },
+          { id: 2656, name: '镇康县', code: 530924 },
+          { id: 2657, name: '双江拉祜族佤族布朗族傣族自治县', code: 530925 },
+          { id: 2658, name: '耿马傣族佤族自治县', code: 530926 },
+          { id: 2659, name: '沧源佤族自治县', code: 530927 }
+        ]
+      },
+      {
+        id: 2660,
+        name: '楚雄彝族自治州',
+        code: 532300,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2661, name: '楚雄市', code: 532301 },
+          { id: 2662, name: '双柏县', code: 532322 },
+          { id: 2663, name: '牟定县', code: 532323 },
+          { id: 2664, name: '南华县', code: 532324 },
+          { id: 2665, name: '姚安县', code: 532325 },
+          { id: 2666, name: '大姚县', code: 532326 },
+          { id: 2667, name: '永仁县', code: 532327 },
+          { id: 2668, name: '元谋县', code: 532328 },
+          { id: 2669, name: '武定县', code: 532329 },
+          { id: 2670, name: '禄丰县', code: 532331 }
+        ]
+      },
+      {
+        id: 2671,
+        name: '红河哈尼族彝族自治州',
+        code: 532500,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2672, name: '个旧市', code: 532501 },
+          { id: 2673, name: '开远市', code: 532502 },
+          { id: 2674, name: '蒙自市', code: 532503 },
+          { id: 2675, name: '弥勒市', code: 532504 },
+          { id: 2676, name: '屏边苗族自治县', code: 532523 },
+          { id: 2677, name: '建水县', code: 532524 },
+          { id: 2678, name: '石屏县', code: 532525 },
+          { id: 2679, name: '泸西县', code: 532527 },
+          { id: 2680, name: '元阳县', code: 532528 },
+          { id: 2681, name: '红河县', code: 532529 },
+          { id: 2682, name: '金平苗族瑶族傣族自治县', code: 532530 },
+          { id: 2683, name: '绿春县', code: 532531 },
+          { id: 2684, name: '河口瑶族自治县', code: 532532 }
+        ]
+      },
+      {
+        id: 2685,
+        name: '文山壮族苗族自治州',
+        code: 532600,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2686, name: '文山市', code: 532601 },
+          { id: 2687, name: '砚山县', code: 532622 },
+          { id: 2688, name: '西畴县', code: 532623 },
+          { id: 2689, name: '麻栗坡县', code: 532624 },
+          { id: 2690, name: '马关县', code: 532625 },
+          { id: 2691, name: '丘北县', code: 532626 },
+          { id: 2692, name: '广南县', code: 532627 },
+          { id: 2693, name: '富宁县', code: 532628 }
+        ]
+      },
+      {
+        id: 2694,
+        name: '西双版纳傣族自治州',
+        code: 532800,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2695, name: '景洪市', code: 532801 },
+          { id: 2696, name: '勐海县', code: 532822 },
+          { id: 2697, name: '勐腊县', code: 532823 }
+        ]
+      },
+      {
+        id: 2698,
+        name: '大理白族自治州',
+        code: 532900,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2699, name: '大理市', code: 532901 },
+          { id: 2700, name: '漾濞彝族自治县', code: 532922 },
+          { id: 2701, name: '祥云县', code: 532923 },
+          { id: 2702, name: '宾川县', code: 532924 },
+          { id: 2703, name: '弥渡县', code: 532925 },
+          { id: 2704, name: '南涧彝族自治县', code: 532926 },
+          { id: 2705, name: '巍山彝族回族自治县', code: 532927 },
+          { id: 2706, name: '永平县', code: 532928 },
+          { id: 2707, name: '云龙县', code: 532929 },
+          { id: 2708, name: '洱源县', code: 532930 },
+          { id: 2709, name: '剑川县', code: 532931 },
+          { id: 2710, name: '鹤庆县', code: 532932 }
+        ]
+      },
+      {
+        id: 2711,
+        name: '德宏傣族景颇族自治州',
+        code: 533100,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2712, name: '瑞丽市', code: 533102 },
+          { id: 2713, name: '芒市', code: 533103 },
+          { id: 2714, name: '梁河县', code: 533122 },
+          { id: 2715, name: '盈江县', code: 533123 },
+          { id: 2716, name: '陇川县', code: 533124 }
+        ]
+      },
+      {
+        id: 2717,
+        name: '怒江傈僳族自治州',
+        code: 533300,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2718, name: '泸水市', code: 533301 },
+          { id: 2719, name: '福贡县', code: 533323 },
+          { id: 2720, name: '贡山独龙族怒族自治县', code: 533324 },
+          { id: 2721, name: '兰坪白族普米族自治县', code: 533325 }
+        ]
+      },
+      {
+        id: 2722,
+        name: '迪庆藏族自治州',
+        code: 533400,
+        parentOrganId: 2580,
+        areas: [
+          { id: 2723, name: '香格里拉市', code: 533401 },
+          { id: 2724, name: '德钦县', code: 533422 },
+          { id: 2725, name: '维西傈僳族自治县', code: 533423 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 2726,
+    name: '西藏自治区',
+    code: 540000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 2727,
+        name: '拉萨市',
+        code: 540100,
+        parentOrganId: 2726,
+        areas: [
+          { id: 2728, name: '城关区', code: 540102 },
+          { id: 2729, name: '堆龙德庆区', code: 540103 },
+          { id: 2730, name: '林周县', code: 540121 },
+          { id: 2731, name: '当雄县', code: 540122 },
+          { id: 2732, name: '尼木县', code: 540123 },
+          { id: 2733, name: '曲水县', code: 540124 },
+          { id: 2734, name: '达孜县', code: 540126 },
+          { id: 2735, name: '墨竹工卡县', code: 540127 }
+        ]
+      },
+      {
+        id: 2736,
+        name: '日喀则市',
+        code: 540200,
+        parentOrganId: 2726,
+        areas: [
+          { id: 2737, name: '桑珠孜区', code: 540202 },
+          { id: 2738, name: '南木林县', code: 540221 },
+          { id: 2739, name: '江孜县', code: 540222 },
+          { id: 2740, name: '定日县', code: 540223 },
+          { id: 2741, name: '萨迦县', code: 540224 },
+          { id: 2742, name: '拉孜县', code: 540225 },
+          { id: 2743, name: '昂仁县', code: 540226 },
+          { id: 2744, name: '谢通门县', code: 540227 },
+          { id: 2745, name: '白朗县', code: 540228 },
+          { id: 2746, name: '仁布县', code: 540229 },
+          { id: 2747, name: '康马县', code: 540230 },
+          { id: 2748, name: '定结县', code: 540231 },
+          { id: 2749, name: '仲巴县', code: 540232 },
+          { id: 2750, name: '亚东县', code: 540233 },
+          { id: 2751, name: '吉隆县', code: 540234 },
+          { id: 2752, name: '聂拉木县', code: 540235 },
+          { id: 2753, name: '萨嘎县', code: 540236 },
+          { id: 2754, name: '岗巴县', code: 540237 }
+        ]
+      },
+      {
+        id: 2755,
+        name: '昌都市',
+        code: 540300,
+        parentOrganId: 2726,
+        areas: [
+          { id: 2756, name: '卡若区', code: 540302 },
+          { id: 2757, name: '江达县', code: 540321 },
+          { id: 2758, name: '贡觉县', code: 540322 },
+          { id: 2759, name: '类乌齐县', code: 540323 },
+          { id: 2760, name: '丁青县', code: 540324 },
+          { id: 2761, name: '察雅县', code: 540325 },
+          { id: 2762, name: '八宿县', code: 540326 },
+          { id: 2763, name: '左贡县', code: 540327 },
+          { id: 2764, name: '芒康县', code: 540328 },
+          { id: 2765, name: '洛隆县', code: 540329 },
+          { id: 2766, name: '边坝县', code: 540330 }
+        ]
+      },
+      {
+        id: 2767,
+        name: '林芝市',
+        code: 540400,
+        parentOrganId: 2726,
+        areas: [
+          { id: 2768, name: '巴宜区', code: 540402 },
+          { id: 2769, name: '工布江达县', code: 540421 },
+          { id: 2770, name: '米林县', code: 540422 },
+          { id: 2771, name: '墨脱县', code: 540423 },
+          { id: 2772, name: '波密县', code: 540424 },
+          { id: 2773, name: '察隅县', code: 540425 },
+          { id: 2774, name: '朗县', code: 540426 }
+        ]
+      },
+      {
+        id: 2775,
+        name: '山南市',
+        code: 540500,
+        parentOrganId: 2726,
+        areas: [
+          { id: 2776, name: '乃东区', code: 540502 },
+          { id: 2777, name: '扎囊县', code: 540521 },
+          { id: 2778, name: '贡嘎县', code: 540522 },
+          { id: 2779, name: '桑日县', code: 540523 },
+          { id: 2780, name: '琼结县', code: 540524 },
+          { id: 2781, name: '曲松县', code: 540525 },
+          { id: 2782, name: '措美县', code: 540526 },
+          { id: 2783, name: '洛扎县', code: 540527 },
+          { id: 2784, name: '加查县', code: 540528 },
+          { id: 2785, name: '隆子县', code: 540529 },
+          { id: 2786, name: '错那县', code: 540530 },
+          { id: 2787, name: '浪卡子县', code: 540531 }
+        ]
+      },
+      {
+        id: 2788,
+        name: '那曲地区',
+        code: 542400,
+        parentOrganId: 2726,
+        areas: [
+          { id: 2789, name: '那曲县', code: 542421 },
+          { id: 2790, name: '嘉黎县', code: 542422 },
+          { id: 2791, name: '比如县', code: 542423 },
+          { id: 2792, name: '聂荣县', code: 542424 },
+          { id: 2793, name: '安多县', code: 542425 },
+          { id: 2794, name: '申扎县', code: 542426 },
+          { id: 2795, name: '索县', code: 542427 },
+          { id: 2796, name: '班戈县', code: 542428 },
+          { id: 2797, name: '巴青县', code: 542429 },
+          { id: 2798, name: '尼玛县', code: 542430 },
+          { id: 2799, name: '双湖县', code: 542431 }
+        ]
+      },
+      {
+        id: 2800,
+        name: '阿里地区',
+        code: 542500,
+        parentOrganId: 2726,
+        areas: [
+          { id: 2801, name: '普兰县', code: 542521 },
+          { id: 2802, name: '札达县', code: 542522 },
+          { id: 2803, name: '噶尔县', code: 542523 },
+          { id: 2804, name: '日土县', code: 542524 },
+          { id: 2805, name: '革吉县', code: 542525 },
+          { id: 2806, name: '改则县', code: 542526 },
+          { id: 2807, name: '措勤县', code: 542527 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 2808,
+    name: '陕西省',
+    code: 610000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 2809,
+        name: '西安市',
+        code: 610100,
+        parentOrganId: 2808,
+        areas: [
+          { id: 2810, name: '新城区', code: 610102 },
+          { id: 2811, name: '碑林区', code: 610103 },
+          { id: 2812, name: '莲湖区', code: 610104 },
+          { id: 2813, name: '灞桥区', code: 610111 },
+          { id: 2814, name: '未央区', code: 610112 },
+          { id: 2815, name: '雁塔区', code: 610113 },
+          { id: 2816, name: '阎良区', code: 610114 },
+          { id: 2817, name: '临潼区', code: 610115 },
+          { id: 2818, name: '长安区', code: 610116 },
+          { id: 2819, name: '高陵区', code: 610117 },
+          { id: 2820, name: '蓝田县', code: 610122 },
+          { id: 2821, name: '周至县', code: 610124 },
+          { id: 2822, name: '鄠邑区', code: 610118 }
+        ]
+      },
+      {
+        id: 2823,
+        name: '铜川市',
+        code: 610200,
+        parentOrganId: 2808,
+        areas: [
+          { id: 2824, name: '王益区', code: 610202 },
+          { id: 2825, name: '印台区', code: 610203 },
+          { id: 2826, name: '耀州区', code: 610204 },
+          { id: 2827, name: '宜君县', code: 610222 }
+        ]
+      },
+      {
+        id: 2828,
+        name: '宝鸡市',
+        code: 610300,
+        parentOrganId: 2808,
+        areas: [
+          { id: 2829, name: '渭滨区', code: 610302 },
+          { id: 2830, name: '金台区', code: 610303 },
+          { id: 2831, name: '陈仓区', code: 610304 },
+          { id: 2832, name: '凤翔县', code: 610322 },
+          { id: 2833, name: '岐山县', code: 610323 },
+          { id: 2834, name: '扶风县', code: 610324 },
+          { id: 2835, name: '眉县', code: 610326 },
+          { id: 2836, name: '陇县', code: 610327 },
+          { id: 2837, name: '千阳县', code: 610328 },
+          { id: 2838, name: '麟游县', code: 610329 },
+          { id: 2839, name: '凤县', code: 610330 },
+          { id: 2840, name: '太白县', code: 610331 }
+        ]
+      },
+      {
+        id: 2841,
+        name: '咸阳市',
+        code: 610400,
+        parentOrganId: 2808,
+        areas: [
+          { id: 2842, name: '秦都区', code: 610402 },
+          { id: 2843, name: '杨陵区', code: 610403 },
+          { id: 2844, name: '渭城区', code: 610404 },
+          { id: 2845, name: '三原县', code: 610422 },
+          { id: 2846, name: '泾阳县', code: 610423 },
+          { id: 2847, name: '乾县', code: 610424 },
+          { id: 2848, name: '礼泉县', code: 610425 },
+          { id: 2849, name: '永寿县', code: 610426 },
+          { id: 2850, name: '彬县', code: 610427 },
+          { id: 2851, name: '长武县', code: 610428 },
+          { id: 2852, name: '旬邑县', code: 610429 },
+          { id: 2853, name: '淳化县', code: 610430 },
+          { id: 2854, name: '武功县', code: 610431 },
+          { id: 2855, name: '兴平市', code: 610481 }
+        ]
+      },
+      {
+        id: 2856,
+        name: '渭南市',
+        code: 610500,
+        parentOrganId: 2808,
+        areas: [
+          { id: 2857, name: '临渭区', code: 610502 },
+          { id: 2858, name: '华州区', code: 610503 },
+          { id: 2859, name: '潼关县', code: 610522 },
+          { id: 2860, name: '大荔县', code: 610523 },
+          { id: 2861, name: '合阳县', code: 610524 },
+          { id: 2862, name: '澄城县', code: 610525 },
+          { id: 2863, name: '蒲城县', code: 610526 },
+          { id: 2864, name: '白水县', code: 610527 },
+          { id: 2865, name: '富平县', code: 610528 },
+          { id: 2866, name: '韩城市', code: 610581 },
+          { id: 2867, name: '华阴市', code: 610582 }
+        ]
+      },
+      {
+        id: 2868,
+        name: '延安市',
+        code: 610600,
+        parentOrganId: 2808,
+        areas: [
+          { id: 2869, name: '宝塔区', code: 610602 },
+          { id: 2870, name: '延长县', code: 610621 },
+          { id: 2871, name: '延川县', code: 610622 },
+          { id: 2872, name: '子长县', code: 610623 },
+          { id: 2873, name: '安塞区', code: 610603 },
+          { id: 2874, name: '志丹县', code: 610625 },
+          { id: 2875, name: '吴起县', code: 610626 },
+          { id: 2876, name: '甘泉县', code: 610627 },
+          { id: 2877, name: '富县', code: 610628 },
+          { id: 2878, name: '洛川县', code: 610629 },
+          { id: 2879, name: '宜川县', code: 610630 },
+          { id: 2880, name: '黄龙县', code: 610631 },
+          { id: 2881, name: '黄陵县', code: 610632 }
+        ]
+      },
+      {
+        id: 2882,
+        name: '汉中市',
+        code: 610700,
+        parentOrganId: 2808,
+        areas: [
+          { id: 2883, name: '汉台区', code: 610702 },
+          { id: 2884, name: '南郑县', code: 610721 },
+          { id: 2885, name: '城固县', code: 610722 },
+          { id: 2886, name: '洋县', code: 610723 },
+          { id: 2887, name: '西乡县', code: 610724 },
+          { id: 2888, name: '勉县', code: 610725 },
+          { id: 2889, name: '宁强县', code: 610726 },
+          { id: 2890, name: '略阳县', code: 610727 },
+          { id: 2891, name: '镇巴县', code: 610728 },
+          { id: 2892, name: '留坝县', code: 610729 },
+          { id: 2893, name: '佛坪县', code: 610730 }
+        ]
+      },
+      {
+        id: 2894,
+        name: '榆林市',
+        code: 610800,
+        parentOrganId: 2808,
+        areas: [
+          { id: 2895, name: '榆阳区', code: 610802 },
+          { id: 2896, name: '横山区', code: 610803 },
+          { id: 2897, name: '神木市', code: 610881 },
+          { id: 2898, name: '府谷县', code: 610822 },
+          { id: 2899, name: '靖边县', code: 610824 },
+          { id: 2900, name: '定边县', code: 610825 },
+          { id: 2901, name: '绥德县', code: 610826 },
+          { id: 2902, name: '米脂县', code: 610827 },
+          { id: 2903, name: '佳县', code: 610828 },
+          { id: 2904, name: '吴堡县', code: 610829 },
+          { id: 2905, name: '清涧县', code: 610830 },
+          { id: 2906, name: '子洲县', code: 610831 }
+        ]
+      },
+      {
+        id: 2907,
+        name: '安康市',
+        code: 610900,
+        parentOrganId: 2808,
+        areas: [
+          { id: 2908, name: '汉滨区', code: 610902 },
+          { id: 2909, name: '汉阴县', code: 610921 },
+          { id: 2910, name: '石泉县', code: 610922 },
+          { id: 2911, name: '宁陕县', code: 610923 },
+          { id: 2912, name: '紫阳县', code: 610924 },
+          { id: 2913, name: '岚皋县', code: 610925 },
+          { id: 2914, name: '平利县', code: 610926 },
+          { id: 2915, name: '镇坪县', code: 610927 },
+          { id: 2916, name: '旬阳县', code: 610928 },
+          { id: 2917, name: '白河县', code: 610929 }
+        ]
+      },
+      {
+        id: 2918,
+        name: '商洛市',
+        code: 611000,
+        parentOrganId: 2808,
+        areas: [
+          { id: 2919, name: '商州区', code: 611002 },
+          { id: 2920, name: '洛南县', code: 611021 },
+          { id: 2921, name: '丹凤县', code: 611022 },
+          { id: 2922, name: '商南县', code: 611023 },
+          { id: 2923, name: '山阳县', code: 611024 },
+          { id: 2924, name: '镇安县', code: 611025 },
+          { id: 2925, name: '柞水县', code: 611026 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 2926,
+    name: '甘肃省',
+    code: 620000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 2927,
+        name: '兰州市',
+        code: 620100,
+        parentOrganId: 2926,
+        areas: [
+          { id: 2928, name: '城关区', code: 620102 },
+          { id: 2929, name: '七里河区', code: 620103 },
+          { id: 2930, name: '西固区', code: 620104 },
+          { id: 2931, name: '安宁区', code: 620105 },
+          { id: 2932, name: '红古区', code: 620111 },
+          { id: 2933, name: '永登县', code: 620121 },
+          { id: 2934, name: '皋兰县', code: 620122 },
+          { id: 2935, name: '榆中县', code: 620123 }
+        ]
+      },
+      { id: 2936, name: '嘉峪关市', code: 620200, parentOrganId: 2926 },
+      {
+        id: 2937,
+        name: '金昌市',
+        code: 620300,
+        parentOrganId: 2926,
+        areas: [
+          { id: 2938, name: '金川区', code: 620302 },
+          { id: 2939, name: '永昌县', code: 620321 }
+        ]
+      },
+      {
+        id: 2940,
+        name: '白银市',
+        code: 620400,
+        parentOrganId: 2926,
+        areas: [
+          { id: 2941, name: '白银区', code: 620402 },
+          { id: 2942, name: '平川区', code: 620403 },
+          { id: 2943, name: '靖远县', code: 620421 },
+          { id: 2944, name: '会宁县', code: 620422 },
+          { id: 2945, name: '景泰县', code: 620423 }
+        ]
+      },
+      {
+        id: 2946,
+        name: '天水市',
+        code: 620500,
+        parentOrganId: 2926,
+        areas: [
+          { id: 2947, name: '秦州区', code: 620502 },
+          { id: 2948, name: '麦积区', code: 620503 },
+          { id: 2949, name: '清水县', code: 620521 },
+          { id: 2950, name: '秦安县', code: 620522 },
+          { id: 2951, name: '甘谷县', code: 620523 },
+          { id: 2952, name: '武山县', code: 620524 },
+          { id: 2953, name: '张家川回族自治县', code: 620525 }
+        ]
+      },
+      {
+        id: 2954,
+        name: '武威市',
+        code: 620600,
+        parentOrganId: 2926,
+        areas: [
+          { id: 2955, name: '凉州区', code: 620602 },
+          { id: 2956, name: '民勤县', code: 620621 },
+          { id: 2957, name: '古浪县', code: 620622 },
+          { id: 2958, name: '天祝藏族自治县', code: 620623 }
+        ]
+      },
+      {
+        id: 2959,
+        name: '张掖市',
+        code: 620700,
+        parentOrganId: 2926,
+        areas: [
+          { id: 2960, name: '甘州区', code: 620702 },
+          { id: 2961, name: '肃南裕固族自治县', code: 620721 },
+          { id: 2962, name: '民乐县', code: 620722 },
+          { id: 2963, name: '临泽县', code: 620723 },
+          { id: 2964, name: '高台县', code: 620724 },
+          { id: 2965, name: '山丹县', code: 620725 }
+        ]
+      },
+      {
+        id: 2966,
+        name: '平凉市',
+        code: 620800,
+        parentOrganId: 2926,
+        areas: [
+          { id: 2967, name: '崆峒区', code: 620802 },
+          { id: 2968, name: '泾川县', code: 620821 },
+          { id: 2969, name: '灵台县', code: 620822 },
+          { id: 2970, name: '崇信县', code: 620823 },
+          { id: 2971, name: '华亭县', code: 620824 },
+          { id: 2972, name: '庄浪县', code: 620825 },
+          { id: 2973, name: '静宁县', code: 620826 }
+        ]
+      },
+      {
+        id: 2974,
+        name: '酒泉市',
+        code: 620900,
+        parentOrganId: 2926,
+        areas: [
+          { id: 2975, name: '肃州区', code: 620902 },
+          { id: 2976, name: '金塔县', code: 620921 },
+          { id: 2977, name: '瓜州县', code: 620922 },
+          { id: 2978, name: '肃北蒙古族自治县', code: 620923 },
+          { id: 2979, name: '阿克塞哈萨克族自治县', code: 620924 },
+          { id: 2980, name: '玉门市', code: 620981 },
+          { id: 2981, name: '敦煌市', code: 620982 }
+        ]
+      },
+      {
+        id: 2982,
+        name: '庆阳市',
+        code: 621000,
+        parentOrganId: 2926,
+        areas: [
+          { id: 2983, name: '西峰区', code: 621002 },
+          { id: 2984, name: '庆城县', code: 621021 },
+          { id: 2985, name: '环县', code: 621022 },
+          { id: 2986, name: '华池县', code: 621023 },
+          { id: 2987, name: '合水县', code: 621024 },
+          { id: 2988, name: '正宁县', code: 621025 },
+          { id: 2989, name: '宁县', code: 621026 },
+          { id: 2990, name: '镇原县', code: 621027 }
+        ]
+      },
+      {
+        id: 2991,
+        name: '定西市',
+        code: 621100,
+        parentOrganId: 2926,
+        areas: [
+          { id: 2992, name: '安定区', code: 621102 },
+          { id: 2993, name: '通渭县', code: 621121 },
+          { id: 2994, name: '陇西县', code: 621122 },
+          { id: 2995, name: '渭源县', code: 621123 },
+          { id: 2996, name: '临洮县', code: 621124 },
+          { id: 2997, name: '漳县', code: 621125 },
+          { id: 2998, name: '岷县', code: 621126 }
+        ]
+      },
+      {
+        id: 2999,
+        name: '陇南市',
+        code: 621200,
+        parentOrganId: 2926,
+        areas: [
+          { id: 3000, name: '武都区', code: 621202 },
+          { id: 3001, name: '成县', code: 621221 },
+          { id: 3002, name: '文县', code: 621222 },
+          { id: 3003, name: '宕昌县', code: 621223 },
+          { id: 3004, name: '康县', code: 621224 },
+          { id: 3005, name: '西和县', code: 621225 },
+          { id: 3006, name: '礼县', code: 621226 },
+          { id: 3007, name: '徽县', code: 621227 },
+          { id: 3008, name: '两当县', code: 621228 }
+        ]
+      },
+      {
+        id: 3009,
+        name: '临夏回族自治州',
+        code: 622900,
+        parentOrganId: 2926,
+        areas: [
+          { id: 3010, name: '临夏市', code: 622901 },
+          { id: 3011, name: '临夏县', code: 622921 },
+          { id: 3012, name: '康乐县', code: 622922 },
+          { id: 3013, name: '永靖县', code: 622923 },
+          { id: 3014, name: '广河县', code: 622924 },
+          { id: 3015, name: '和政县', code: 622925 },
+          { id: 3016, name: '东乡族自治县', code: 622926 },
+          { id: 3017, name: '积石山保安族东乡族撒拉族自治县', code: 622927 }
+        ]
+      },
+      {
+        id: 3018,
+        name: '甘南藏族自治州',
+        code: 623000,
+        parentOrganId: 2926,
+        areas: [
+          { id: 3019, name: '合作市', code: 623001 },
+          { id: 3020, name: '临潭县', code: 623021 },
+          { id: 3021, name: '卓尼县', code: 623022 },
+          { id: 3022, name: '舟曲县', code: 623023 },
+          { id: 3023, name: '迭部县', code: 623024 },
+          { id: 3024, name: '玛曲县', code: 623025 },
+          { id: 3025, name: '碌曲县', code: 623026 },
+          { id: 3026, name: '夏河县', code: 623027 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 3027,
+    name: '青海省',
+    code: 630000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 3028,
+        name: '西宁市',
+        code: 630100,
+        parentOrganId: 3027,
+        areas: [
+          { id: 3029, name: '城东区', code: 630102 },
+          { id: 3030, name: '城中区', code: 630103 },
+          { id: 3031, name: '城西区', code: 630104 },
+          { id: 3032, name: '城北区', code: 630105 },
+          { id: 3033, name: '大通回族土族自治县', code: 630121 },
+          { id: 3034, name: '湟中县', code: 630122 },
+          { id: 3035, name: '湟源县', code: 630123 }
+        ]
+      },
+      {
+        id: 3036,
+        name: '海东市',
+        code: 630200,
+        parentOrganId: 3027,
+        areas: [
+          { id: 3037, name: '乐都区', code: 630202 },
+          { id: 3038, name: '平安区', code: 630203 },
+          { id: 3039, name: '民和回族土族自治县', code: 630222 },
+          { id: 3040, name: '互助土族自治县', code: 630223 },
+          { id: 3041, name: '化隆回族自治县', code: 630224 },
+          { id: 3042, name: '循化撒拉族自治县', code: 630225 }
+        ]
+      },
+      {
+        id: 3043,
+        name: '海北藏族自治州',
+        code: 632200,
+        parentOrganId: 3027,
+        areas: [
+          { id: 3044, name: '门源回族自治县', code: 632221 },
+          { id: 3045, name: '祁连县', code: 632222 },
+          { id: 3046, name: '海晏县', code: 632223 },
+          { id: 3047, name: '刚察县', code: 632224 }
+        ]
+      },
+      {
+        id: 3048,
+        name: '黄南藏族自治州',
+        code: 632300,
+        parentOrganId: 3027,
+        areas: [
+          { id: 3049, name: '同仁县', code: 632321 },
+          { id: 3050, name: '尖扎县', code: 632322 },
+          { id: 3051, name: '泽库县', code: 632323 },
+          { id: 3052, name: '河南蒙古族自治县', code: 632324 }
+        ]
+      },
+      {
+        id: 3053,
+        name: '海南藏族自治州',
+        code: 632500,
+        parentOrganId: 3027,
+        areas: [
+          { id: 3054, name: '共和县', code: 632521 },
+          { id: 3055, name: '同德县', code: 632522 },
+          { id: 3056, name: '贵德县', code: 632523 },
+          { id: 3057, name: '兴海县', code: 632524 },
+          { id: 3058, name: '贵南县', code: 632525 }
+        ]
+      },
+      {
+        id: 3059,
+        name: '果洛藏族自治州',
+        code: 632600,
+        parentOrganId: 3027,
+        areas: [
+          { id: 3060, name: '玛沁县', code: 632621 },
+          { id: 3061, name: '班玛县', code: 632622 },
+          { id: 3062, name: '甘德县', code: 632623 },
+          { id: 3063, name: '达日县', code: 632624 },
+          { id: 3064, name: '久治县', code: 632625 },
+          { id: 3065, name: '玛多县', code: 632626 }
+        ]
+      },
+      {
+        id: 3066,
+        name: '玉树藏族自治州',
+        code: 632700,
+        parentOrganId: 3027,
+        areas: [
+          { id: 3067, name: '玉树市', code: 632701 },
+          { id: 3068, name: '杂多县', code: 632722 },
+          { id: 3069, name: '称多县', code: 632723 },
+          { id: 3070, name: '治多县', code: 632724 },
+          { id: 3071, name: '囊谦县', code: 632725 },
+          { id: 3072, name: '曲麻莱县', code: 632726 }
+        ]
+      },
+      {
+        id: 3073,
+        name: '海西蒙古族藏族自治州',
+        code: 632800,
+        parentOrganId: 3027,
+        areas: [
+          { id: 3074, name: '格尔木市', code: 632801 },
+          { id: 3075, name: '德令哈市', code: 632802 },
+          { id: 3076, name: '乌兰县', code: 632821 },
+          { id: 3077, name: '都兰县', code: 632822 },
+          { id: 3078, name: '天峻县', code: 632823 },
+          { id: 3079, name: '海西蒙古族藏族自治州直辖', code: 632825 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 3080,
+    name: '宁夏回族自治区',
+    code: 640000,
+    parentOrganId: 0,
+    areas: [
+      {
+        id: 3081,
+        name: '银川市',
+        code: 640100,
+        parentOrganId: 3080,
+        areas: [
+          { id: 3082, name: '兴庆区', code: 640104 },
+          { id: 3083, name: '西夏区', code: 640105 },
+          { id: 3084, name: '金凤区', code: 640106 },
+          { id: 3085, name: '永宁县', code: 640121 },
+          { id: 3086, name: '贺兰县', code: 640122 },
+          { id: 3087, name: '灵武市', code: 640181 }
+        ]
+      },
+      {
+        id: 3088,
+        name: '石嘴山市',
+        code: 640200,
+        parentOrganId: 3080,
+        areas: [
+          { id: 3089, name: '大武口区', code: 640202 },
+          { id: 3090, name: '惠农区', code: 640205 },
+          { id: 3091, name: '平罗县', code: 640221 }
+        ]
+      },
+      {
+        id: 3092,
+        name: '吴忠市',
+        code: 640300,
+        parentOrganId: 3080,
+        areas: [
+          { id: 3093, name: '利通区', code: 640302 },
+          { id: 3094, name: '红寺堡区', code: 640303 },
+          { id: 3095, name: '盐池县', code: 640323 },
+          { id: 3096, name: '同心县', code: 640324 },
+          { id: 3097, name: '青铜峡市', code: 640381 }
+        ]
+      },
+      {
+        id: 3098,
+        name: '固原市',
+        code: 640400,
+        parentOrganId: 3080,
+        areas: [
+          { id: 3099, name: '原州区', code: 640402 },
+          { id: 3100, name: '西吉县', code: 640422 },
+          { id: 3101, name: '隆德县', code: 640423 },
+          { id: 3102, name: '泾源县', code: 640424 },
+          { id: 3103, name: '彭阳县', code: 640425 }
+        ]
+      },
+      {
+        id: 3104,
+        name: '中卫市',
+        code: 640500,
+        parentOrganId: 3080,
+        areas: [
+          { id: 3105, name: '沙坡头区', code: 640502 },
+          { id: 3106, name: '中宁县', code: 640521 },
+          { id: 3107, name: '海原县', code: 640522 }
+        ]
+      }
+    ]
+  },
+  {
+    id: 3108,
+    name: '新疆维吾尔自治区',
+    code: 650000,
+    parentOrganId: 0,
+    areas: [
+      { id: 3109, name: '阿拉尔市', code: 659002, parentOrganId: 3108 },
+      { id: 3110, name: '北屯市', code: 659005, parentOrganId: 3108 },
+      { id: 3111, name: '可克达拉市', code: 659008, parentOrganId: 3108 },
+      { id: 3112, name: '昆玉市', code: 659009, parentOrganId: 3108 },
+      { id: 3113, name: '石河子市', code: 659001, parentOrganId: 3108 },
+      { id: 3114, name: '双河市', code: 659007, parentOrganId: 3108 },
+      {
+        id: 3115,
+        name: '乌鲁木齐市',
+        code: 650100,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3116, name: '天山区', code: 650102 },
+          { id: 3117, name: '沙依巴克区', code: 650103 },
+          { id: 3118, name: '新市区', code: 650104 },
+          { id: 3119, name: '水磨沟区', code: 650105 },
+          { id: 3120, name: '头屯河区', code: 650106 },
+          { id: 3121, name: '达坂城区', code: 650107 },
+          { id: 3122, name: '米东区', code: 650109 },
+          { id: 3123, name: '乌鲁木齐县', code: 650121 }
+        ]
+      },
+      {
+        id: 3124,
+        name: '克拉玛依市',
+        code: 650200,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3125, name: '独山子区', code: 650202 },
+          { id: 3126, name: '克拉玛依区', code: 650203 },
+          { id: 3127, name: '白碱滩区', code: 650204 },
+          { id: 3128, name: '乌尔禾区', code: 650205 }
+        ]
+      },
+      {
+        id: 3129,
+        name: '吐鲁番市',
+        code: 650400,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3130, name: '高昌区', code: 650402 },
+          { id: 3131, name: '鄯善县', code: 650421 },
+          { id: 3132, name: '托克逊县', code: 650422 }
+        ]
+      },
+      {
+        id: 3133,
+        name: '哈密市',
+        code: 650500,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3134, name: '伊州区', code: 650502 },
+          { id: 3135, name: '巴里坤哈萨克自治县', code: 650521 },
+          { id: 3136, name: '伊吾县', code: 650522 }
+        ]
+      },
+      {
+        id: 3137,
+        name: '昌吉回族自治州',
+        code: 652300,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3138, name: '昌吉市', code: 652301 },
+          { id: 3139, name: '阜康市', code: 652302 },
+          { id: 3140, name: '呼图壁县', code: 652323 },
+          { id: 3141, name: '玛纳斯县', code: 652324 },
+          { id: 3142, name: '奇台县', code: 652325 },
+          { id: 3143, name: '吉木萨尔县', code: 652327 },
+          { id: 3144, name: '木垒哈萨克自治县', code: 652328 }
+        ]
+      },
+      {
+        id: 3145,
+        name: '博尔塔拉蒙古自治州',
+        code: 652700,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3146, name: '博乐市', code: 652701 },
+          { id: 3147, name: '阿拉山口市', code: 652702 },
+          { id: 3148, name: '精河县', code: 652722 },
+          { id: 3149, name: '温泉县', code: 652723 }
+        ]
+      },
+      {
+        id: 3150,
+        name: '巴音郭楞蒙古自治州',
+        code: 652800,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3151, name: '库尔勒市', code: 652801 },
+          { id: 3152, name: '轮台县', code: 652822 },
+          { id: 3153, name: '尉犁县', code: 652823 },
+          { id: 3154, name: '若羌县', code: 652824 },
+          { id: 3155, name: '且末县', code: 652825 },
+          { id: 3156, name: '焉耆回族自治县', code: 652826 },
+          { id: 3157, name: '和静县', code: 652827 },
+          { id: 3158, name: '和硕县', code: 652828 },
+          { id: 3159, name: '博湖县', code: 652829 }
+        ]
+      },
+      {
+        id: 3160,
+        name: '阿克苏地区',
+        code: 652900,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3161, name: '阿克苏市', code: 652901 },
+          { id: 3162, name: '温宿县', code: 652922 },
+          { id: 3163, name: '库车县', code: 652923 },
+          { id: 3164, name: '沙雅县', code: 652924 },
+          { id: 3165, name: '新和县', code: 652925 },
+          { id: 3166, name: '拜城县', code: 652926 },
+          { id: 3167, name: '乌什县', code: 652927 },
+          { id: 3168, name: '阿瓦提县', code: 652928 },
+          { id: 3169, name: '柯坪县', code: 652929 }
+        ]
+      },
+      {
+        id: 3170,
+        name: '克孜勒苏柯尔克孜自治州',
+        code: 653000,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3171, name: '阿图什市', code: 653001 },
+          { id: 3172, name: '阿克陶县', code: 653022 },
+          { id: 3173, name: '阿合奇县', code: 653023 },
+          { id: 3174, name: '乌恰县', code: 653024 }
+        ]
+      },
+      {
+        id: 3175,
+        name: '喀什地区',
+        code: 653100,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3176, name: '喀什市', code: 653101 },
+          { id: 3177, name: '疏附县', code: 653121 },
+          { id: 3178, name: '疏勒县', code: 653122 },
+          { id: 3179, name: '英吉沙县', code: 653123 },
+          { id: 3180, name: '泽普县', code: 653124 },
+          { id: 3181, name: '莎车县', code: 653125 },
+          { id: 3182, name: '叶城县', code: 653126 },
+          { id: 3183, name: '麦盖提县', code: 653127 },
+          { id: 3184, name: '岳普湖县', code: 653128 },
+          { id: 3185, name: '伽师县', code: 653129 },
+          { id: 3186, name: '巴楚县', code: 653130 },
+          { id: 3187, name: '塔什库尔干塔吉克自治县', code: 653131 }
+        ]
+      },
+      {
+        id: 3188,
+        name: '和田地区',
+        code: 653200,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3189, name: '和田市', code: 653201 },
+          { id: 3190, name: '和田县', code: 653221 },
+          { id: 3191, name: '墨玉县', code: 653222 },
+          { id: 3192, name: '皮山县', code: 653223 },
+          { id: 3193, name: '洛浦县', code: 653224 },
+          { id: 3194, name: '策勒县', code: 653225 },
+          { id: 3195, name: '于田县', code: 653226 },
+          { id: 3196, name: '民丰县', code: 653227 }
+        ]
+      },
+      {
+        id: 3197,
+        name: '伊犁哈萨克自治州',
+        code: 654000,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3198, name: '伊宁市', code: 654002 },
+          { id: 3199, name: '奎屯市', code: 654003 },
+          { id: 3200, name: '霍尔果斯市', code: 654004 },
+          { id: 3201, name: '伊宁县', code: 654021 },
+          { id: 3202, name: '察布查尔锡伯自治县', code: 654022 },
+          { id: 3203, name: '霍城县', code: 654023 },
+          { id: 3204, name: '巩留县', code: 654024 },
+          { id: 3205, name: '新源县', code: 654025 },
+          { id: 3206, name: '昭苏县', code: 654026 },
+          { id: 3207, name: '特克斯县', code: 654027 },
+          { id: 3208, name: '尼勒克县', code: 654028 }
+        ]
+      },
+      {
+        id: 3209,
+        name: '塔城地区',
+        code: 654200,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3210, name: '塔城市', code: 654201 },
+          { id: 3211, name: '乌苏市', code: 654202 },
+          { id: 3212, name: '额敏县', code: 654221 },
+          { id: 3213, name: '沙湾县', code: 654223 },
+          { id: 3214, name: '托里县', code: 654224 },
+          { id: 3215, name: '裕民县', code: 654225 },
+          { id: 3216, name: '和布克赛尔蒙古自治县', code: 654226 }
+        ]
+      },
+      {
+        id: 3217,
+        name: '阿勒泰地区',
+        code: 654300,
+        parentOrganId: 3108,
+        areas: [
+          { id: 3218, name: '阿勒泰市', code: 654301 },
+          { id: 3219, name: '布尔津县', code: 654321 },
+          { id: 3220, name: '富蕴县', code: 654322 },
+          { id: 3221, name: '福海县', code: 654323 },
+          { id: 3222, name: '哈巴河县', code: 654324 },
+          { id: 3223, name: '青河县', code: 654325 },
+          { id: 3224, name: '吉木乃县', code: 654326 }
+        ]
+      },
+      { id: 3225, name: '铁门关市', code: 659006, parentOrganId: 3108 },
+      { id: 3226, name: '图木舒克市', code: 659003, parentOrganId: 3108 },
+      { id: 3227, name: '五家渠市', code: 659004, parentOrganId: 3108 }
+    ]
+  },
+  {
+    id: 3229,
+    name: '香港特别行政区',
+    code: 810000,
+    parentOrganId: 0,
+    areas: [
+      { id: 3230, name: '中西区', code: 810001, parentOrganId: 3229 },
+      { id: 3231, name: '湾仔区', code: 810002, parentOrganId: 3229 },
+      { id: 3232, name: '东区', code: 810003, parentOrganId: 3229 },
+      { id: 3233, name: '南区', code: 810004, parentOrganId: 3229 },
+      { id: 3234, name: '油尖旺区', code: 810005, parentOrganId: 3229 },
+      { id: 3235, name: '深水埗区', code: 810006, parentOrganId: 3229 },
+      { id: 3236, name: '九龙城区', code: 810007, parentOrganId: 3229 },
+      { id: 3237, name: '黄大仙区', code: 810008, parentOrganId: 3229 },
+      { id: 3238, name: '观塘区', code: 810009, parentOrganId: 3229 },
+      { id: 3239, name: '荃湾区', code: 810010, parentOrganId: 3229 },
+      { id: 3240, name: '屯门区', code: 810011, parentOrganId: 3229 },
+      { id: 3241, name: '元朗区', code: 810012, parentOrganId: 3229 },
+      { id: 3243, name: '北区', code: 810013, parentOrganId: 3229 },
+      { id: 3245, name: '大埔区', code: 810014, parentOrganId: 3229 },
+      { id: 3246, name: '西贡区', code: 810015, parentOrganId: 3229 },
+      { id: 3247, name: '沙田区', code: 810016, parentOrganId: 3229 },
+      { id: 3248, name: '葵青区', code: 810017, parentOrganId: 3229 },
+      { id: 3249, name: '离岛区', code: 810018, parentOrganId: 3229 }
+    ]
+  },
+  {
+    id: 3251,
+    name: '澳门特别行政区',
+    code: 820000,
+    parentOrganId: 0,
+    areas: [
+      { id: 3252, name: '花地玛堂区', code: 820001, parentOrganId: 3251 },
+      { id: 3253, name: '花王堂区', code: 820002, parentOrganId: 3251 },
+      { id: 3254, name: '望德堂区', code: 820003, parentOrganId: 3251 },
+      { id: 3255, name: '大堂区', code: 820004, parentOrganId: 3251 },
+      { id: 3256, name: '风顺堂区', code: 820005, parentOrganId: 3251 },
+      { id: 3257, name: '嘉模堂区', code: 820006, parentOrganId: 3251 },
+      { id: 3258, name: '路凼填海区', code: 820007, parentOrganId: 3251 },
+      { id: 3259, name: '圣方济各堂区', code: 820008, parentOrganId: 3251 }
+    ]
+  }
+]

+ 33 - 0
src/helpers/constant.ts

@@ -0,0 +1,33 @@
+/**
+ * 订单状态
+ */
+export const orderStatus = {
+  WAIT_PAY: '待支付',
+  PAYING: '支付中',
+  PAID: '已付款',
+  TIMEOUT: '已关闭',
+  FAIL: '支付失败',
+  CLOSED: '已关闭',
+  REFUNDING: '退款中',
+  REFUNDED: '已退款'
+} as any;
+
+/**
+ * 学制
+ */
+export const gradeYear = {
+  THREE_YEAR_SYSTEM: '三年制',
+  FORE_YEAR_SYSTEM: '四年制',
+  FIVE_YEAR_SYSTEM: '五年制',
+  SIX_YEAR_SYSTEM: '六年制',
+  NINE_YEAR_SYSTEM: '九年制'
+};
+
+/**
+ * 学校类型
+ */
+export const schoolType = {
+  PRIMARY: '小学',
+  JUNIOR: '初中',
+  PRIMARY_JUNIOR: '小初一体'
+};

+ 7 - 4
src/helpers/request.ts

@@ -4,6 +4,9 @@ import { browser } from '@/helpers/utils';
 import { setLogout, setLoginError, state } from '@/state';
 import { postMessage } from './native-message';
 import { showLoadingToast, showToast, closeToast } from 'vant';
+import { createStorage } from '@/helpers/storage';
+import { ACCESS_TOKEN } from '@/store/mutation-types';
+const storage = createStorage({ prefixKey: '', storage: sessionStorage });
 
 export interface SearchInitParams {
   rows?: string | number;
@@ -33,14 +36,14 @@ request.interceptors.request.use(
     }
 
     initRequest = options.initRequest || false;
-    const Authorization = sessionStorage.getItem('Authorization') || '';
+    const Authorization = storage.get(ACCESS_TOKEN) || '';
     const authHeaders: any = {};
     if (
       Authorization &&
       ![
-        '/api-auth/userlogin',
-        '/api-auth/smsLogin',
-        '/api-auth/open/sendSms'
+        '/edu-oauth/userlogin',
+        '/edu-oauth/smsLogin',
+        '/edu-oauth/open/sendSms'
       ].includes(url)
     ) {
       authHeaders.Authorization = Authorization;

+ 134 - 0
src/helpers/storage.ts

@@ -0,0 +1,134 @@
+// 默认缓存期限为7天
+const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7;
+
+/**
+ * 创建本地缓存对象
+ * @param {string=} prefixKey -
+ * @param {Object} [storage=localStorage] - sessionStorage | localStorage
+ */
+export const createStorage = ({
+  prefixKey = '',
+  storage = localStorage
+} = {}) => {
+  /**
+   * 本地缓存类
+   * @class Storage
+   */
+  const Storage = class {
+    private storage = storage;
+    private prefixKey?: string = prefixKey;
+
+    private getKey(key: string) {
+      return `${this.prefixKey}${key}`.toUpperCase();
+    }
+
+    /**
+     * @description 设置缓存
+     * @param {string} key 缓存键
+     * @param {*} value 缓存值
+     * @param expire
+     */
+    set(key: string, value: any, expire: number | null = DEFAULT_CACHE_TIME) {
+      const stringData = JSON.stringify({
+        value,
+        expire: expire !== null ? new Date().getTime() + expire * 1000 : null
+      });
+      this.storage.setItem(this.getKey(key), stringData);
+    }
+
+    /**
+     * 读取缓存
+     * @param {string} key 缓存键
+     * @param {*=} def 默认值
+     */
+    get(key: string, def: any = null) {
+      const item = this.storage.getItem(this.getKey(key));
+      if (item) {
+        try {
+          const data = JSON.parse(item);
+          const { value, expire } = data;
+          // 在有效期内直接返回
+          if (expire === null || expire >= Date.now()) {
+            return value;
+          }
+          this.remove(key);
+        } catch (e) {
+          return def;
+        }
+      }
+      return def;
+    }
+
+    /**
+     * 从缓存删除某项
+     * @param {string} key
+     */
+    remove(key: string) {
+      this.storage.removeItem(this.getKey(key));
+    }
+
+    /**
+     * 清空所有缓存
+     * @memberOf Cache
+     */
+    clear(): void {
+      this.storage.clear();
+    }
+
+    /**
+     * 设置cookie
+     * @param {string} name cookie 名称
+     * @param {*} value cookie 值
+     * @param {number=} expire 过期时间
+     * 如果过期时间未设置,默认关闭浏览器自动删除
+     * @example
+     */
+    setCookie(
+      name: string,
+      value: any,
+      expire: number | null = DEFAULT_CACHE_TIME
+    ) {
+      document.cookie = `${this.getKey(name)}=${value}; Max-Age=${expire}`;
+    }
+
+    /**
+     * 根据名字获取cookie值
+     * @param name
+     */
+    getCookie(name: string): string {
+      const cookieArr = document.cookie.split('; ');
+      for (let i = 0, length = cookieArr.length; i < length; i++) {
+        const kv = cookieArr[i].split('=');
+        if (kv[0] === this.getKey(name)) {
+          return kv[1];
+        }
+      }
+      return '';
+    }
+
+    /**
+     * 根据名字删除指定的cookie
+     * @param {string} key
+     */
+    removeCookie(key: string) {
+      this.setCookie(key, 1, -1);
+    }
+
+    /**
+     * 清空cookie,使所有cookie失效
+     */
+    clearCookie(): void {
+      const keys = document.cookie.match(/[^ =;]+(?==)/g);
+      if (keys) {
+        for (let i = keys.length; i--; ) {
+          document.cookie = keys[i] + '=0;expire=' + new Date(0).toUTCString();
+        }
+      }
+    }
+  };
+  return new Storage();
+};
+
+export const storage = createStorage();
+
+export default Storage;

+ 60 - 6
src/helpers/utils.ts

@@ -1,3 +1,6 @@
+import numeral from 'numeral';
+import dayjs from 'dayjs';
+
 export const browser = () => {
   const u = navigator.userAgent;
   return {
@@ -23,6 +26,22 @@ export const browser = () => {
   };
 };
 
+// 获取授权的code码
+export const getUrlCode = (name = 'code') => {
+  // 截取url中的code方法
+  const url = location.search;
+  const theRequest: any = new Object();
+  if (url.indexOf('?') != -1) {
+    const str = url.substr(1);
+    const strs = str.split('&');
+    for (let i = 0; i < strs.length; i++) {
+      theRequest[strs[i].split('=')[0]] = strs[i].split('=')[1];
+    }
+  }
+  console.log(theRequest, 'theRequest');
+  return theRequest[name];
+};
+
 export const getRandomKey = () => {
   const key = '' + new Date().getTime() + Math.floor(Math.random() * 1000000);
   return key;
@@ -135,12 +154,47 @@ export const toChinesNum = (num: any) => {
 
 // 秒转分
 export const getSecondRPM = (second: number, type?: string) => {
-  if (isNaN(second)) return '00:00'
-  const mm = Math.floor(second / 60).toString().padStart(2, '0')
-  const dd = Math.floor(second % 60).toString().padStart(2, '0')
+  if (isNaN(second)) return '00:00';
+  const mm = Math.floor(second / 60)
+    .toString()
+    .padStart(2, '0');
+  const dd = Math.floor(second % 60)
+    .toString()
+    .padStart(2, '0');
   if (type === 'cn') {
-    return mm + '分' + dd + '秒'
+    return mm + '分' + dd + '秒';
   } else {
-    return mm + ':' + dd
+    return mm + ':' + dd;
   }
-}
+};
+
+export const getWeekCh = (week: number, type = 0) => {
+  const template = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
+  const template2 = [
+    '星期天',
+    '星期一',
+    '星期二',
+    '星期三',
+    '星期四',
+    '星期五',
+    '星期六'
+  ];
+  return type ? template2[week] : template[week];
+};
+
+export const numberFormat = (num: number, type?: string) => {
+  if (type === 'percent') {
+    return numeral(num).format('0.0%');
+  }
+  return numeral(num).format('0,0');
+};
+
+export const moneyFormat = (value: number, format = '0,0.00') => {
+  return numeral(value).format(format);
+};
+export const dateFormat = (
+  value: string | Date,
+  format = 'YYYY-MM-DD HH:mm:ss'
+) => {
+  return dayjs(value).format(format);
+};

+ 4 - 0
src/main.ts

@@ -10,6 +10,7 @@ import './styles/index.less';
 import { promisefiyPostMessage, postMessage } from './helpers/native-message';
 import { state } from './state';
 import { setAuth } from './helpers/utils';
+import { setupStore } from './store';
 
 // 获取token
 promisefiyPostMessage({ api: 'getToken' }).then((res: any) => {
@@ -36,6 +37,9 @@ postMessage({ api: 'getNavHeight' }, (res: any) => {
 
 const app = createApp(App);
 
+// store plugin: pinia
+setupStore(app);
+
 dayjs.locale('zh-ch');
 
 app.use(router);

+ 85 - 1
src/router/router-root.ts

@@ -15,13 +15,97 @@ export default [
     }
   },
   {
+    path: '/student-register',
+    component: () => import('@/views/student-register/index'),
+    meta: {
+      title: '学生注册'
+    }
+  },
+  {
+    path: '/student-digital-tools',
+    component: () => import('@/views/student-register/digital-tools/index'),
+    meta: {
+      title: '数字化乐器学练工具'
+    }
+  },
+  {
+    path: '/goods-list',
+    component: () => import('@/views/student-register/shop-mall/goods-list'),
+    meta: {
+      title: '商品列表'
+    }
+  },
+  {
+    path: '/goodsDetail',
+    component: () =>
+      import('@/views/student-register/shop-mall/goods-detail/index'),
+    meta: {
+      title: '商品列表'
+    }
+  },
+  {
+    path: '/order-detail',
+    component: () => import('@/views/student-register/order-detail'),
+    meta: {
+      title: '订单详情'
+    }
+  },
+  {
     path: '/knowledge-library',
     component: () => import('@/views/knowledge-library/index'),
     meta: {
       title: '知识库'
     }
   },
-
+  {
+    path: '/payment-result',
+    name: 'payment-result',
+    component: () => import('@/views/payment-result/index'),
+    meta: {
+      title: '支付详情'
+    }
+  },
+  {
+    path: '/shopAddress',
+    name: 'shopAddress',
+    component: () => import('@/views/student-register/shop-address/index'),
+    meta: {
+      title: '支付详情'
+    }
+  },
+  {
+    path: '/addressOperation',
+    name: 'addressOperation',
+    component: () =>
+      import('@/views/student-register/shop-address/address-operation'),
+    meta: {
+      title: '收货地址'
+    }
+  },
+  {
+    path: '/payCenter',
+    name: 'payCenter',
+    component: () => import('@/views/adapay/pay-center'),
+    meta: {
+      title: '支付'
+    }
+  },
+  {
+    path: '/payDefine',
+    name: 'payDefine',
+    component: () => import('@/views/adapay/pay-define'),
+    meta: {
+      title: '支付'
+    }
+  },
+  {
+    path: '/payResult',
+    name: 'payResult',
+    component: () => import('@/views/adapay/pay-result'),
+    meta: {
+      title: '支付'
+    }
+  },
   {
     path: '/:pathMatch(.*)*',
     component: () => import('@/views/404'),

+ 2 - 0
src/shims-vue.d.ts

@@ -4,3 +4,5 @@ declare module '*.vue' {
   export default component;
 }
 declare module 'vudio.js';
+
+declare module 'numeral';

+ 37 - 0
src/state.ts

@@ -54,3 +54,40 @@ export const openDefaultWebView = (url?: string, callBack?: any) => {
     callBack && callBack();
   }
 };
+
+/**
+ * @description 微信授权-会根据环境去判断
+ * @param wxAppId
+ * @param urlString 回调链接【默认当前页面地址】
+ * @returns void
+ */
+export const goWechatAuth = (wxAppId: string, urlString?: string) => {
+  // 开发环境
+  if (import.meta.env.DEV) {
+    const replaceUrl =
+      `https://online.lexiaoya.cn/getWxCode?appid=${
+        wxAppId || 'wx8654c671631cfade'
+      }&state=STATE&redirect_uri=` +
+      encodeURIComponent(urlString || window.location.href);
+    window.location.replace(replaceUrl);
+  }
+
+  // 生产环境
+  if (import.meta.env.PROD) {
+    goAuth(wxAppId, urlString);
+  }
+};
+
+const goAuth = (wxAppId: string, urlString?: string) => {
+  // 用户授权
+  console.log(
+    urlString || window.location.href,
+    'urlString || window.location.href'
+  );
+  const urlNow = encodeURIComponent(urlString || window.location.href);
+  console.log(urlNow, 'urlNow');
+  const scope = 'snsapi_base'; //snsapi_userinfo   //静默授权 用户无感知
+  const appid = wxAppId || 'wx8654c671631cfade';
+  const url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${urlNow}&response_type=code&scope=${scope}&state=STATE&connect_redirect=1#wechat_redirect`;
+  window.location.replace(url);
+};

+ 10 - 0
src/store/index.ts

@@ -0,0 +1,10 @@
+import type { App } from 'vue';
+import { createPinia } from 'pinia';
+
+const store = createPinia();
+
+export function setupStore(app: App<Element>) {
+  app.use(store);
+}
+
+export { store };

+ 89 - 0
src/store/modules/student-register-store.ts

@@ -0,0 +1,89 @@
+import { defineStore } from 'pinia';
+import { createStorage } from '@/helpers/storage';
+import { ACCESS_TOKEN } from '../mutation-types';
+const storage = createStorage({ prefixKey: '', storage: sessionStorage });
+
+export interface IUserState {
+  token: string;
+  selectGoods: any[];
+  selectVip: any[];
+}
+
+export const useStudentRegisterStore = defineStore('student-register-store', {
+  state: (): IUserState => ({
+    token: storage.get(ACCESS_TOKEN, ''),
+    selectGoods: [] as any,
+    selectVip: [] as any
+  }),
+  getters: {
+    getToken(): string {
+      return this.token;
+    },
+    getGoods(): any[] {
+      return this.selectGoods;
+    },
+    getVip(): any {
+      return this.selectVip;
+    }
+  },
+  actions: {
+    /**
+     * 设置token
+     * @param token
+     */
+    setToken(token: string) {
+      this.token = token;
+      storage.set(ACCESS_TOKEN, token);
+    },
+    /**
+     * 设置选择的商品
+     * @param goods 商品
+     */
+    setGoods(goods: any) {
+      this.selectGoods.push(goods);
+    },
+    /**
+     * 删除商品
+     * @param goodsId 商品编号
+     */
+    deleteGoods(goodsId: string | number): void {
+      const index = this.selectGoods.findIndex(
+        (goods: any) => goods.goodsId === goodsId
+      );
+      this.selectGoods.splice(index, 1);
+    },
+    /**
+     * 设置选中的AI学练工具
+     * @param vip 小酷商品
+     */
+    setVip(vip: any) {
+      this.selectVip = vip;
+    },
+    /**
+     * 删除选中AI学练工具
+     * @param goodsId 商品编号
+     */
+    deleteVip(goodsId: string | number): void {
+      const index = this.selectVip.findIndex(
+        (goods: any) => goods.goodsId === goodsId
+      );
+      this.selectVip.splice(index, 1);
+    },
+    /**
+     * 判断vip是否选中
+     * @param goodsId 商品编号
+     * @returns boolean
+     */
+    selectedVip(goodsId: string | number): Boolean {
+      const index = this.selectVip.findIndex(
+        (goods: any) => goods.goodsId === goodsId
+      );
+      return index >= 0 ? true : false;
+    }
+  }
+});
+
+// Need to be used outside the setup
+// export function useUserStoreWidthOut() {
+//   return useUserStore(store);
+// }

+ 4 - 0
src/store/mutation-types.ts

@@ -0,0 +1,4 @@
+export const ACCESS_TOKEN = 'ACCESS-TOKEN'; // 用户token
+export const IM_TOKEN = 'IM-TOKEN'; //
+export const CURRENT_USER = 'CURRENT-USER'; // 当前用户信息
+export const TABS_ROUTES = 'TABS-ROUTES'; // 标签页

+ 69 - 1
src/styles/index.less

@@ -112,6 +112,44 @@ body {
   padding-bottom: calc(20px + env(safe-area-inset-bottom));
 }
 
+// 搜索公用样式
+.popupBottomSearch {
+  --van-picker-toolbar-height: 44px !important;
+
+  .van-picker__toolbar {
+    position: relative;
+
+    &::after {
+      position: absolute;
+      box-sizing: border-box;
+      content: ' ';
+      pointer-events: none;
+      right: var(--van-padding-md);
+      bottom: 0;
+      left: var(--van-padding-md);
+      border-bottom: 1px solid var(--van-cell-border-color);
+      transform: scaleY(0.5);
+    }
+  }
+
+  .van-picker__columns {
+    padding: 0 24px;
+  }
+
+  .van-picker-column {
+    position: relative;
+    z-index: 1;
+  }
+
+  .van-picker__frame {
+    z-index: 0;
+
+    &::after {
+      background: #f2f2f2;
+      border-radius: 8px;
+    }
+  }
+}
 
 .btnGroupPopup {
   display: flex;
@@ -166,4 +204,34 @@ body {
 .van-scale-enter-active,
 .van-scale-leave-active {
   transition: all 0.25s;
-}
+}
+
+.mb12 {
+  margin-bottom: 12px !important;
+}
+
+.btnGroup {
+  padding: 0 25px;
+  padding-bottom: calc(20px + env(safe-area-inset-bottom));
+
+  .van-button {
+    font-size: 18px !important;
+    font-weight: 500;
+  }
+}
+
+.btnMore {
+  padding-left: 13px;
+  padding-right: 13px;
+  display: flex !important;
+  justify-content: center !important;
+
+  // :global {
+  .van-button {
+    width: 100% !important;
+  }
+
+  .van-button+.van-button {
+    margin-left: 15px;
+  }
+}

+ 18 - 0
src/views/adapay/pay-center/index.module.less

@@ -0,0 +1,18 @@
+.payCenter {
+  min-height: 100vh;
+  overflow: hidden;
+}
+.error-icon {
+  display: block;
+  color: #ffb07b;
+  font-size: 30px;
+  margin-bottom: 30px;
+  font-weight: bold;
+}
+.error-text {
+  font-size: 15px;
+  width: 100%;
+  text-align: center;
+  color: #3f3f3f;
+  margin-top: 100px;
+}

+ 94 - 0
src/views/adapay/pay-center/index.tsx

@@ -0,0 +1,94 @@
+import { browser, getUrlCode } from '@/helpers/utils'
+import { goWechatAuth } from '@/state'
+import { Icon } from 'vant'
+import { defineComponent, onMounted, reactive } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import styles from './index.module.less'
+
+export default defineComponent({
+  name: 'pay-center',
+  setup() {
+    const router = useRouter()
+    const route = useRoute()
+    const state = reactive({
+      errorText: '',
+      code: null as any,
+      pay_channel: route.query.pay_channel as any,
+      wxAppId: route.query.wxAppId as any,
+      body: route.query.body as any,
+      price: route.query.price as any,
+      orderNo: route.query.orderNo as any,
+      userId: route.query.userId as any
+    })
+
+    const init = () => {
+      const pay_channel = state.pay_channel
+      if (browser().weixin) {
+        if (pay_channel === 'wx_pub') {
+          //授权
+          const code = getUrlCode()
+          console.log(code)
+          if (code) {
+            state.code = code // 赋值code码
+            onPayPage() // 跳转支付页
+          } else {
+            // goAuth()
+            goWechatAuth(state.wxAppId)
+          }
+          document.title = '微信支付'
+        } else if (pay_channel == 'alipay_qr') {
+          state.errorText = '请使用支付宝扫码'
+        }
+      } else if (browser().alipay) {
+        if (pay_channel === 'wx_pub') {
+          state.errorText = '请使用微信扫码'
+        } else if (pay_channel == 'alipay_qr') {
+          // 支付宝支付
+          document.title = '支付宝支付'
+          onPayPage() // 跳转支付页
+        }
+      } else {
+        state.errorText = '请在微信或支付宝客户端打开'
+      }
+      state.errorText && (document.title = 'ERROR')
+    }
+
+    const onPayPage = () => {
+      // 跳转对应支付页
+      router.replace({
+        path: '/payDefine',
+        query: {
+          pay_channel: state.pay_channel,
+          wxAppId: state.wxAppId,
+          body: state.body,
+          price: state.price,
+          code: state.code,
+          orderNo: state.orderNo,
+          userId: state.userId
+        }
+      })
+    }
+    // const goAuth = () => {
+    //   // 用户授权
+    //   const urlNow = encodeURIComponent(window.location.href)
+    //   const scope = 'snsapi_base' //snsapi_userinfo   //静默授权 用户无感知
+    //   const appid = state.wxAppId || 'wx8654c671631cfade'
+    //   const url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${urlNow}&response_type=code&scope=${scope}&state=STATE&connect_redirect=1#wechat_redirect`
+    //   window.location.replace(url)
+    // }
+
+    onMounted(() => {
+      init()
+    })
+
+    return () => (
+      <div class={styles.payCenter}>
+        <div class={styles['error-text']}>
+          {state.errorText && <Icon class={styles['error-icon']} name="warning-o" />}
+
+          {state.errorText}
+        </div>
+      </div>
+    )
+  }
+})

+ 44 - 0
src/views/adapay/pay-define/index.module.less

@@ -0,0 +1,44 @@
+.paydefine {
+  overflow: hidden;
+  background: #fff;
+  min-height: 100vh;
+
+  :global {
+    .van-cell__title,
+    .van-cell__value {
+      // flex: auto;
+      font-size: 15px;
+      color: #4f4f4f;
+    }
+    .van-button {
+      font-size: 16px;
+      width: 86%;
+      margin: 20px auto;
+    }
+  }
+}
+.amount {
+  padding: 35px 0 55px;
+  font-size: 41px;
+  font-weight: bold;
+  color: #333333;
+  line-height: 36px;
+  text-align: center;
+  span {
+    font-size: 31px;
+  }
+}
+.error-text {
+  font-size: 15px;
+  width: 100%;
+  text-align: center;
+  color: #3f3f3f;
+  margin-top: 100px;
+}
+
+.error-icon {
+  display: block;
+  color: #ffb07b;
+  font-size: 16px;
+  margin-bottom: 20px;
+}

+ 231 - 0
src/views/adapay/pay-define/index.tsx

@@ -0,0 +1,231 @@
+import request from '@/helpers/request';
+import { browser, getUrlCode, moneyFormat } from '@/helpers/utils';
+import { goWechatAuth } from '@/state';
+import numeral from 'numeral';
+import { Button, Cell, CellGroup, Icon, showToast } from 'vant';
+import { defineComponent, onMounted, reactive } from 'vue';
+import { useRoute } from 'vue-router';
+import styles from './index.module.less';
+
+export default defineComponent({
+  name: 'pay-define',
+  setup() {
+    const route = useRoute();
+    const state = reactive({
+      browserStatus: false,
+      errorText: '',
+      code: null as any,
+      pay_channel: route.query.pay_channel as any,
+      wxAppId: route.query.wxAppId as any,
+      body: route.query.body as any,
+      price: route.query.price as any,
+      orderNo: route.query.orderNo as any,
+      userId: route.query.userId as any,
+      payInfo: {} as any
+    });
+
+    const getPayment = async () => {
+      try {
+        if (parseFloat(state.price) <= 0) {
+          showToast('支付金额异常');
+          return;
+        }
+        const payMap: any = {
+          merOrderNo: state.orderNo,
+          paymentChannel: state.pay_channel, // 支付渠道
+          userId: state.userId
+        };
+        //     // 判断是否是微信公众号支付
+        if (state.pay_channel == 'wx_pub') {
+          payMap.code = state.code;
+        }
+        console.log(payMap, 'payMap');
+        const { data } = await request.post(
+          '/edu-app/open/userOrder/executePayment',
+          {
+            hideLoading: false,
+            data: {
+              ...payMap
+            }
+          }
+        );
+
+        console.log(data, 'payment');
+        scanCodePay(data.reqParams);
+      } catch (e) {
+        //
+        console.log(e);
+      }
+    };
+
+    const scanCodePay = (data: any) => {
+      // 判断支付方式 如果是 test 模式 支付用测试url 否则用生产url
+      if (state.pay_channel == 'alipay_qr') {
+        const url =
+          data.prod_mode === 'false'
+            ? data.expend.qrcode_url +
+              '?payment_id=' +
+              data.id +
+              '&pay_channel=' +
+              data.pay_channel
+            : data.expend.qrcode_url;
+        window.location.href = url;
+      } else if (state.pay_channel == 'wx_pub') {
+        const tempPayInfo = JSON.parse(data.expend.pay_info);
+        state.payInfo = tempPayInfo;
+        if (typeof (window as any).WeixinJSBridge == 'undefined') {
+          if (document.addEventListener) {
+            document.addEventListener(
+              'WeixinJSBridgeReady',
+              onBridgeReady,
+              false
+            );
+          } else if ((document as any).attachEvent) {
+            (document as any)
+              .attachEvent(
+                'WeixinJSBridgeReady',
+                onBridgeReady
+              )(document as any)
+              .attachEvent('onWeixinJSBridgeReady', onBridgeReady);
+          }
+        } else {
+          onBridgeReady();
+        }
+      }
+    };
+
+    const onBridgeReady = () => {
+      const payInfo = state.payInfo;
+      // let orderNo = state.orderNo
+      (window as any).WeixinJSBridge.invoke(
+        'getBrandWCPayRequest',
+        {
+          appId: payInfo.appId, //公众号名称,由商户传入
+          timeStamp: payInfo.timeStamp, //时间戳,自1970年以来的秒数
+          nonceStr: payInfo.nonceStr, //随机串
+          package: payInfo.package,
+          signType: payInfo.signType, //微信签名方式:
+          paySign: payInfo.paySign //微信签名
+        },
+        (res: any) => {
+          // if(res.err_msg == "get_brand_wcpay_request:ok" ){
+          // 使用以上方式判断前端返回,微信团队郑重提示:
+          //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
+          // } else
+          if (
+            res.err_msg == 'get_brand_wcpay_request:cancel' ||
+            res.err_msg == 'get_brand_wcpay_request:fail'
+          ) {
+            window.location.replace(
+              location.origin +
+                '/orchestra-student/#/payment-result?orderNo=' +
+                state.orderNo
+            );
+          } else {
+            // 使用以上方式判断前端返回,微信团队郑重提示:
+            //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
+            // alert('支付成功')
+            window.location.replace(
+              location.origin +
+                '/orchestra-student/#/payment-result?orderNo=' +
+                state.orderNo
+            );
+          }
+        }
+      );
+    };
+
+    // const goAuth = () => {
+    //   // 用户授权
+    //   const urlNow = encodeURIComponent(window.location.href)
+    //   const scope = 'snsapi_base' //snsapi_userinfo   //静默授权 用户无感知
+    //   const appid = state.wxAppId || 'wx8654c671631cfade'
+    //   const url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${urlNow}&response_type=code&scope=${scope}&state=STATE&connect_redirect=1#wechat_redirect`
+    //   window.location.replace(url)
+    // }
+
+    const init = () => {
+      const pay_channel = state.pay_channel;
+      if (browser().weixin) {
+        if (pay_channel === 'wx_pub') {
+          //授权
+          const code = getUrlCode();
+          console.log(code);
+          if (code) {
+            state.code = code; // 赋值code码
+          } else {
+            // goAuth()
+            goWechatAuth(state.wxAppId);
+          }
+          state.browserStatus = true;
+          document.title = '微信支付';
+        } else if (pay_channel == 'alipay_qr') {
+          state.errorText = '请使用支付宝扫码';
+        }
+      } else if (browser().alipay) {
+        if (pay_channel === 'wx_pub') {
+          state.errorText = '请使用微信扫码';
+        } else if (pay_channel == 'alipay_qr') {
+          // 支付宝支付
+          state.browserStatus = true;
+          document.title = '支付宝支付';
+        }
+      } else {
+        state.errorText = '请在微信或支付宝客户端打开';
+      }
+      state.errorText && (document.title = 'ERROR');
+    };
+
+    onMounted(() => {
+      console.log(state);
+      init();
+    });
+    return () => (
+      <div class={styles.paydefine}>
+        {state.browserStatus && (
+          <div class={styles.container}>
+            <div class={styles.amount}>
+              <span>¥ </span>
+              {moneyFormat(state.price)}
+            </div>
+            <CellGroup inset>
+              <Cell
+                title="订单信息"
+                value={state.body}
+                valueClass={styles.values}></Cell>
+              <Cell
+                title="支付方式"
+                value={
+                  state.pay_channel === 'wx_pub' ? '微信' : '支付宝'
+                }></Cell>
+              <Cell
+                title="实付金额"
+                value={`¥ ${moneyFormat(state.price)}元`}></Cell>
+            </CellGroup>
+
+            <Button
+              type="primary"
+              block
+              size="large"
+              onClick={getPayment}
+              round>
+              立即支付
+            </Button>
+          </div>
+        )}
+
+        {!state.browserStatus && (
+          <div class={styles.container}>
+            <div class={styles['error-text']}>
+              {state.errorText && (
+                <Icon class={styles['error-icon']} name="warning-o" />
+              )}
+
+              {state.errorText}
+            </div>
+          </div>
+        )}
+      </div>
+    );
+  }
+});

+ 55 - 0
src/views/adapay/pay-result/index.module.less

@@ -0,0 +1,55 @@
+.paywxresult {
+  overflow: hidden;
+  // background: #fff;
+  min-height: 100vh;
+
+  :gloabl {
+    .van-cell {
+      padding: 12px 16px;
+    }
+    .van-cell__title,
+    .van-cell__value {
+      flex: auto;
+      font-size: 16px;
+      color: #4f4f4f;
+    }
+    .van-button {
+      font-size: 16px;
+      width: 86%;
+      margin: 20px auto;
+    }
+    .van-loading__spinner {
+      width: 50px;
+      height: 50px;
+    }
+  }
+}
+.container {
+  background: #fff;
+  padding: 15px 0;
+}
+
+.order-loading {
+  padding: 15px 0;
+  margin-top: 15px;
+  background-color: #ffffff;
+  text-align: center;
+  font-size: 15px;
+  & > p {
+    margin-bottom: 15px;
+  }
+}
+.error-text {
+  font-size: 15px;
+  width: 100%;
+  text-align: center;
+  color: #3f3f3f;
+  margin-top: 100px;
+}
+
+.error-icon {
+  display: block;
+  color: #ffb07b;
+  font-size: 22px;
+  margin-bottom: 20px;
+}

+ 237 - 0
src/views/adapay/pay-result/index.tsx

@@ -0,0 +1,237 @@
+import request from '@/helpers/request';
+import { browser, getUrlCode, moneyFormat } from '@/helpers/utils';
+import { goWechatAuth } from '@/state';
+import {
+  Cell,
+  CellGroup,
+  Icon,
+  Loading,
+  showConfirmDialog,
+  showToast
+} from 'vant';
+import { defineComponent, onMounted, reactive } from 'vue';
+import { useRouter, useRoute } from 'vue-router';
+import styles from './index.module.less';
+
+export default defineComponent({
+  name: 'pay-result',
+  setup() {
+    const router = useRouter();
+    const route = useRoute();
+    const state = reactive({
+      errorText: '',
+      browserStatus: false,
+      code: null as any,
+      pay_channel: route.query.pay_channel as any,
+      wxAppId: route.query.wxAppId as any,
+      body: route.query.body as any,
+      price: route.query.price as any,
+      orderNo: route.query.orderNo as any,
+      userId: route.query.userId as any,
+      payInfo: {} as any
+    });
+
+    console.log(state.errorText);
+
+    const init = () => {
+      const query = route.query;
+      console.log(query);
+      // 判断是否有支付对象
+      if (!query.orderNo || !query.pay_channel) {
+        showConfirmDialog({
+          message: '支付订单信息错误请重新支付',
+          showCancelButton: false
+        }).then(() => {
+          router.back();
+        });
+      } else {
+        // 判断当前浏览器
+        if (browser().weixin) {
+          state.browserStatus = true;
+          getWxPay();
+        } else if (browser().alipay) {
+          state.browserStatus = true;
+          getPayment();
+        } else {
+          state.errorText = '请在微信或支付宝客户端打开';
+          document.title = 'ERROR';
+        }
+      }
+    };
+
+    const getPayment = async () => {
+      try {
+        if (parseFloat(state.price) <= 0) {
+          showToast('支付金额异常');
+          return;
+        }
+        const payMap: any = {
+          merOrderNo: state.orderNo,
+          paymentChannel: state.pay_channel, // 支付渠道
+          userId: state.userId
+        };
+        //     // 判断是否是微信公众号支付
+        if (state.pay_channel == 'wx_pub') {
+          payMap.code = state.code;
+        }
+
+        const { data } = await request.post(
+          '/edu-app/open/userOrder/executePayment',
+          {
+            data: {
+              ...payMap
+            }
+          }
+        );
+
+        scanCodePay(data.reqParams);
+      } catch (e) {
+        //
+        console.log(e);
+        // 接口报错也跳转到支付回调页
+        window.location.replace(
+          location.origin +
+            '/classroom-app/#/payment-result?orderNo=' +
+            state.orderNo
+        );
+      }
+    };
+
+    const scanCodePay = (data: any) => {
+      // 判断支付方式 如果是 test 模式 支付用测试url 否则用生产url
+      if (state.pay_channel == 'alipay_qr') {
+        const url =
+          data.prod_mode === 'false'
+            ? data?.expend?.qrcode_url +
+              '?payment_id=' +
+              data.id +
+              '&pay_channel=' +
+              data.pay_channel
+            : data?.expend?.qrcode_url;
+        window.location.href = url;
+      } else if (state.pay_channel == 'alipay_wap') {
+        window.location.href = data?.expend?.pay_info;
+      } else if (state.pay_channel == 'wx_pub') {
+        const tempPayInfo = data?.expend
+          ? JSON.parse(data?.expend?.pay_info)
+          : data;
+        state.payInfo = tempPayInfo;
+        if (typeof (window as any).WeixinJSBridge == 'undefined') {
+          if (document.addEventListener) {
+            document.addEventListener(
+              'WeixinJSBridgeReady',
+              onBridgeReady,
+              false
+            );
+          } else if ((document as any).attachEvent) {
+            (document as any)
+              .attachEvent(
+                'WeixinJSBridgeReady',
+                onBridgeReady
+              )(document as any)
+              .attachEvent('onWeixinJSBridgeReady', onBridgeReady);
+          }
+        } else {
+          onBridgeReady();
+        }
+      }
+    };
+
+    const onBridgeReady = () => {
+      const payInfo = state.payInfo;
+      // let orderNo = state.orderNo
+      (window as any).WeixinJSBridge.invoke(
+        'getBrandWCPayRequest',
+        {
+          appId: payInfo.appId, //公众号名称,由商户传入
+          timeStamp: payInfo.timeStamp, //时间戳,自1970年以来的秒数
+          nonceStr: payInfo.nonceStr, //随机串
+          package: payInfo.package || payInfo.packageValue,
+          signType: payInfo.signType, //微信签名方式:
+          paySign: payInfo.paySign //微信签名
+        },
+        (res: any) => {
+          // if(res.err_msg == "get_brand_wcpay_request:ok" ){
+          // 使用以上方式判断前端返回,微信团队郑重提示:
+          //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
+          // } else
+          if (
+            res.err_msg == 'get_brand_wcpay_request:cancel' ||
+            res.err_msg == 'get_brand_wcpay_request:fail'
+          ) {
+            window.location.replace(
+              location.origin +
+                '/orchestra-student/#/payment-result?orderNo=' +
+                state.orderNo
+            );
+          } else {
+            // 使用以上方式判断前端返回,微信团队郑重提示:
+            //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
+            // alert('支付成功')
+            window.location.replace(
+              location.origin +
+                '/orchestra-student/#/payment-result?orderNo=' +
+                state.orderNo
+            );
+          }
+        }
+      );
+    };
+
+    const getWxPay = () => {
+      // 微信公众号支付
+      //授权
+      const code = getUrlCode();
+      if (!code) {
+        // goAuth()
+        goWechatAuth(state.wxAppId);
+      } else {
+        state.code = code;
+        getPayment();
+      }
+    };
+    // const goAuth = () => {
+    //   // 用户授权
+    //   const urlNow = encodeURIComponent(window.location.href)
+    //   const scope = 'snsapi_base' //snsapi_userinfo   //静默授权 用户无感知
+    //   const appid = state.wxAppId || 'wx8654c671631cfade'
+    //   const url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${urlNow}&response_type=code&scope=${scope}&state=STATE&connect_redirect=1#wechat_redirect`
+    //   window.location.replace(url)
+    // }
+
+    onMounted(() => {
+      init();
+    });
+
+    return () => (
+      <div class={styles.paywxresult}>
+        {state.browserStatus && (
+          <>
+            <div class={styles.container}>
+              <CellGroup border={false}>
+                <Cell
+                  title={'订单金额'}
+                  value={'¥ ' + moneyFormat(state.price)}></Cell>
+                <Cell title={'订单信息'} value={state.body}></Cell>
+              </CellGroup>
+            </div>
+
+            <div class={styles['order-loading']}>
+              <p>{state.pay_channel == 'wx_pub' ? '微信支付' : '支付宝支付'}</p>
+              <Loading type="spinner" color="#01C1B5" />
+            </div>
+          </>
+        )}
+
+        {!state.browserStatus && (
+          <div class={styles['error-text']}>
+            {state.errorText && (
+              <Icon class={styles['error-icon']} name="warning-o" />
+            )}
+            {state.errorText}
+          </div>
+        )}
+      </div>
+    );
+  }
+});

+ 93 - 0
src/views/adapay/payment/index.module.less

@@ -0,0 +1,93 @@
+.payment {
+  :global {
+    .van-cell__title {
+      font-size: 16px;
+      padding-left: 10px;
+    }
+    .van-icon-cross {
+      position: absolute;
+      z-index: 1;
+      top: 13px;
+      left: 13px;
+      color: #ccc;
+      cursor: pointer;
+    }
+
+    // .van-checkbox__icon,
+    // .van-radio__icon {
+    //   height: 22px;
+    //   .van-icon {
+    //     border: 0;
+    //   }
+    // }
+    // .van-checkbox__icon--checked .van-icon,
+    // .van-radio__icon--checked .van-icon {
+    //   background: transparent;
+    //   border: transparent;
+    // }
+  }
+
+  // .van-popup__close-icon {
+  //   color: #cccccc;
+  //   font-size: 22px;
+  // }
+  // .van-popup--bottom.van-popup--round {
+  //   border-radius: 6px 6px 0 0;
+  // }
+  // .van-hairline--bottom::after {
+  //   border-bottom-color: #f0f0f0;
+  // }
+  .title {
+    background-color: #ffffff;
+    font-size: 16px;
+    font-weight: 400;
+    color: #1a1a1a;
+    padding: 14px 0 12px;
+    text-align: center;
+  }
+  .payAmount {
+    background-color: #ffffff;
+    padding: 20px 0;
+    text-align: center;
+    p {
+      font-size: 14px;
+      color: #666666;
+      padding-bottom: 10px;
+    }
+    .amount {
+      font-size: 28px;
+      color: #000000;
+      span {
+        font-size: 18px;
+        // padding-right: 3px;
+      }
+    }
+  }
+
+  .blank {
+    height: 65px;
+    // background-color: #f6f8f9;
+  }
+
+  .payTypeRe {
+    display: flex;
+    align-items: center;
+  }
+  .recommend {
+    margin-left: 5px;
+    background: linear-gradient(122deg, #ffa371 0%, #ff6b3b 100%);
+    border-radius: 10px;
+    font-size: 12px;
+    color: #ffffff;
+    line-height: 16px;
+    padding: 0 5px;
+  }
+
+  .payBtn {
+    width: 90% !important;
+    margin: 0 auto;
+    font-size: 16px;
+    font-weight: 600;
+    margin-bottom: 20px;
+  }
+}

+ 145 - 0
src/views/adapay/payment/index.tsx

@@ -0,0 +1,145 @@
+import {
+  Button,
+  Cell,
+  CellGroup,
+  Icon,
+  RadioGroup,
+  Radio,
+  showConfirmDialog
+} from 'vant';
+import { defineComponent, reactive } from 'vue';
+import styles from './index.module.less';
+import { browser, moneyFormat } from '@/helpers/utils';
+
+export default defineComponent({
+  name: 'payment',
+  props: {
+    paymentConfig: {
+      type: Object,
+      default: {}
+    }
+  },
+  emits: ['backOut', 'close', 'confirm'],
+  setup(props, { slots, attrs, emit }) {
+    const state = reactive({
+      payType: 'wx',
+      pay_channel: ''
+    });
+    const onClose = () => {
+      // 继续支付则直接关闭弹窗就可
+      showConfirmDialog({
+        message: '是否放弃本次付款',
+        confirmButtonText: '继续付款',
+        cancelButtonText: '放弃',
+        showCancelButton: true
+      }).catch(async () => {
+        await onCancel();
+        emit('backOut');
+        emit('close');
+      });
+    };
+
+    // 需要关闭订单
+    const onCancel = async (noBack?: boolean) => {};
+    const onSubmit = async () => {
+      // 支付...
+      const pt = state.payType;
+      // 判断当前浏览器
+      if (browser().weixin) {
+        // 微信浏览器
+        if (pt == 'zfb') {
+          state.pay_channel = 'alipay_qr';
+          getCodePay('qrCode');
+        } else if (pt == 'wx') {
+          state.pay_channel = 'wx_pub';
+          getCodePay('pay');
+        }
+      } else if (browser().alipay) {
+        // 支付宝浏览器
+        if (pt == 'zfb') {
+          state.pay_channel = 'alipay_wap';
+          // 支付宝 H5 支付
+          getCodePay('pay');
+        } else if (pt == 'wx') {
+          state.pay_channel = 'wx_pub';
+          getCodePay('qrCode');
+        }
+      } else {
+        if (pt == 'zfb') {
+          state.pay_channel = 'alipay_qr';
+        } else if (pt == 'wx') {
+          state.pay_channel = 'wx_pub';
+        }
+        getCodePay('qrCode');
+      }
+    };
+
+    const getCodePay = (code: any) => {
+      // 二维码页面, 唤起支付页面
+      const payCode = code == 'qrCode' ? 'payCenter' : 'payResult';
+      emit('confirm', {
+        payCode,
+        pay_channel: state.pay_channel
+      });
+    };
+    return () => (
+      <div class={styles.payment}>
+        <Icon onClick={onClose} name="cross" size={20} />
+        <div class={[styles.title]}>选择支付方式</div>
+
+        <div class={styles.payAmount}>
+          <p>应付金额</p>
+          <div class={styles.amount}>
+            <span>¥ </span>
+            {moneyFormat(props.paymentConfig.currentPrice)}
+          </div>
+        </div>
+        <RadioGroup v-model={state.payType}>
+          <CellGroup border={false}>
+            <Cell
+              border={true}
+              center
+              onClick={() => {
+                // wx_lite
+                state.payType = 'wx';
+              }}
+              v-slots={{
+                icon: () => (
+                  <Icon name="wechat-pay" color="#15c434" size={22} />
+                ),
+                'right-icon': () => <Radio name="wx" />,
+                title: () => (
+                  <div class={styles.payTypeRe}>
+                    微信支付 <span class={styles.recommend}>推荐</span>
+                  </div>
+                )
+              }}></Cell>
+            <Cell
+              title="支付宝支付"
+              border={true}
+              // class="van-hairline--bottom"
+              center
+              onClick={() => {
+                // alipay
+                state.payType = 'zfb';
+              }}
+              v-slots={{
+                icon: () => <Icon name="alipay" color="#009fe9" size={22} />,
+                'right-icon': () => <Radio name="zfb" />
+              }}></Cell>
+          </CellGroup>
+        </RadioGroup>
+
+        <div class={styles.blank}></div>
+        <Button
+          type="primary"
+          class={styles.payBtn}
+          block
+          round
+          onClick={onSubmit}>
+          确认支付
+        </Button>
+      </div>
+    );
+  }
+});

+ 196 - 0
src/views/adapay/use-coupons/choice-coupon.tsx

@@ -0,0 +1,196 @@
+import OEmpty from '@/components/o-empty'
+import request from '@/helpers/request'
+import { state } from '@/state'
+// import Item from '@/views/coupons/item'
+import { Button, Loading } from 'vant'
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
+
+export default defineComponent({
+  name: 'choice-coupon',
+  props: {
+    orderAmount: {
+      type: Number,
+      default: 0
+    },
+    useCoupon: {
+      type: Array,
+      default: () => []
+    },
+    couponCategory: {
+      type: String,
+      default: 'UNIVERSAL'
+    },
+    couponList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  emits: ['close', 'submit'],
+  data() {
+    return {
+      list: [] as any,
+      // consumeAmount: 0 // 消耗金额
+      dataLoading: false
+    }
+  },
+  computed: {
+    // 使用优惠券的数量
+    useLength() {
+      return this.list.filter((list: any) => list.checked).length || 0
+    }
+  },
+  async mounted() {
+    // this.getList()
+    // 处理显示已选择的优惠券
+    // 处理可用优惠券是否支付使用
+    this.couponList.forEach((item: any) => {
+      this.useCoupon.forEach((coupon: any) => {
+        if (item.couponIssueId === coupon.couponIssueId) {
+          item.checked = true
+        }
+      })
+    })
+    const canUsable = this.couponList.filter((list: any) => !list.disabled)
+    const canUsed = this.couponList.filter((list: any) => list.disabled)
+    this.list = [...canUsable, ...canUsed]
+    this.calcCoupon()
+  },
+  methods: {
+    // async getList() {
+    //   if (this.dataLoading) return
+    //   this.dataLoading = true
+    //   try {
+    //     const res = await request.post(`${state.platformApi}/couponInfo/page`, {
+    //       data: {
+    //         couponCategory: this.couponCategory,
+    //         couponType: 'FULL_DISCOUNT',
+    //         useState: 'USABLE',
+    //         page: 1,
+    //         rows: 100
+    //       }
+    //     })
+    //     this.dataLoading = false
+    //     const result = res.data || {}
+    //     // 处理重复请求数据
+    //     if (this.list.length > 0 && result.pageNo === 1) return
+    //     this.list = result.rows || []
+
+    //     // 处理可用优惠券是否支付使用
+    //     this.list.forEach((item: any) => {
+    //       item.checked = false
+    //       // 如果使用金额大于订单金额则优惠券不可用
+    //       if (item.useLimit > this.orderAmount) {
+    //         item.disabled = true
+    //       } else {
+    //         item.disabled = false
+    //       }
+
+    //       // 处理显示已选择的优惠券
+    //       this.useCoupon.forEach((coupon: any) => {
+    //         if (item.couponIssueId === coupon.couponIssueId) {
+    //           item.checked = true
+    //         }
+    //       })
+    //     })
+    //     // 初始化排序
+    //     const canUsable = this.list.filter((list: any) => !list.disabled)
+    //     const canUsed = this.list.filter((list: any) => list.disabled)
+    //     this.list = [...canUsable, ...canUsed]
+
+    //     this.calcCoupon()
+    //   } catch {
+    //     //
+    //   }
+    // },
+    onSubmit() {
+      // 返回选中的优惠券
+      this.$emit(
+        'submit',
+        this.list.filter((list: any) => list.checked)
+      )
+
+      this.list.forEach((item: any) => {
+        item.checked = false
+      })
+    },
+    onSelect(item: any) {
+      item.checked = !item.checked
+      this.calcCoupon()
+    },
+    calcCoupon() {
+      // 计算优惠券
+      // 已使用的优惠券
+      const useList = this.list.filter((list: any) => list.checked)
+      const limitCount = useList.map((list: any) => {
+        return Number(list.useLimit || 0)
+      })
+      const usePrice =
+        limitCount.length > 0
+          ? limitCount.reduce((sum: any, list: any) => {
+              return sum + list
+            })
+          : 0
+      // 使用优惠券后,可判断的金额
+      const useLastAmount = this.orderAmount - usePrice
+      // 判断使用优惠券之后还有没有其它优惠券可用
+      this.list.forEach((item: any) => {
+        if (Number(item.useLimit) > useLastAmount && !item.checked) {
+          item.disabled = true
+        } else {
+          item.disabled = false
+        }
+      })
+    }
+  },
+  render() {
+    return (
+      <div class={styles.choiceCoupon}>
+        <div class={styles.couponTitle}>
+          <span>优惠券</span>
+          <i class={styles.iconClose} onClick={() => this.$emit('close')}></i>
+        </div>
+
+        <div class={styles.couponContent}>
+          {!this.dataLoading ? (
+            <>
+              {this.list.length > 0 ? (
+                <>
+                  {this.list.map((item: any) => (
+                    // <Item item={item} isSelect onClick={this.onSelect} />
+                    <>1212</>
+                  ))}
+                </>
+              ) : (
+                <OEmpty btnStatus={false} tips="暂无优惠券" />
+              )}
+            </>
+          ) : (
+            <Loading
+              size={48}
+              color="#2dc7aa"
+              vertical
+              style={{ height: '100%', justifyContent: 'center' }}
+            >
+              加载中...
+            </Loading>
+          )}
+        </div>
+
+        <div class={[styles.couponFooter, 'van-hairline--top']}>
+          <div class={styles.couponSelectText}>
+            已选<span>{this.useLength}</span>张
+          </div>
+          <Button
+            type="primary"
+            round
+            style={{ minWidth: '105px', fontSize: '16px' }}
+            onClick={this.onSubmit}
+          >
+            确定
+          </Button>
+        </div>
+      </div>
+    )
+  }
+})

+ 67 - 0
src/views/adapay/use-coupons/index.module.less

@@ -0,0 +1,67 @@
+.useCoupon {
+  padding-top: 16px;
+  padding-bottom: 16px;
+
+  .couponCount {
+    color: #ff3535;
+    font-size: 16px;
+    font-weight: 600;
+    i {
+      font-style: normal;
+      font-size: 14px;
+    }
+  }
+}
+
+.choiceCoupon {
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+  height: 100%;
+}
+.couponTitle {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  flex-shrink: 0;
+  padding: 0 17px;
+  height: 60px;
+  line-height: 60px;
+  font-size: 18px;
+  font-weight: 600;
+  color: #1a1a1a;
+
+  .iconClose {
+    display: inline-block;
+    width: 24px;
+    height: 24px;
+    background: url('../../coupons/images/icon_close.png') no-repeat center;
+    background-size: contain;
+  }
+}
+
+.couponContent {
+  flex: 1 auto;
+  overflow-y: auto;
+  -webkit-overflow-scrolling: touch;
+  padding: 12px 14px;
+
+  --coupon-point: #fff;
+}
+
+.couponFooter {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  line-height: 56px;
+  padding: 0 16px;
+  .couponSelectText {
+    font-size: 16px;
+    color: #1a1a1a;
+    span {
+      padding: 0 9px;
+      font-weight: 600;
+      color: #fc1a19;
+    }
+  }
+}

+ 213 - 0
src/views/adapay/use-coupons/index.tsx

@@ -0,0 +1,213 @@
+import request from '@/helpers/request'
+import { state } from '@/state'
+import { Cell, Popup } from 'vant'
+import { defineComponent } from 'vue'
+import ChoiceCoupon from './choice-coupon'
+import styles from './index.module.less'
+
+/*
+ * 订单类型对应优惠券类型
+ */
+export const couponEnum = {
+  UNIVERSAL: 'UNIVERSAL',
+  VIP: 'VIP',
+  PIANO_ROOM: 'PIANO',
+  GOODS: 'MALL',
+  MUSIC: 'MUSIC',
+  PRACTICE: 'SPARRING',
+  LIVE: 'LIVE',
+  VIDEO: 'VIDEO',
+  ALBUM: 'ALBUM'
+}
+
+export default defineComponent({
+  name: 'use-conpon',
+  props: {
+    disabled: {
+      type: Boolean,
+      default: false
+    },
+    orderAmount: {
+      type: Number,
+      default: 0
+    },
+    orderType: {
+      type: String,
+      default: ''
+    },
+    discountPrice: {
+      // 优惠券使用金额
+      type: Number,
+      default: 0
+    }
+  },
+  emits: ['couponSelect'],
+  data() {
+    return {
+      popupStatus: false,
+      popupLoading: false,
+      useCouponList: [] as any,
+      useCouponLoading: false,
+      useCouponCount: 0,
+      dataLoading: false,
+      list: [] as any
+    }
+  },
+  computed: {
+    couponCount() {
+      const limitCount = this.useCouponList.map((list: any) => {
+        return Number(list.discountPrice || 0)
+      })
+      let count = 0
+      if (this.disabled) {
+        count = this.discountPrice
+      } else {
+        count =
+          limitCount.length > 0
+            ? limitCount.reduce((sum: any, list: any) => {
+                return sum + list
+              })
+            : 0
+      }
+      return count
+    },
+    couponCategory() {
+      // 如果订单类型不在优惠券类型里面,则默认查询通用券
+      return couponEnum[this.orderType] || 'UNIVERSAL'
+    }
+  },
+  mounted() {
+    // this.getUseableCoupon()
+    this.getList()
+  },
+  methods: {
+    async getList() {
+      if (this.dataLoading) return
+      this.dataLoading = true
+      try {
+        const res = await request.post(`${state.platformApi}/couponInfo/page`, {
+          data: {
+            couponCategory: this.couponCategory,
+            couponType: 'FULL_DISCOUNT',
+            useState: 'USABLE',
+            orderUse: 1,
+            page: 1,
+            rows: 100
+          }
+        })
+        this.dataLoading = false
+        const result = res.data || {}
+        // 处理重复请求数据
+        if (this.list.length > 0 && result.pageNo === 1) return
+        this.list = result.rows || []
+
+        // 处理可用优惠券是否支付使用
+        this.list.forEach((item: any) => {
+          item.checked = false
+          // 如果使用金额大于订单金额则优惠券不可用
+          if (item.useLimit > this.orderAmount) {
+            item.disabled = true
+          } else {
+            item.disabled = false
+          }
+        })
+
+        let count = 0
+        this.list.forEach((item: any) => {
+          if (!item.disabled) {
+            count++
+          }
+        })
+        console.log(this.list, 'list')
+        this.useCouponCount = count
+      } catch {
+        //
+      }
+    },
+    // async getUseableCoupon() {
+    //   try {
+    //     this.useCouponLoading = true
+    //     // 判断是哪个端
+    //     const url =
+    //       state.platformType === 'STUDENT' ? '/api-student' : '/api-teacher'
+    //     const res = await request.get(`${url}/couponInfo/statInfo`)
+    //     this.useCouponLoading = false
+    //     const result = (res.data || []).find(
+    //       result => result.useState === 'USABLE'
+    //     )
+    //     this.useCouponCount = result.total || 0
+    //   } catch {
+    //     // TODO: handle
+    //   }
+    // },
+    onSubmit(item: any) {
+      // useCouponList
+      this.useCouponList = item
+      this.$emit('couponSelect', item)
+      this.popupStatus = false
+      this.popupLoading = false
+    }
+  },
+  render() {
+    return (
+      <>
+        <Cell
+          title="优惠券"
+          class={styles.useCoupon}
+          style={{ borderRadius: '8px' }}
+          isLink={!this.disabled}
+          clickable={false}
+          v-slots={{
+            value: () =>
+              !this.useCouponLoading && (
+                <>
+                  {/* 判断是否有选择优惠券 */}
+                  {this.couponCount > 0 ? (
+                    <span class={styles.couponCount}>
+                      <i>-¥ </i>
+                      {this.couponCount}
+                    </span>
+                  ) : (
+                    <>
+                      {/* 判断是否有可以的优惠券 */}
+                      {this.useCouponCount > 0
+                        ? `${this.useCouponCount}张可使用`
+                        : '暂无可使用优惠券'}
+                    </>
+                  )}
+                </>
+              )
+          }}
+          onClick={() => {
+            if (this.disabled) return
+            this.popupStatus = true
+            this.popupLoading = true
+          }}
+        ></Cell>
+
+        <Popup
+          v-model:show={this.popupStatus}
+          position="bottom"
+          round
+          safeAreaInsetBottom={true}
+          style={{ height: '75%' }}
+          onClosed={() => {
+            this.popupLoading = false
+          }}
+        >
+          {/* 优化体验 */}
+          {this.popupLoading && (
+            <ChoiceCoupon
+              couponCategory={this.couponCategory}
+              useCoupon={this.useCouponList}
+              orderAmount={this.orderAmount}
+              couponList={this.list}
+              onClose={() => (this.popupStatus = false)}
+              onSubmit={(item: any) => this.onSubmit(item)}
+            />
+          )}
+        </Popup>
+      </>
+    )
+  }
+})

BIN
src/views/payment-result/images/icon_close.png


BIN
src/views/payment-result/images/icon_refunding.png


BIN
src/views/payment-result/images/icon_success.png


BIN
src/views/payment-result/images/icon_tradeing.png


+ 157 - 0
src/views/payment-result/index.module.less

@@ -0,0 +1,157 @@
+.paymentTitle {
+  min-height: 177px;
+  background: linear-gradient(180deg, #EFB02D 0%, #FFCD79 100%);
+  border-radius: 0px 0px 8px 8px;
+
+  .orderType {
+    padding-top: 35px;
+    padding-bottom: 90px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    color: #fff;
+
+    .img {
+      width: 52px;
+      height: 52px;
+      margin-right: 14px;
+    }
+
+    span {
+      font-size: 22px;
+      font-weight: 500;
+      line-height: 30px;
+    }
+  }
+
+  .orderPrice {
+    padding-top: 2px;
+    font-size: 22px;
+    text-align: center;
+    font-size: 14px;
+  }
+}
+
+.mTop {
+  margin-top: -52px !important;
+}
+
+.cellGroup {
+  margin: 10px 13px;
+
+  .brandName {
+    line-height: 18px;
+    font-size: 12px;
+    padding: 0 6px;
+    border-radius: 4px;
+    background: linear-gradient(180deg, #FFD982 0%, #FFB45A 100%);
+    border-radius: 4px;
+    border: 1px solid rgba(255, 123, 27, 0.17);
+  }
+
+  :global {
+    .van-cell {
+      padding: 16px 17px;
+      font-size: 16px;
+      color: #333333;
+    }
+
+    .van-cell__value {
+      flex: 0 auto;
+    }
+  }
+
+  .buyDetail {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 18px 18px 0;
+
+    i {
+      display: inline-block;
+      margin-right: 6px;
+      width: 4px;
+      height: 14px;
+      background: linear-gradient(180deg, #FFB790 0%, #FF8057 100%);
+      border-radius: 2px;
+    }
+
+    font-size: 16px;
+    font-weight: 500;
+    color: #333333;
+    line-height: 22px;
+
+    .buyDetailTitle {
+      display: flex;
+      align-items: center;
+    }
+
+    .refundBtn {
+      font-size: 16px;
+      color: #777777;
+      line-height: 22px;
+    }
+  }
+
+  .buyImg {
+    width: 58px;
+    height: 58px;
+    overflow: hidden;
+    border-radius: 5px;
+    margin-right: 9px;
+  }
+}
+
+.container {
+  :global {
+    .van-button {
+      font-size: 18px;
+      font-weight: 500;
+    }
+  }
+}
+
+.dialogTitle {
+  i {
+    display: inline-block;
+    width: 4px;
+    height: 14px;
+    background: #ff8057;
+    border-radius: 2px;
+    margin-right: 6px;
+  }
+
+  text-align: left;
+  font-size: 18px;
+  font-weight: 500;
+  color: #333333;
+  line-height: 25px;
+  padding: 20px 0 15px 25px;
+}
+
+.refundContent {
+  padding: 0 20px 25px;
+
+  .tips {
+    font-size: 15px;
+    color: #333333;
+    line-height: 21px;
+  }
+}
+
+.refundTitle {
+  padding-top: 25px;
+  font-size: 16px;
+  font-weight: 600;
+  color: #333333;
+  line-height: 22px;
+
+  span {
+    color: #f44541;
+  }
+}
+
+.phoneName {
+  background: #f2f2f2;
+  border-radius: 6px;
+}

+ 204 - 0
src/views/payment-result/index.tsx

@@ -0,0 +1,204 @@
+import MHeader from '@/components/m-header';
+import { defineComponent, onMounted, reactive } from 'vue';
+import { Button, Cell, CellGroup, Image, Tag } from 'vant';
+import styles from './index.module.less';
+import iconRefunding from './images/icon_refunding.png';
+import icon_success from './images/icon_success.png';
+import iconClose from './images/icon_close.png';
+import iconTradeing from './images/icon_tradeing.png';
+import request from '@/helpers/request';
+import { useRoute, useRouter } from 'vue-router';
+import { browser, moneyFormat } from '@/helpers/utils';
+import { useEventListener, useWindowScroll } from '@vueuse/core';
+
+export default defineComponent({
+  name: 'payment-result',
+  setup() {
+    const route = useRoute();
+    const router = useRouter();
+    const state = reactive({
+      refund: route.query.refund,
+      orders: {} as any,
+      goodsInfos: [] as any,
+      background: 'transparent',
+      color: '#fff',
+      backIconColor: 'white' as any,
+      timer: null as any,
+      timerCount: 0 // 执行次数
+    });
+    const form = reactive({
+      resionList: [] as any,
+      refundStatus: false,
+      resion: null,
+      refundSelect: {} as any,
+      checked: null as any
+    });
+    const getDetails = async () => {
+      try {
+        if (!route.query.orderNo) return;
+        const { data } = await request.post(
+          '/edu-app/open/userOrder/paymentStatus/' + route.query.orderNo
+        );
+
+        state.orders = data || {};
+        // state.orders.status = 'REFUNDED'
+        const tempGoods = data.goodsInfos || [];
+        tempGoods.forEach((item: any) => {
+          const img = item.goodsUrl ? item.goodsUrl.split(',')[0] : '';
+          item.goodsUrl = img;
+        });
+        state.goodsInfos = tempGoods;
+      } catch {
+        //
+      }
+    };
+
+    // 定时任务
+    const onTimeout = async () => {
+      // 判断订单状态,如果未支付则刷新
+      if (
+        ['WAIT_PAY', 'PAYING'].includes(state.orders.status) &&
+        state.timerCount <= 10
+      ) {
+        state.timer = setTimeout(async () => {
+          state.timerCount += 1;
+          await getDetails();
+          onTimeout();
+        }, 3000);
+      } else {
+        clearTimeout(state.timer);
+      }
+    };
+
+    const formatImg = (type: any) => {
+      const template: any = {
+        WAIT_PAY: iconTradeing,
+        PAYING: iconTradeing,
+        PAID: icon_success,
+        TIMEOUT: iconClose,
+        FAIL: iconClose,
+        CLOSED: iconClose,
+        REFUNDING: iconRefunding,
+        REFUNDED: icon_success
+      };
+      return template[type] || icon_success;
+    };
+
+    const formatOrderStatus = (status: string) => {
+      const temp: any = {
+        WAIT_PAY: '支付中',
+        PAYING: '支付中',
+        PAID: '支付成功',
+        TIMEOUT: '订单超时',
+        FAIL: '支付失败',
+        CLOSED: '订单关闭',
+        REFUNDING: '退款中',
+        REFUNDED: '已退款'
+      };
+      return temp[status];
+    };
+
+    onMounted(async () => {
+      await getDetails();
+      await onTimeout();
+      useEventListener(document, 'scroll', () => {
+        const { y } = useWindowScroll();
+        if (y.value > 52) {
+          state.background = '#fff';
+          state.color = '#323333';
+          state.backIconColor = 'black';
+        } else {
+          state.background = 'transparent';
+          state.color = '#fff';
+          state.backIconColor = 'white';
+        }
+      });
+    });
+    return () => (
+      <div class={styles.paymentResult}>
+        <div class={styles.paymentTitle}>
+          {browser().isApp && (
+            <MHeader
+              border={false}
+              background={state.background}
+              color={state.color}
+            />
+          )}
+
+          {state.orders.id && (
+            <>
+              <div class={styles.orderType}>
+                <Image
+                  class={styles.img}
+                  src={formatImg(state.orders.status)}
+                />
+                <div class={styles.orderInfo}>
+                  <span>{formatOrderStatus(state.orders.status)}</span>
+                  {state.orders.status === 'PAID' ||
+                  state.orders.status === 'REFUNDING' ? (
+                    <div class={styles.orderPrice}>
+                      实付金额:¥ {moneyFormat(state.orders.paymentCashAmount)}
+                    </div>
+                  ) : (
+                    ''
+                  )}
+
+                  {state.orders.status === 'REFUNDED' && (
+                    <div class={styles.orderPrice}>
+                      退款金额:¥ {moneyFormat(state.orders.paymentCashAmount)}
+                    </div>
+                  )}
+                </div>
+              </div>
+            </>
+          )}
+        </div>
+
+        <CellGroup inset class={[styles.cellGroup, styles.mTop]}>
+          <Cell>
+            {{
+              title: () => '付款时间',
+              value: () => <span>{state.orders.payTime || '--'}</span>
+            }}
+          </Cell>
+          <Cell>
+            {{
+              title: () => '订单编号',
+              value: () => <span>{state.orders.orderNo}</span>
+            }}
+          </Cell>
+        </CellGroup>
+
+        <CellGroup inset class={styles.cellGroup}>
+          <div class={styles.buyDetail}>
+            <div class={styles.buyDetailTitle}>
+              <i></i> 购买详情
+            </div>
+          </div>
+          {state.goodsInfos.map((goods: any) => (
+            <Cell>
+              {{
+                icon: () => (
+                  <Image class={styles.buyImg} src={goods.goodsUrl} />
+                ),
+                title: () => (
+                  <div class={styles.buyContent}>
+                    <p class={styles.goodsTitle}>{goods.goodsName}</p>
+                    <Tag class={styles.brandName}>{goods.brandName}</Tag>
+                  </div>
+                ),
+                value: () => (
+                  <span>
+                    {goods.goodsType === 'VIP' || goods.goodsType === 'DEPOSIT'
+                      ? '6个月'
+                      : 'x 1'}
+                  </span>
+                )
+              }}
+            </Cell>
+          ))}
+        </CellGroup>
+      </div>
+    );
+  }
+});

+ 91 - 0
src/views/student-register/component/addres.tsx

@@ -0,0 +1,91 @@
+import { Cell, Icon, Tag } from 'vant';
+import { defineComponent, computed, PropType, reactive, onMounted } from 'vue';
+import styles from './address.module.less';
+import iconAddress from '@common/images/icon-address.png';
+import { useRouter } from 'vue-router';
+
+export default defineComponent({
+  name: 'cart-address',
+  props: {
+    item: {
+      type: Object as PropType<any>,
+      default: () => ({})
+    },
+    isLink: {
+      type: Boolean,
+      default: true
+    },
+    setAddress: {
+      type: Function,
+      default: (n: any) => {}
+    }
+  },
+  setup(props) {
+    const router = useRouter();
+
+    const addressInfo = computed(() => {
+      return [
+        props.item.provinceName,
+        props.item.cityName,
+        props.item.regionName,
+        props.item.detailAddress
+      ].join('');
+    });
+
+    const selectAddress = () => {
+      if (!props.isLink) return;
+      router.push('/shopAddress');
+    };
+
+    return () => (
+      <>
+        {props.item && props.item.phoneNumber ? (
+          <Cell
+            class={styles.cell}
+            is-link={props.isLink}
+            onClick={() => selectAddress()}
+            titleStyle={{ marginLeft: '0' }}
+            v-slots={{
+              title: () => (
+                <div>
+                  <span class={styles.userName}>{props.item.name}</span>
+                  <span class={styles.phone}>
+                    {props.item &&
+                      props.item.phoneNumber &&
+                      props.item.phoneNumber.replace(
+                        /^(\d{3})\d{4}(\d+)/,
+                        '$1****$2'
+                      )}
+                  </span>
+                  {props.item.defaultStatus && (
+                    <Tag
+                      type="primary"
+                      round
+                      style={{
+                        'vertical-align': 'text-top',
+                        marginLeft: '10px',
+                        padding: '1px 8px'
+                      }}>
+                      默认
+                    </Tag>
+                  )}
+                </div>
+              ),
+              label: () => (
+                <span class={styles.addressInfo}>{addressInfo.value}</span>
+              )
+            }}></Cell>
+        ) : (
+          <Cell
+            class={styles.cell}
+            is-link={props.isLink}
+            onClick={() => selectAddress()}
+            v-slots={{
+              icon: () => <Icon name={iconAddress} size={28} />,
+              title: () => <div class={styles.emtry}>去填写收货地址</div>
+            }}></Cell>
+        )}
+      </>
+    );
+  }
+});

+ 68 - 0
src/views/student-register/component/address.module.less

@@ -0,0 +1,68 @@
+.cellEntry {
+  align-items: center;
+
+  :global {
+    .van-badge__wrapper {
+      margin: 0;
+    }
+
+    .van-cell__title {
+      display: flex;
+      align-items: center;
+      margin-left: 14px;
+    }
+  }
+}
+
+.cell {
+  position: relative;
+  align-items: center;
+  padding: 13px 12px 18px;
+
+  &::before {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    content: ' ';
+    display: block;
+    height: 3px;
+    width: 100%;
+    background: url('../images/icon-address-border.png') repeat center left;
+    background-size: 90%;
+  }
+
+  :global {
+    .van-cell__title {
+      margin-left: 14px;
+    }
+
+    .van-cell__right-icon {
+      font-size: 20px;
+      color: #d8d8d8;
+    }
+  }
+}
+
+.userName {
+  color: #333;
+  font-size: 16px;
+  font-weight: 500;
+}
+
+.phone {
+  font-size: 16px;
+  color: #777;
+  margin-left: 14px;
+}
+
+.addressInfo {
+  font-size: 14px;
+  color: #777;
+  line-height: 20px;
+}
+
+.emtry {
+  font-size: 14px;
+  color: #333;
+}

+ 410 - 0
src/views/student-register/component/apply.tsx

@@ -0,0 +1,410 @@
+import request from '@/helpers/request'
+import {
+  Button,
+  CellGroup,
+  Dialog,
+  Field,
+  Form,
+  Picker,
+  Popup,
+  Radio,
+  RadioGroup,
+  showToast,
+  Tag
+} from 'vant'
+import { defineComponent, onMounted, reactive } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import styles from '../index.module.less'
+import { setLogout } from '@/state'
+
+// 乐团交付,乐团停止或关闭,有新的交付团;则不允许报名
+const classList: any = []
+for (let i = 1; i <= 40; i++) {
+  classList.push({ text: i + '班', value: i })
+}
+
+export default defineComponent({
+  name: 'apply',
+  props: {
+    schoolSystem: {
+      type: String,
+      default: 'sixYearSystem' // 默认为六年制
+    },
+    registerInfo: {
+      type: Object,
+      defualt: {}
+    },
+    code: {
+      type: String,
+      default: ''
+    }
+  },
+  emits: ['next'],
+  setup(props, { slots, attrs, emit }) {
+    const route = useRoute()
+    const router = useRouter()
+    const state = reactive({
+      // code: '' as any, // 微信授权code码
+      detail: {} as any, // 学员详情
+      currentGrade: [
+        { text: '一年级', value: 1 },
+        { text: '二年级', value: 2 },
+        { text: '三年级', value: 3 },
+        { text: '四年级', value: 4 },
+        { text: '五年级', value: 5 }
+      ], // 年级数组列表
+      classList: classList,
+      subjectList: [] as any, // 声部列表
+      gradeStatus: false,
+      classStatus: false,
+      subjectStatus: false,
+      pattern: /^1(3|4|5|6|7|8|9)\d{9}$/,
+      nameReg: /^[\u4E00-\u9FA5]+$/,
+      subjectChangeStatus: false // 更换声部时
+    })
+    const forms = reactive({
+      username: null,
+      sex: null as any,
+      currentGrade: null,
+      currentGradeTxt: null, // 年级编号
+      currentClass: '', // 班级
+      currentClassTxt: null, // 年级编号
+      registerSubjectId: '',
+      registerSubjectTxt: null, // 所在声部
+      parentName: null,
+      phone: null
+    })
+
+    // 获取乐团报名信息
+    const studentRegister = async () => {
+      try {
+        const { data } = await request.get(
+          '/api-student/orchestraRegister/register/' + route.query.id
+        )
+        const detail = data || {}
+
+        state.detail = detail
+
+        const grade: any = state.currentGrade.find((item: any) => item.value == detail.currentGrade)
+        const cls: any = state.classList.find((item: any) => item.value == detail.currentClass)
+        const subjects: any = state.subjectList.find(
+          (item: any) => item.value == detail.registerSubjectId
+        )
+        forms.username = detail.username
+        forms.sex = detail.sex ? 1 : 0
+        forms.currentGrade = detail.currentGrade
+        forms.currentGradeTxt = grade ? grade.text : ''
+        forms.currentClass = detail.currentClass
+        forms.currentClassTxt = cls ? cls.text : ''
+        forms.registerSubjectId = detail.registerSubjectId
+        forms.registerSubjectTxt = subjects ? subjects.text : ''
+        forms.parentName = detail.parentName
+        forms.phone = detail.phone
+      } catch (e) {
+        //
+        console.log(e)
+      }
+    }
+
+    // 获取声部信息
+    const getSubjects = async () => {
+      try {
+        const subjects = await request.post(
+          '/api-student/open/orchestraSubjectConfig/pageByOrchestraId',
+          {
+            data: {
+              orchestraId: route.query.id,
+              page: 1,
+              rows: 100
+            }
+          }
+        )
+        const rows = subjects.data.rows || []
+        rows.forEach((item: any) => {
+          state.subjectList.push({
+            text: item.name,
+            value: item.subjectId
+          })
+        })
+      } catch {
+        //
+      }
+    }
+
+    const validator = (val: any) => {
+      // 校验函数返回 true 表示校验通过,false 表示不通过
+      return state.nameReg.test(val) && val.length >= 2 && val.length <= 15
+    }
+    const message = (value: any) => {
+      if (!value) {
+        return '请填写学员真实姓名'
+      } else if (!state.nameReg.test(value)) {
+        return '学员姓名必须为中文'
+      } else if (value.length < 2 || value.length > 15) {
+        return '学员姓名必须为2~15个字'
+      } else {
+        return ''
+      }
+    }
+
+    // 乐团报名
+    const onSubmit = async () => {
+      try {
+        const params: any = {
+          orchestraId: route.query.id,
+          schoolId: state.detail.schoolId,
+          ...forms
+        }
+        // 判断是否已报过名
+        if (state.detail.id) {
+          params.id = state.detail.id
+        }
+        await request.post('/api-student/orchestraRegister/save', {
+          hideLoading: false,
+          data: {
+            ...params,
+            code: props.code
+          }
+        })
+        setTimeout(() => {
+          // showToast('报名成功')
+          emit('next', 'payment')
+        }, 100)
+      } catch {
+        //
+      }
+    }
+
+    onMounted(async () => {
+      // state.code = route.query.code || ''
+      // console.log('pre register code: ' + state.code)
+      await getSubjects()
+      // 判断学年制
+      if (props.schoolSystem === 'sixYearSystem') {
+        state.currentGrade.push({ text: '六年级', value: 6 })
+      }
+      await studentRegister()
+
+      // 判断是否有授权码
+      // if (!props.code) {
+      //   setLogout()
+      //   const query = {
+      //     returnUrl: route.path,
+      //     ...route.query
+      //   } as any
+      //   router.replace({
+      //     path: '/loginMusic',
+      //     query: query
+      //   })
+      // }
+    })
+    return () => (
+      <div class={styles.preApplyC}>
+        <Form validateFirst scrollToError onSubmit={onSubmit} ref="form" class={styles.form}>
+          <div class={styles.applyTitle}>学员信息</div>
+          <CellGroup inset class={styles.applyCellGroup}>
+            <Field
+              required
+              label="学员信息"
+              placeholder="请填写学员真实姓名"
+              inputAlign="right"
+              v-model={forms.username}
+              maxlength={15}
+              rules={[{ validator, message }]}
+            />
+            <Field
+              required
+              label="性别"
+              inputAlign="right"
+              rules={[{ required: true, message: '请选择性别' }]}
+            >
+              {{
+                input: () => (
+                  <RadioGroup v-model={forms.sex}>
+                    <Tag
+                      size="large"
+                      type="primary"
+                      color={!(forms.sex === 1) ? '#EAEAEA' : '#FF8057'}
+                      textColor={!(forms.sex === 1) ? '#AAA' : '#FFF'}
+                      class={styles.radioSection}
+                      round
+                    >
+                      <Radio class={styles.radioItem} name={1}></Radio>男生
+                    </Tag>
+                    <Tag
+                      size="large"
+                      type="primary"
+                      color={!(forms.sex === 0) ? '#EAEAEA' : '#FF8057'}
+                      textColor={!(forms.sex === 0) ? '#AAA' : '#FFF'}
+                      class={styles.radioSection}
+                      round
+                    >
+                      <Radio class={styles.radioItem} name={0}></Radio>女生
+                    </Tag>
+                  </RadioGroup>
+                )
+              }}
+            </Field>
+            <Field
+              required
+              label="年级"
+              inputAlign="right"
+              readonly
+              isLink
+              placeholder="请选择年级"
+              v-model={forms.currentGradeTxt}
+              onClick={() => (state.gradeStatus = true)}
+              rules={[{ required: true, message: '请选择年级' }]}
+            />
+            <Field
+              required
+              label="班级"
+              inputAlign="right"
+              readonly
+              isLink
+              placeholder="请选择班级"
+              v-model={forms.currentClassTxt}
+              onClick={() => (state.classStatus = true)}
+              rules={[{ required: true, message: '请选择班级' }]}
+            />
+          </CellGroup>
+
+          <div class={styles.applyTitle}>声部信息</div>
+          <div class={styles.applyTips}>(请务必按照学生的录取声部填报)</div>
+          <CellGroup inset class={styles.applyCellGroup}>
+            <Field
+              required
+              label="声部"
+              inputAlign="right"
+              readonly
+              isLink
+              placeholder="请选择声部"
+              v-model={forms.registerSubjectTxt}
+              onClick={() => {
+                if (state.subjectList.length <= 0) {
+                  showToast('暂无报名声部')
+                  return
+                }
+
+                // 切换订单时判断是否有支付中和已支付的订单,并且已注册过
+                // 判断学员所在乐团状态,如果在读则不允许更换声部(只能退团重新报名)
+                // 退团重新报名也不能更新声部
+                if (
+                  props.registerInfo?.registerStatus === 'LEARNING' ||
+                  (props.registerInfo?.registerStatus === 'OUTOF_ORCHESTRA' &&
+                    props.registerInfo?.orderNumber > 0)
+                ) {
+                  state.subjectChangeStatus = true
+                  return
+                }
+                state.subjectStatus = true
+              }}
+              rules={[{ required: true, message: '请选择声部' }]}
+            />
+          </CellGroup>
+
+          <div class={styles.applyTitle}>家长信息</div>
+          <CellGroup inset class={styles.applyCellGroup}>
+            <Field
+              required
+              label="家长姓名"
+              inputAlign="right"
+              placeholder="请填写家长真实姓名"
+              v-model={forms.parentName}
+              maxlength={15}
+              rules={[{ required: true, message: '请填写家长真实姓名' }]}
+            />
+            <Field
+              required
+              label="手机号"
+              inputAlign="right"
+              placeholder="请输入手机号"
+              v-model={forms.phone}
+              maxlength={11}
+              type="tel"
+              rules={[{ pattern: state.pattern, message: '输入监护人手机号码有误' }]}
+            />
+          </CellGroup>
+
+          <div class={'btnGroup'} style={{ paddingTop: '30px' }}>
+            <Button type="primary" round block native-type="submit">
+              下一步
+            </Button>
+          </div>
+        </Form>
+
+        {/* 年级 */}
+        <Popup
+          v-model:show={state.gradeStatus}
+          position="bottom"
+          round
+          safeAreaInsetBottom
+          // duration={0}
+          lazyRender={false}
+          class={'popupBottomSearch'}
+        >
+          <Picker
+            showToolbar
+            columns={state.currentGrade}
+            onCancel={() => (state.gradeStatus = false)}
+            onConfirm={(val: any) => {
+              const selectedOption = val.selectedOptions[0]
+              forms.currentGrade = selectedOption.value
+              forms.currentGradeTxt = selectedOption.text
+              state.gradeStatus = false
+            }}
+          />
+        </Popup>
+        {/* 班级 */}
+        <Popup v-model:show={state.classStatus} position="bottom" round class={'popupBottomSearch'}>
+          <Picker
+            showToolbar
+            columns={state.classList}
+            onCancel={() => (state.classStatus = false)}
+            onConfirm={(val: any) => {
+              const selectedOption = val.selectedOptions[0]
+              forms.currentClass = selectedOption.value
+              forms.currentClassTxt = selectedOption.text
+              state.classStatus = false
+            }}
+          />
+        </Popup>
+        {/* 声部 */}
+        <Popup
+          v-model:show={state.subjectStatus}
+          position="bottom"
+          round
+          class={'popupBottomSearch'}
+        >
+          <Picker
+            showToolbar
+            columns={state.subjectList}
+            onCancel={() => (state.subjectStatus = false)}
+            onConfirm={(val: any) => {
+              const selectedOption = val.selectedOptions[0]
+              forms.registerSubjectId = selectedOption.value
+              forms.registerSubjectTxt = selectedOption.text
+              state.subjectStatus = false
+            }}
+          />
+        </Popup>
+
+        <Dialog
+          v-model:show={state.subjectChangeStatus}
+          message={'您已有报名订单,不可更换声部'}
+          messageAlign="center"
+          confirmButtonText="确定"
+        >
+          {{
+            title: () => (
+              <div class={styles.dialogTitle}>
+                <i></i>
+                提示
+              </div>
+            )
+          }}
+        </Dialog>
+      </div>
+    )
+  }
+})

+ 311 - 0
src/views/student-register/component/order.tsx

@@ -0,0 +1,311 @@
+import OEmpty from '@/components/o-empty'
+import { orderStatus } from '@/constant'
+import { moneyFormat } from '@/helpers/utils'
+import {
+  Button,
+  Cell,
+  CellGroup,
+  Field,
+  Grid,
+  GridItem,
+  Image,
+  List,
+  Popup,
+  Radio,
+  RadioGroup,
+  showToast
+} from 'vant'
+import { defineComponent, onMounted, reactive, ref } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import request from '@/helpers/request'
+import styles from '../index.module.less'
+
+export default defineComponent({
+  name: 'order',
+  emits: ['next'],
+  setup() {
+    const router = useRouter()
+    const route = useRoute()
+    const form = reactive({
+      isClick: false,
+      list: [] as any,
+      listState: {
+        dataShow: true, // 判断是否有数据
+        loading: false,
+        finished: false
+      },
+      params: {
+        page: 1,
+        rows: 20
+      },
+      resionList: [] as any,
+      refundStatus: false,
+      resion: null,
+      refundSelect: {} as any,
+      checked: null as any
+    })
+
+    // userPaymentOrder/page
+    const getList = async () => {
+      try {
+        if (form.isClick) return
+        form.isClick = true
+        const res = await request.post('/api-student/userPaymentOrder/page', {
+          data: {
+            ...form.params,
+            bizId: route.query.id,
+            goodsQuery: true
+          }
+        })
+        form.listState.loading = false
+        const result = res.data || {}
+        // 处理重复请求数据
+        if (form.list.length > 0 && result.current === 1) {
+          return
+        }
+        const rows = result.rows || []
+        rows.goodsInfos &&
+          rows.goodsInfos.forEach((item: any) => {
+            const img = item.goodsUrl ? item.goodsUrl.split(',')[0] : ''
+            item.goodsUrl = img
+          })
+        form.list = form.list.concat(rows)
+        form.listState.finished = result.current >= result.pages
+        form.params.page = result.current + 1
+        form.listState.dataShow = form.list.length > 0
+        form.isClick = false
+      } catch {
+        form.listState.dataShow = false
+        form.listState.finished = true
+        form.isClick = false
+      }
+    }
+
+    // const getDefaultParams = async () => {
+    //   try {
+    //     const { data } = await request.get('/api-student/sysParamConfig/queryByParamName', {
+    //       params: {
+    //         paramName: 'refund_reason'
+    //       }
+    //     })
+    //     const temp = data.paramValue.split('\n') || []
+    //     temp.forEach((item: any, index: number) => {
+    //       form.resionList.push({
+    //         text: item,
+    //         value: index + 1
+    //       })
+    //     })
+    //     form.resionList.push({
+    //       text: '其它原因',
+    //       value: 999
+    //     })
+    //     console.log(form.resionList, 'resionList')
+    //   } catch {
+    //     //
+    //   }
+    // }
+
+    // // 确认退费
+    // const onConfirmRefund = async () => {
+    //   try {
+    //     const status = form.checked === 999 && !form.resion
+    //     console.log(form.checked)
+    //     if (!form.checked) {
+    //       showToast('请选择原因')
+    //       return
+    //     } else if (status) {
+    //       showToast('请输入原因')
+    //       return
+    //     }
+
+    //     const refundReason = form.resionList.find((item: any) => item.value === form.checked)
+
+    //     console.log({
+    //       merOrderNo: form.refundSelect.orderNo,
+    //       refundReason: form.checked === 999 ? form.resion : refundReason.text
+    //     })
+
+    //     await request.post('/api-student/userPaymentOrder/refundPayment', {
+    //       data: {
+    //         merOrderNo: form.refundSelect.orderNo,
+    //         refundReason: form.checked === 999 ? form.resion : refundReason.text
+    //       }
+    //     })
+    //     form.refundStatus = false
+    //     onSearch()
+    //   } catch {
+    //     //
+    //   }
+    // }
+
+    // const onSearch = () => {
+    //   form.params.page = 1
+    //   form.list = []
+    //   form.listState.dataShow = true // 判断是否有数据
+    //   form.listState.loading = false
+    //   form.listState.finished = false
+    //   getList()
+    // }
+
+    // 查看详情
+    const onDetails = (item: any) => {
+      router.push({
+        path: 'payment-result',
+        query: {
+          orderNo: item.orderNo,
+          refund: 'refund'
+        }
+      })
+    }
+
+    onMounted(() => {
+      // getDefaultParams()
+      getList()
+    })
+
+    return () => (
+      <div style={{ paddingTop: '20px' }}>
+        {form.listState.dataShow ? (
+          <List
+            // v-model:loading={form.listState.loading}
+            finished={form.listState.finished}
+            finishedText=" "
+            class={[styles.liveList]}
+            onLoad={getList}
+            immediateCheck={false}
+          >
+            {form.list.map((item: any) => (
+              <CellGroup inset class={styles.orderCellGroup} onClick={() => onDetails(item)}>
+                <Cell
+                  title={item.createTime}
+                  titleClass={styles.payTime}
+                  value={orderStatus[item.status]}
+                  valueClass={
+                    item.status === 'WAIT_PAY'
+                      ? styles.payStatus
+                      : item.status === 'PAID'
+                      ? styles.paySuccess
+                      : ''
+                  }
+                ></Cell>
+                <Cell border={false} class={styles.imgGroup} center>
+                  {{
+                    title: () => (
+                      <div class={styles.orderPriceInfo}>
+                        <Grid border={false} columnNum={3}>
+                          {item.goodsInfos &&
+                            item.goodsInfos.map(
+                              (goods: any, index: number) =>
+                                index < 3 && (
+                                  <GridItem>
+                                    <Image class={styles.img} src={goods.goodsUrl} />
+                                  </GridItem>
+                                )
+                            )}
+                        </Grid>
+                        <div class={styles.orderPriceNum}>
+                          <div class={styles.opNums}>
+                            <span>¥ </span>
+                            {moneyFormat(item.currentPrice)}
+                          </div>
+                          <div class={styles.opBuyLength}>
+                            共{(item.goodsInfos && item.goodsInfos.length) || 0}件
+                          </div>
+                        </div>
+                      </div>
+                    )
+                  }}
+                </Cell>
+                {/* {item.refundable && (
+                  <Cell class={styles.btnGroup} center>
+                    {{
+                      title: () => (
+                        <span class={styles.btnPrice}>¥{moneyFormat(item.currentPrice)}</span>
+                      ),
+                      value: () => (
+                        <div class={styles.btns}>
+                          <Button
+                            round
+                            plain
+                            color="#AAAAAA"
+                            onClick={(e: any) => {
+                              e.stopPropagation()
+                              form.refundSelect = item
+                              form.refundStatus = true
+                            }}
+                          >
+                            申请退款
+                          </Button>
+                        </div>
+                      )
+                    }}
+                  </Cell>
+                )} */}
+              </CellGroup>
+            ))}
+          </List>
+        ) : (
+          <OEmpty btnStatus={false} tips="暂无订单" />
+        )}
+
+        {/* <Popup v-model:show={form.refundStatus} round style={{ width: '90%' }}>
+          <div class={styles.container}>
+            <div class={[styles.dialogTitle, styles.dialogRefund]}>
+              <i></i>
+              申请退款
+            </div>
+
+            <div class={styles.refundContent}>
+              <div class={styles.tips}>
+                您将要发起退款,退款需承担千分之六的手续费,确认退款后款项将原路返还到您的付款账户中。
+              </div>
+
+              <div class={styles.refundTitle}>
+                <span>*</span>请选择您的退款原因
+              </div>
+
+              <RadioGroup v-model={form.checked}>
+                {form.resionList &&
+                  form.resionList.map((item: any) => (
+                    <Cell style="padding: 16px 0;" onClick={() => (form.checked = item.value)}>
+                      {{
+                        icon: () => <Radio name={item.value} />,
+                        title: () => <span style={'padding-left: 6px'}>{item.text}</span>
+                      }}
+                    </Cell>
+                  ))}
+              </RadioGroup>
+              {form.checked === 999 && (
+                <Field
+                  class={styles.phoneName}
+                  v-model={form.resion}
+                  placeholder="请输入原因"
+                  maxlength={50}
+                  type="textarea"
+                  rows={2}
+                />
+              )}
+            </div>
+
+            <div class={['van-hairline--top van-dialog__footer']}>
+              <Button
+                onClick={onConfirmRefund}
+                class={['van-button van-button--default van-button--large van-dialog__cancel']}
+              >
+                确认退款
+              </Button>
+              <Button
+                onClick={() => (form.refundStatus = false)}
+                class={[
+                  'van-button van-button--default van-button--large van-dialog__confirm van-hairline--left'
+                ]}
+              >
+                取消
+              </Button>
+            </div>
+          </div>
+        </Popup> */}
+      </div>
+    )
+  }
+})

+ 768 - 0
src/views/student-register/component/payment.tsx

@@ -0,0 +1,768 @@
+import OSticky from '@/components/o-sticky'
+import {
+  Button,
+  Cell,
+  CellGroup,
+  Checkbox,
+  CheckboxGroup,
+  Icon,
+  Image,
+  Popup,
+  showConfirmDialog,
+  showToast,
+  Tag
+} from 'vant'
+import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue'
+import styles from '../index.module.less'
+import radioCheck from '@/common/images/icon-radio-check.png'
+import radioDefault from '@/common/images/icon-radio-default.png'
+import iconGives from '../images/icon-gives.png'
+import { useRoute, useRouter } from 'vue-router'
+import request from '@/helpers/request'
+import { moneyFormat } from '@/helpers/utils'
+import { CountUp } from 'countup.js'
+import OPopup from '@/components/o-popup'
+import MemberBao from '../../member-bao'
+import GoodsDetail from '../../goods-detail'
+import ODialog from '@/components/o-dialog'
+
+export default defineComponent({
+  name: 'payment',
+  emits: ['next'],
+  setup() {
+    const route = useRoute()
+    const router = useRouter()
+    const state = reactive({
+      paymentType: '',
+      musicPaymentType: '', // 乐团中对应支付方式
+      check: [] as any, // 选中的数据
+      checkboxRefs: [] as any,
+      details: [] as any, //
+      goodsInfo: {} as any, // 商品
+      textBookInfo: {} as any, // 教材
+      repaireInfo: {} as any, // 乐器保养
+      vipInfo: {} as any, // 团练宝
+      depositInfo: {} as any, // 订金
+      paymentOrderDetails: [] as any, // 购买状态
+      orderInfo: {
+        needPrice: 0,
+        originalPrice: 0
+      },
+      memberBaoStatus: false, // 团练宝详情状态
+      goodsStatus: false, //
+      selectGoodsId: null as any,
+      currentPrice: 0,
+      selectGoodsInfo: {} as any,
+      dialogStatus: false,
+      dialogMessage: '',
+      dialogConfig: {} as any,
+
+      isDeposit: false, // 判断是否有订金
+      isVip: false // 是否有会员
+    })
+
+    // 获取支付渠道
+    const sysParamConfig = async () => {
+      try {
+        const { data } = await request.get('/api-student/sysParamConfig/queryByParamName', {
+          params: {
+            paramName: 'payment_service_provider'
+          }
+        })
+        state.paymentType = data.paramValue || ''
+      } catch {
+        //
+      }
+    }
+
+    // 查询未支付订单
+    const paymentOrderUnpaid = async () => {
+      try {
+        const { data } = await request.get('/api-student/userPaymentOrder/unpaid')
+        // 判断是否有待支付订单
+        if (data.id) {
+          state.dialogMessage = '您有待支付的订单,是否继续支付'
+          state.dialogStatus = true
+          state.dialogConfig = data
+        }
+      } catch {
+        //
+      }
+    }
+
+    // 获取商品信息
+    const registerGoods = async () => {
+      try {
+        const { data } = await request.get(
+          '/api-student/orchestraRegister/registerGoods/' + route.query.id
+        )
+
+        state.musicPaymentType = data.paymentServiceProvider || ''
+        // 获取已经购买商品信息
+        const paymentOrderDetails = data.paymentOrderDetails || []
+        paymentOrderDetails.forEach((item: any) => {
+          state.paymentOrderDetails.push(item.goodsType)
+        })
+        // 初始化数据商品数据
+        const details = data.details || []
+        details.forEach((item: any) => {
+          if (item.goodsType === 'INSTRUMENTS') {
+            const img = item.goodsUrl ? item.goodsUrl.split(',')[0] : ''
+            state.goodsInfo = { ...item, goodsUrl: img }
+          } else if (item.goodsType === 'TEXTBOOK') {
+            const img = item.goodsUrl ? item.goodsUrl.split(',')[0] : ''
+            state.textBookInfo = { ...item, goodsUrl: img }
+          } else if (item.goodsType === 'REPAIR') {
+            state.repaireInfo = { ...item }
+          } else if (item.goodsType === 'VIP') {
+            state.vipInfo = { ...item }
+            state.isVip = true
+          } else if (item.goodsType === 'DEPOSIT') {
+            // 判断是否有订金 - 如果有订金则不显示vip
+            state.isDeposit = true
+            // 查询是否有VIP的数据
+            const tempVipInfo = details.find((item: any) => item.goodsType === 'VIP')
+            if (tempVipInfo) {
+              item.originalPrice = tempVipInfo.currentPrice
+              state.depositInfo = { ...item }
+            }
+          }
+          state.details = details
+
+          // 只有教材默认选中 -
+          if (!state.paymentOrderDetails.includes(item.goodsType) && item.goodsType == 'TEXTBOOK') {
+            state.check.push(item.goodsId)
+          }
+        })
+
+        /**
+         * 1 - 检查是否有订金商品 有则VIP不显示
+         * 2 - 是否购买订金 如果购买VIP显示,扣减金额
+         * 3 -
+         */
+
+        calcPrice()
+      } catch {
+        //
+      }
+    }
+
+    const onSelect = (type: string) => {
+      state.checkboxRefs[type].toggle()
+      calcPrice()
+    }
+
+    // 初始化金额
+    const calcPrice = () => {
+      const details = state.details
+      const tempPrice = {
+        needPrice: 0, //需要支付金额
+        originalPrice: 0 // 原价
+      }
+      details.forEach((item: any) => {
+        // 是否选中
+        if (
+          state.check.includes(item.goodsId) &&
+          !state.paymentOrderDetails.includes(item.goodsType)
+        ) {
+          tempPrice.needPrice += parseFloat(item.currentPrice || 0)
+          tempPrice.originalPrice += parseFloat(item.originalPrice || 0)
+        }
+      })
+
+      state.orderInfo = tempPrice
+
+      initNumCountUp()
+    }
+    const countUpRef = reactive({
+      needPrice: null as any,
+      originalPrice: null as any
+    })
+    const initNumCountUp = () => {
+      nextTick(() => {
+        // 在读学员
+        if (countUpRef.needPrice) {
+          countUpRef.needPrice.update(state.orderInfo.needPrice)
+        } else {
+          countUpRef.needPrice = new CountUp('needPrice', state.orderInfo.needPrice, {
+            decimalPlaces: 2
+          })
+          if (!countUpRef.needPrice.error) {
+            countUpRef.needPrice.start()
+          } else {
+            console.error(countUpRef.needPrice.error)
+          }
+        }
+      })
+    }
+
+    // 购买
+    const onSubmit = async () => {
+      try {
+        // 判断订单号
+        if (state.check.length <= 0) {
+          showToast('请选择您要购买的商品')
+          return
+        }
+        // 重新计算金额
+        calcPrice()
+        const params: any = [] // 支付参数
+        const details = state.details
+
+        let checkInstruments = false // 是否选择了乐器
+        details.forEach((item: any) => {
+          // 是否选中 并且没有购买过
+          if (
+            state.check.includes(item.goodsId) &&
+            !state.paymentOrderDetails.includes(item.goodsType)
+          ) {
+            params.push({
+              goodsId: item.goodsId,
+              goodsNum: 1,
+              goodsType: item.goodsType,
+              paymentCashAmount: item.currentPrice, // 现金支付金额
+              paymentCouponAmount: 0 // 优惠券金额
+            })
+          }
+          // 判断是否是乐器
+          if (
+            item.goodsType === 'INSTRUMENTS' &&
+            state.check.includes(item.goodsId) &&
+            !state.paymentOrderDetails.includes(item.goodsType)
+          ) {
+            checkInstruments = false
+          }
+        })
+
+        // 为了处理,商品和乐器保养做关联
+        const repaire = state.repaireInfo
+        if (checkInstruments && repaire.goodsId) {
+          params.push({
+            goodsId: repaire.goodsId,
+            goodsNum: 1,
+            goodsType: repaire.goodsType,
+            paymentCashAmount: repaire.currentPrice, // 现金支付金额
+            paymentCouponAmount: 0 // 优惠券金额
+          })
+        }
+
+        // 创建订单
+        const { data } = await request.post('/api-student/userPaymentOrder/executeOrder', {
+          hideLoading: false,
+          data: {
+            paymentType: state.musicPaymentType || state.paymentType,
+            bizId: route.query.id, // 乐团编号
+            orderType: 'ORCHESTRA',
+            paymentCashAmount: state.orderInfo.needPrice || 0,
+            paymentCouponAmount: 0,
+            goodsInfos: params,
+            orderName: '乐团报名缴费',
+            orderDesc: '乐团报名缴费'
+          }
+        })
+
+        console.log(data)
+        router.push({
+          path: '/orderDetail',
+          query: {
+            pm: 1, // h5乐团报名
+            config: JSON.stringify({ ...data.paymentConfig, paymentType: data.paymentType }),
+            orderNo: data.orderNo
+          }
+        })
+      } catch (e: any) {
+        //
+        console.log(e)
+      }
+    }
+
+    onMounted(() => {
+      sysParamConfig()
+      // 查询未支付订单
+      registerGoods()
+      paymentOrderUnpaid()
+    })
+    return () => (
+      <>
+        <div class={styles.applyTitle}>报名须知</div>
+        <div class={[styles.paymentTips, styles.mlr13]}>
+          <p>
+            1、<span>乐团免费政策</span>:学生在团期间训练及教材免费政策(教材邮费需自理);
+          </p>
+          <p>
+            2、<span>入团必备工具</span>
+            :为了符合乐团学练同频的要求,学生在入团前需准备好乐团Ai训练工具和乐器两项工具;
+          </p>
+          <p>
+            3、<span>入团必备工具准备的原则</span>
+            :家长可自行准备(需按照乐团提供的参考参数准备),也可勾选下方项目技术方提供的乐团工具;
+          </p>
+          <p>
+            4、<span>温馨提示</span>
+            :自行准备的家长请在收到开团信息后再进行工具准备(避免出现时间浪费),在项目技术方购置的家长请放心提交(Ai学练工具将在首次训练时激活)
+          </p>
+        </div>
+        <CheckboxGroup
+          v-model={state.check}
+          style={{ paddingBottom: '20px' }}
+          onChange={() => {
+            calcPrice()
+          }}
+        >
+          {/* 判断是否买了乐器学习系统 */}
+          {!state.paymentOrderDetails.includes('VIP') && !state.isDeposit && (
+            <CellGroup
+              inset
+              class={[styles.mlr13, styles.sectionCell]}
+              onClick={() => onSelect(state.vipInfo.goodsId)}
+            >
+              <Cell border={false}>
+                {{
+                  icon: () => (
+                    <Checkbox
+                      name={state.vipInfo.goodsId}
+                      class={styles.checkbox}
+                      ref={(el: any) => (state.checkboxRefs[state.vipInfo.goodsId] = el)}
+                      onClick={(e: Event) => {
+                        e.stopPropagation()
+                      }}
+                      v-slots={{
+                        icon: (props: any) => (
+                          <Icon
+                            class={styles.iconChecked}
+                            name={props.checked ? radioCheck : radioDefault}
+                          />
+                        )
+                      }}
+                    />
+                  ),
+                  title: () => (
+                    <div class={styles.section}>
+                      <Image
+                        class={styles.img}
+                        src={state.vipInfo.goodsUrl}
+                        onClick={(e: any) => {
+                          e.stopPropagation()
+                          state.memberBaoStatus = true
+                        }}
+                      />
+                      <div class={styles.sectionContent}>
+                        <h2
+                          onClick={(e: any) => {
+                            e.stopPropagation()
+                            state.memberBaoStatus = true
+                          }}
+                        >
+                          {state.vipInfo.goodsName}
+                        </h2>
+                        <Tag
+                          color="linear-gradient(135deg, #FF8C4A 0%, #FF531C 100%)"
+                          textColor="#fff"
+                          class={styles.brandName}
+                        >
+                          6个月
+                        </Tag>
+                        <p class={[styles.model, 'van-multi-ellipsis--l2']}>
+                          {state.vipInfo.description}
+                        </p>
+                      </div>
+                    </div>
+                  )
+                }}
+              </Cell>
+              <Cell>
+                {{
+                  title: () => (
+                    <div class={styles.extra}>
+                      <div class={styles.sectionPrice}>
+                        <p class={styles.price}>
+                          团购价:
+                          <span class={styles.numFont}>
+                            <span class={styles.numPrefix}>¥</span>
+                            {moneyFormat(state.vipInfo.currentPrice)}
+                          </span>
+                        </p>
+                        <p class={styles.originPrice}>
+                          原价:
+                          <del class={styles.numFont}>
+                            ¥ {moneyFormat(state.vipInfo.originalPrice)}
+                          </del>
+                        </p>
+                      </div>
+                    </div>
+                  )
+                }}
+              </Cell>
+            </CellGroup>
+          )}
+
+          {/* 定金 */}
+          {!state.paymentOrderDetails.includes('DEPOSIT') && state.isVip && (
+            <CellGroup
+              inset
+              class={[styles.mlr13, styles.sectionCell]}
+              onClick={() => onSelect(state.depositInfo.goodsId)}
+            >
+              <Cell border={false}>
+                {{
+                  icon: () => (
+                    <Checkbox
+                      name={state.depositInfo.goodsId}
+                      class={styles.checkbox}
+                      ref={(el: any) => (state.checkboxRefs[state.depositInfo.goodsId] = el)}
+                      onClick={(e: Event) => {
+                        e.stopPropagation()
+                      }}
+                      v-slots={{
+                        icon: (props: any) => (
+                          <Icon
+                            class={styles.iconChecked}
+                            name={props.checked ? radioCheck : radioDefault}
+                          />
+                        )
+                      }}
+                    />
+                  ),
+                  title: () => (
+                    <div class={styles.section}>
+                      <Image
+                        class={styles.img}
+                        src={state.depositInfo.goodsUrl}
+                        onClick={(e: any) => {
+                          e.stopPropagation()
+                          state.memberBaoStatus = true
+                        }}
+                      />
+                      <div class={styles.sectionContent}>
+                        <h2
+                          onClick={(e: any) => {
+                            e.stopPropagation()
+                            state.memberBaoStatus = true
+                          }}
+                        >
+                          {state.depositInfo.goodsName}
+                        </h2>
+                        <Tag
+                          color="linear-gradient(135deg, #FF8C4A 0%, #FF531C 100%)"
+                          textColor="#fff"
+                          class={styles.brandName}
+                        >
+                          6个月
+                        </Tag>
+                        <p class={[styles.model, 'van-multi-ellipsis--l2']}>
+                          {state.depositInfo.description}
+                        </p>
+                      </div>
+                    </div>
+                  )
+                }}
+              </Cell>
+              <Cell>
+                {{
+                  title: () => (
+                    <div class={styles.extra}>
+                      <div class={styles.sectionPrice}>
+                        <p class={styles.price}>
+                          定金:
+                          <span class={styles.numFont}>
+                            <span class={styles.numPrefix}>¥</span>
+                            {moneyFormat(state.depositInfo.currentPrice)}
+                          </span>
+                        </p>
+                        <p class={styles.originPrice}>
+                          团购价:
+                          <span class={styles.numFont}>
+                            ¥ {moneyFormat(state.depositInfo.originalPrice)}
+                          </span>
+                        </p>
+                      </div>
+                    </div>
+                  )
+                }}
+              </Cell>
+            </CellGroup>
+          )}
+
+          {/* 判断是否已经购买乐器 */}
+          {!state.paymentOrderDetails.includes('INSTRUMENTS') && (
+            <CellGroup
+              inset
+              class={[styles.mlr13, styles.sectionCell]}
+              onClick={() => onSelect(state.goodsInfo.goodsId)}
+            >
+              <Cell border={false}>
+                {{
+                  icon: () => (
+                    <Checkbox
+                      name={state.goodsInfo.goodsId}
+                      class={styles.checkbox}
+                      ref={(el: any) => (state.checkboxRefs[state.goodsInfo.goodsId] = el)}
+                      onClick={(e: Event) => {
+                        e.stopPropagation()
+                      }}
+                      v-slots={{
+                        icon: (props: any) => (
+                          <Icon
+                            class={styles.iconChecked}
+                            name={props.checked ? radioCheck : radioDefault}
+                          />
+                        )
+                      }}
+                    />
+                  ),
+                  title: () => (
+                    <div class={styles.section}>
+                      <Image
+                        class={styles.img}
+                        src={state.goodsInfo.goodsUrl}
+                        onClick={(e: any) => {
+                          e.stopPropagation()
+                          state.selectGoodsId = state.goodsInfo.goodsId
+                          state.currentPrice = state.goodsInfo.currentPrice
+                          state.selectGoodsInfo = {
+                            showFree: true,
+                            originalPrice: state.repaireInfo.originalPrice
+                          }
+                          state.goodsStatus = true
+                        }}
+                      />
+                      <div class={styles.sectionContent}>
+                        <h2
+                          onClick={(e: any) => {
+                            e.stopPropagation()
+                            state.selectGoodsId = state.goodsInfo.goodsId
+                            state.currentPrice = state.goodsInfo.currentPrice
+                            state.goodsStatus = true
+                          }}
+                        >
+                          {state.goodsInfo.goodsName}
+                        </h2>
+                        <Tag
+                          color="linear-gradient(135deg, #FF8C4A 0%, #FF531C 100%)"
+                          textColor="#fff"
+                          class={styles.brandName}
+                        >
+                          {state.goodsInfo.brandName}
+                        </Tag>
+                        <p class={[styles.model, 'van-multi-ellipsis--l2']}>
+                          {state.goodsInfo.description}
+                        </p>
+                      </div>
+                    </div>
+                  )
+                }}
+              </Cell>
+              <Cell border={false}>
+                {{
+                  title: () => (
+                    <div class={styles.extra}>
+                      <div class={styles.sectionPrice}>
+                        <p class={styles.price}>
+                          团购价:
+                          <span class={styles.numFont}>
+                            <span class={styles.numPrefix}>¥ </span>
+                            {moneyFormat(state.goodsInfo.currentPrice)}
+                          </span>
+                        </p>
+                        <p class={styles.originPrice}>
+                          原价:
+                          <del class={styles.numFont}>
+                            ¥ {moneyFormat(state.goodsInfo.originalPrice)}
+                          </del>
+                        </p>
+                      </div>
+                    </div>
+                  )
+                }}
+              </Cell>
+              {/* <Cell center class={styles.gives}>
+                  {{
+                    title: () => (
+                      <div class={styles.sectionTips}>
+                        <Image src={iconGives} class={styles.iconGives} />
+                        赠价值{state.repaireInfo.originalPrice}元乐器维保服务一年
+                      </div>
+                    )
+                  }}
+                </Cell> */}
+            </CellGroup>
+          )}
+
+          {/* 判断是否已经购买教材 */}
+          {!state.paymentOrderDetails.includes('TEXTBOOK') && (
+            <CellGroup
+              inset
+              class={[styles.mlr13, styles.sectionCell]}
+              onClick={() => {
+                return
+                // onSelect(state.textBookInfo.goodsId)
+              }}
+            >
+              <Cell border={false}>
+                {{
+                  icon: () => (
+                    <Checkbox
+                      name={state.textBookInfo.goodsId}
+                      disabled
+                      class={styles.checkbox}
+                      ref={(el: any) => (state.checkboxRefs[state.textBookInfo.goodsId] = el)}
+                      onClick={(e: Event) => {
+                        e.stopPropagation()
+                      }}
+                      v-slots={{
+                        icon: (props: any) => (
+                          <Icon
+                            class={styles.iconChecked}
+                            name={props.checked ? radioCheck : radioDefault}
+                          />
+                        )
+                      }}
+                    />
+                  ),
+                  title: () => (
+                    <div class={styles.section}>
+                      <Image
+                        class={styles.img}
+                        src={state.textBookInfo.goodsUrl}
+                        onClick={(e: any) => {
+                          e.stopPropagation()
+                          state.selectGoodsId = state.textBookInfo.goodsId
+                          state.currentPrice = state.textBookInfo.currentPrice
+                          state.selectGoodsInfo = {}
+                          state.goodsStatus = true
+                        }}
+                      />
+                      <div class={styles.sectionContent}>
+                        <h2
+                          onClick={(e: any) => {
+                            e.stopPropagation()
+                            state.selectGoodsId = state.textBookInfo.goodsId
+                            state.currentPrice = state.textBookInfo.currentPrice
+                            state.selectGoodsInfo = {}
+                            state.goodsStatus = true
+                          }}
+                        >
+                          {state.textBookInfo.goodsName}
+                        </h2>
+                        <Tag
+                          color="linear-gradient(135deg, #FF8C4A 0%, #FF531C 100%)"
+                          textColor="#fff"
+                          class={styles.brandName}
+                        >
+                          {state.textBookInfo.brandName}
+                        </Tag>
+                        <p class={[styles.model, 'van-multi-ellipsis--l2']}>
+                          {state.textBookInfo.description}
+                        </p>
+                      </div>
+                    </div>
+                  )
+                }}
+              </Cell>
+              <Cell>
+                {{
+                  title: () => (
+                    <div class={styles.extra}>
+                      <div class={styles.sectionPrice}>
+                        <p class={styles.price}>
+                          团购价:
+                          <span
+                            class={[
+                              state.textBookInfo.currentPrice > 0 ? styles.numFont : styles.free
+                            ]}
+                          >
+                            {state.textBookInfo.currentPrice > 0 ? (
+                              <>
+                                <span class={styles.numPrefix}>¥ </span>
+                                {moneyFormat(state.textBookInfo.currentPrice)}
+                              </>
+                            ) : (
+                              '免费'
+                            )}
+                          </span>
+                        </p>
+                        <p class={styles.originPrice}>
+                          原价:
+                          <del class={styles.numFont}>
+                            ¥ {moneyFormat(state.textBookInfo.originalPrice)}
+                          </del>
+                        </p>
+                      </div>
+                    </div>
+                  )
+                }}
+              </Cell>
+            </CellGroup>
+          )}
+        </CheckboxGroup>
+        <OSticky position="bottom" background="white">
+          <div class={styles.paymentContainer}>
+            <div class={styles.payemntPrice}>
+              <p class={styles.needPrice}>
+                支付金额:
+                <span class={styles.numFont}>
+                  <span>¥ </span>
+                  <i style="font-style: normal" id="needPrice"></i>
+                </span>
+              </p>
+              <p class={styles.allPrice}>
+                <del class={styles.numFont}>
+                  总原价:¥ {moneyFormat(state.orderInfo.originalPrice)}
+                </del>
+              </p>
+            </div>
+            <div class={styles.paymentBtn}>
+              <Button
+                color="linear-gradient(135deg, #FF8C4A 0%, #FF531C 100%)"
+                round
+                onClick={onSubmit}
+              >
+                立即提交
+              </Button>
+            </div>
+          </div>
+        </OSticky>
+        <OPopup v-model:modelValue={state.memberBaoStatus} position="right">
+          <MemberBao />
+        </OPopup>
+        <OPopup v-model:modelValue={state.goodsStatus} position="right" destroy>
+          {state.goodsStatus && (
+            <GoodsDetail
+              id={state.selectGoodsId}
+              groupPrice={state.currentPrice}
+              goodsInfo={state.selectGoodsInfo}
+            />
+          )}
+        </OPopup>
+        <ODialog
+          title="提示"
+          v-model:show={state.dialogStatus}
+          message={state.dialogMessage}
+          confirmButtonText="继续支付"
+          cancelButtonText="取消订单"
+          showCancelButton
+          onConfirm={() => {
+            const paymentConfig = state.dialogConfig.paymentConfig
+            router.push({
+              path: '/orderDetail',
+              query: {
+                pm: 1, // h5乐团报名
+                config: JSON.stringify(paymentConfig.paymentConfig),
+                orderNo: paymentConfig.orderNo
+              }
+            })
+          }}
+          onCancel={async () => {
+            try {
+              await request.post(
+                '/api-student/userPaymentOrder/cancelPayment/' + state.dialogConfig.orderNo
+              )
+            } catch {
+              //
+            }
+          }}
+        />
+      </>
+    )
+  }
+})

+ 50 - 0
src/views/student-register/component/user-auth.module.less

@@ -0,0 +1,50 @@
+.userAuth {
+  min-height: 100vh;
+  background-color: #f6f8f9;
+  overflow: hidden;
+
+  .cellGroup {
+    margin: 12px 13px 24px;
+    border-radius: 12px;
+    overflow: hidden;
+  }
+  :global {
+    .van-cell {
+      flex-direction: column;
+      font-size: 16px;
+      padding: 18px 13px;
+    }
+
+    .van-field__label {
+      width: 100%;
+      margin-right: 0;
+      color: #333;
+      font-size: 16px;
+      font-weight: 500;
+    }
+
+    .van-cell--required::before {
+      left: 15px;
+    }
+
+    .van-field__body {
+      margin-top: 10px;
+    }
+
+    .van-form {
+      margin-top: 174px;
+      /* background: #F8F8F8; */
+      overflow: hidden;
+      /* margin: 290px 13px 14px; */
+    }
+
+    .van-tag + .van-tag {
+      margin-left: 8px;
+    }
+  }
+
+  .btnGroup {
+    padding: 0 14px;
+    padding-bottom: 15px;
+  }
+}

+ 96 - 0
src/views/student-register/component/user-auth.tsx

@@ -0,0 +1,96 @@
+import request from '@/helpers/request';
+import { state } from '@/state';
+import { Button, CellGroup, Field, Form } from 'vant';
+import { defineComponent } from 'vue';
+import styles from './user-auth.module.less';
+import OHeader from '@/components/m-header';
+
+export default defineComponent({
+  name: 'UserAuth',
+  props: {
+    onSuccess: {
+      // 实名成功
+      type: Function,
+      default: () => {}
+    },
+    hideHeader: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      form: {
+        realName: '',
+        idCardNo: ''
+      }
+    };
+  },
+  mounted() {
+    // 初始化数据
+    const users = state.user.data;
+    this.form.realName = users?.account.realName;
+    // this.form.idCardNo = users?.idCardNo
+  },
+  methods: {
+    async onSubmit() {
+      try {
+        const url = state.platformApi + '/sysAccount/realNameAuth';
+        await request.post(url, {
+          data: {
+            ...this.form,
+            contract: true,
+            save: true
+          }
+        });
+        // showToast('实名成功')
+        state.user.data.account.realName = this.form.realName;
+        state.user.data.account.idCardNo = this.form.idCardNo;
+        // setTimeout(() => {
+        // }, 500)
+        this.onSuccess();
+      } catch {
+        //
+      }
+    }
+  },
+  render() {
+    return (
+      <Form class={styles.userAuth} onSubmit={this.onSubmit}>
+        {!this.hideHeader && <OHeader title="实名认证" />}
+
+        <CellGroup inset class={styles.cellGroup}>
+          <Field
+            required
+            label="真实姓名"
+            v-model={this.form.realName}
+            rules={[{ required: true, message: '请填写真实姓名' }]}
+            name="realName"
+            placeholder="请填写真实姓名"
+            maxlength="50"></Field>
+
+          <Field
+            required
+            label="身份证号"
+            v-model={this.form.idCardNo}
+            maxlength={18}
+            rules={[
+              { required: true, message: '请输入身份证号' },
+              {
+                pattern:
+                  /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/,
+                message: '请输入正确的身份证号'
+              }
+            ]}
+            placeholder="请输入身份证号"></Field>
+        </CellGroup>
+
+        <div class={['btnGroup']}>
+          <Button block round type="primary" native-type="submit">
+            确定
+          </Button>
+        </div>
+      </Form>
+    );
+  }
+});

BIN
src/views/student-register/digital-tools/images/1.png


BIN
src/views/student-register/digital-tools/images/2.png


BIN
src/views/student-register/digital-tools/images/icon-video.png


BIN
src/views/student-register/digital-tools/images/points.png


BIN
src/views/student-register/digital-tools/images/tool-number.png


+ 73 - 0
src/views/student-register/digital-tools/index.module.less

@@ -0,0 +1,73 @@
+.digitalTools {
+  overflow: hidden;
+  background: #FFF4E2;
+}
+
+.toolsSection {
+  background: linear-gradient(180deg, #FFFFFF 0%, #FFD3A7 30%, #FFE9E2 100%);
+  box-shadow: 0px 1px 6px 0px #F0DAC8;
+  border-radius: 10px;
+  margin: 15px 12px 0;
+
+  h2 {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding-top: 18px;
+
+    .toolsNumber {
+      width: 162px;
+      height: 18px;
+    }
+
+    .points {
+      margin-right: 20px;
+      width: 25px;
+      height: 6px;
+    }
+  }
+
+  .videoContainer {
+    position: relative;
+    padding: 13px 13px 10px;
+
+    .videoBg {
+      width: 100%;
+      height: 182px;
+      object-fit: cover;
+    }
+
+    .iconVideo {
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      transform: translate(-50%, -50%);
+      width: 34px;
+      height: 34px;
+    }
+  }
+
+  .toolsDetail {
+    display: block;
+    padding: 0 13px 10px;
+    width: 100%;
+  }
+}
+
+.tool2 {
+  padding: 10px 6px 24px;
+  width: 100%;
+}
+
+
+.videoPopup {
+  width: 90%;
+  border-radius: 10px;
+  overflow: hidden;
+
+  :global {
+    .plyr--video {
+      height: 190px !important;
+    }
+  }
+}

+ 52 - 0
src/views/student-register/digital-tools/index.tsx

@@ -0,0 +1,52 @@
+import { defineComponent, reactive } from 'vue';
+import styles from './index.module.less';
+import toolsNumber from './images/tool-number.png';
+import points from './images/points.png';
+import iconVideo from './images/icon-video.png';
+import toolsDetail from './images/1.png';
+import tool2 from './images/2.png';
+import { Popup } from 'vant';
+import MVideo from '@/components/m-video';
+
+export default defineComponent({
+  name: 'digital-tools',
+  setup() {
+    const forms = reactive({
+      popupShow: false
+    });
+    return () => (
+      <div class={styles.digitalTools}>
+        <div class={styles.toolsSection}>
+          <h2>
+            <img src={toolsNumber} class={styles.toolsNumber} />
+            <img src={points} class={styles.points} />
+          </h2>
+
+          <div
+            class={styles.videoContainer}
+            onClick={() => (forms.popupShow = true)}>
+            <img
+              class={styles.videoBg}
+              src={
+                'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPnga968a076c918dd72face52be994721791980efe910664de989df26a14701e3cf'
+              }
+            />
+            <img src={iconVideo} class={styles.iconVideo} />
+          </div>
+
+          <img src={toolsDetail} class={styles.toolsDetail} />
+        </div>
+
+        <img src={tool2} class={styles.tool2} />
+
+        <Popup v-model:show={forms.popupShow} class={styles.videoPopup}>
+          {forms.popupShow && (
+            <MVideo
+              src={'https://daya.ks3-cn-beijing.ksyun.com/202105/SWmqmvW.mp4'}
+            />
+          )}
+        </Popup>
+      </div>
+    );
+  }
+});

BIN
src/views/student-register/images/buy-title.png


BIN
src/views/student-register/images/icon-address-border.png


BIN
src/views/student-register/images/icon-btn-right.png


BIN
src/views/student-register/images/icon-btn-video.png


BIN
src/views/student-register/images/icon-button-buy.png


BIN
src/views/student-register/images/icon-button-go.png


BIN
src/views/student-register/images/icon-checkbox-active.png


BIN
src/views/student-register/images/icon-checkbox-default.png


BIN
src/views/student-register/images/icon-delete-active.png


BIN
src/views/student-register/images/icon-edit.png


BIN
src/views/student-register/images/icon-gift.png


BIN
src/views/student-register/images/info-title.png


BIN
src/views/student-register/images/shop-empty.png


BIN
src/views/student-register/images/tool-title.png


+ 385 - 0
src/views/student-register/index.module.less

@@ -0,0 +1,385 @@
+.student-register {
+  min-height: 100vh;
+  background: #FFF4E2;
+  overflow: hidden;
+
+  --k-font-primary: #FF8021;
+}
+
+.studentSection {
+  position: relative;
+  z-index: 1;
+  margin: 12px;
+  overflow: inherit;
+
+  &::before {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    content: ' ';
+    background: linear-gradient(180deg, #FFFFFF 0%, #FFDAB4 53%, #FFFFFF 100%);
+    box-shadow: 0px 1px 6px 0px #F0DDC8;
+    border-radius: 18px;
+    height: 120px;
+    z-index: -1;
+  }
+
+  .goodsSection {
+    border-radius: 18px 18px;
+    box-shadow: 0px 1px 6px 0px #F0D8C8;
+    border-radius: 18px;
+    overflow: hidden;
+    background: transparent;
+    margin-bottom: 12px;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+}
+
+.titleTool {
+  position: relative;
+  z-index: 9;
+  margin: 14px auto 4px;
+  width: 314px;
+  height: 35px;
+  background: url('./images/tool-title.png') no-repeat center;
+  background-size: contain;
+}
+
+.titleBuy {
+  margin: 14px auto 4px;
+  width: 259px;
+  height: 35px;
+  background: url('./images/buy-title.png') no-repeat center;
+  background-size: contain;
+}
+
+.goodsCell {
+  position: relative;
+  border-radius: 18px 18px 0px 0px;
+  padding: 12px 14px 0;
+
+  .noSelected,
+  .selected,
+  .delete {
+    position: absolute;
+    top: 0;
+    right: 0;
+    width: 29px;
+    height: 23px;
+  }
+
+  .selected {
+    background: url('./images/icon-checkbox-active.png') no-repeat center;
+    background-size: contain;
+  }
+
+  .noSelected {
+    background: url('./images/icon-checkbox-default.png') no-repeat center;
+    background-size: contain;
+  }
+
+  .delete {
+    background: url('./images/icon-delete-active.png') no-repeat center;
+    background-size: contain;
+  }
+
+  .img {
+    margin-right: 16px;
+    width: 98px;
+    height: 98px;
+  }
+
+  h2 {
+    display: flex;
+    align-items: center;
+    font-size: 16px;
+    font-weight: 600;
+    color: #333333;
+    line-height: 22px;
+  }
+
+  .brandName {
+    margin-left: 4px;
+    font-size: 12px;
+    color: #BE7332;
+    line-height: 17px;
+    height: 18px;
+    background-color: #FFE9D9;
+    border-radius: 4px;
+    border: 1px solid #FFF8E9;
+  }
+
+  .model {
+    padding: 10px 0;
+    font-size: 13px;
+    color: #8C6142;
+    line-height: 18px;
+
+    span {
+      color: #FF5A56;
+      font-weight: bold;
+    }
+  }
+
+  .sbtnGroup {
+    display: flex;
+
+    &>span {
+      font-size: 12px;
+      font-weight: 600;
+      color: #AF540D;
+      line-height: 18px;
+      border-radius: 9px;
+      border: 1px solid rgba(175, 84, 13, .62);
+      padding: 0 6px;
+    }
+
+    .btnDetail,
+    .btnVideo {
+      display: flex;
+      align-items: center;
+
+      &:after {
+        content: ' ';
+        background: url('./images/icon-btn-right.png') no-repeat center;
+        width: 12px;
+        height: 12px;
+        background-size: contain;
+        margin-left: 6px;
+        display: inline-block;
+      }
+    }
+
+    .btnDetail {
+      margin-right: 6px;
+    }
+
+    .btnVideo:after {
+      content: ' ';
+      background: url('./images/icon-btn-video.png') no-repeat center;
+      background-size: contain;
+    }
+  }
+
+  :global {
+
+    .van-stepper__minus,
+    .van-stepper__plus,
+    .van-stepper__input {
+      background-color: #FFF4E7;
+    }
+
+    .van-stepper__minus,
+    .van-stepper__plus {
+      color: #BF7434;
+    }
+
+    .van-stepper__input {
+      color: #8C6142;
+    }
+
+    .van-stepper__minus {
+      border-radius: 100px 0px 0px 100px;
+    }
+
+    .van-stepper__plus {
+      border-radius: 0px 100px 100px 0px;
+    }
+  }
+}
+
+.priceCell {
+  padding: 16px 14px 10px;
+
+  .sPriceGroup {
+    display: flex;
+    align-items: center;
+    padding: 0 10px;
+    height: 34px;
+    background: #FFF1EC;
+    border-radius: 20px;
+
+    .tg {
+      font-size: 14px;
+      color: #333333;
+      line-height: 20px;
+
+      span {
+        font-size: 22px;
+        font-family: DINAlternate-Bold, DINAlternate;
+        font-weight: bold;
+        color: #FC1A19;
+
+        i {
+          font-style: normal;
+          font-size: 14px;
+        }
+      }
+
+    }
+
+    del {
+      padding-left: 10px;
+      font-size: 14px;
+      font-family: DINAlternate-Bold, DINAlternate;
+      font-weight: bold;
+      color: #8C6142;
+      line-height: 16px;
+    }
+  }
+}
+
+.giftCell {
+  padding: 0 19px;
+  background: linear-gradient(90deg, #FF8633 0%, #FFB047 100%);
+  border-radius: 0px 0px 18px 18px;
+
+  .gift {
+    display: flex;
+    align-items: center;
+    font-size: 12px;
+    font-weight: 600;
+    color: #FFFFFF;
+    height: 34px;
+
+    span {
+      font-size: 15px;
+      color: #FFFC89;
+      padding: 0 5px;
+    }
+  }
+
+  .iconGift {
+    margin-right: 4px;
+    width: 18px;
+    height: 18px;
+  }
+}
+
+.goodsEmpty {
+  padding: 0 7px;
+  height: 106px;
+  background: #FFFFFF;
+  box-shadow: 0px 1px 6px 0px #F0D8C8;
+  border-radius: 18px;
+  display: flex;
+  align-items: center;
+
+  .shopImg {
+    height: 106px;
+    width: 117px;
+  }
+
+  .goodsContainer {
+    h2 {
+      font-size: 16px;
+      color: #333333;
+      line-height: 22px;
+
+      span {
+        color: #FF5A56;
+      }
+    }
+
+    .tips {
+      font-size: 14px;
+      color: #BE7332;
+      line-height: 20px;
+    }
+
+    .goSelect {
+      margin-top: 5px;
+      width: 79px;
+      height: 29px;
+      background-color: transparent;
+      border: 0;
+      background: url('./images/icon-button-go.png') no-repeat center;
+      background-size: contain;
+    }
+  }
+}
+
+.addButton {
+  height: 42px;
+  background: linear-gradient(90deg, #FF8633 0%, #FFB047 100%);
+  border-radius: 22px;
+  margin: 0 12px 12px;
+  width: calc(100% - 24px);
+
+  :global {
+    .van-icon {
+      margin-right: 5px;
+      font-size: 20px;
+    }
+
+    .van-button__text {
+      font-size: 16px;
+      font-weight: 600;
+      color: #FFFFFF;
+      border: 0 solid;
+      display: flex;
+      align-items: center;
+    }
+  }
+}
+
+.paymentContainer {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 14px;
+  padding: 18px 12px calc(15px + env(safe-area-inset-bottom)) 12px;
+  background: #FFFFFF;
+  box-shadow: 0px 1px 6px 0px #F0D7C8, inset 0px 1px 3px 0px #FFFFFF;
+  border-radius: 18px 18px 0px 0px;
+
+  .needPrice {
+    color: #333333;
+    padding-bottom: 7px;
+    font-size: 18px;
+    font-family: DINAlternate-Bold, DINAlternate;
+    font-weight: bold;
+    color: #FC1A19;
+
+    span {
+      font-size: 28px;
+      margin-right: 2px;
+    }
+  }
+
+  .allPrice {
+    padding-left: 6px;
+    font-size: 14px;
+    font-family: DINAlternate-Bold, DINAlternate;
+    font-weight: bold;
+    color: #8C6142;
+    line-height: 16px;
+  }
+
+  :global {
+    .van-button {
+      height: 40px;
+      line-height: 40px;
+      width: 148px;
+      background: url('./images/icon-button-buy.png') no-repeat center;
+      background-size: contain;
+      border: 0;
+    }
+  }
+}
+
+.videoPopup {
+  width: 90%;
+  border-radius: 10px;
+  overflow: hidden;
+
+  :global {
+    .plyr--video {
+      height: 190px !important;
+    }
+  }
+}

+ 449 - 0
src/views/student-register/index.tsx

@@ -0,0 +1,449 @@
+import {
+  Image,
+  Cell,
+  CellGroup,
+  Tag,
+  Button,
+  Stepper,
+  Icon,
+  Popup,
+  showConfirmDialog,
+  showToast
+} from 'vant';
+import { computed, defineComponent, onMounted, reactive } from 'vue';
+import styles from './index.module.less';
+import iconGift from './images/icon-gift.png';
+import shopEmpty from './images/shop-empty.png';
+import MSticky from '@/components/m-sticky';
+import MVideo from '@/components/m-video';
+import { useRoute, useRouter } from 'vue-router';
+import RegisterModal from './register-modal';
+import { useStudentRegisterStore } from '@/store/modules/student-register-store';
+import request from '@/helpers/request';
+import { moneyFormat } from '@/helpers/utils';
+import deepClone from '@/helpers/deep-clone';
+import MDialog from '@/components/m-dialog';
+
+export default defineComponent({
+  name: 'student-register',
+  setup() {
+    const route = useRoute();
+    const studentRegisterStore = useStudentRegisterStore();
+    const router = useRouter();
+    const forms = reactive({
+      schoolId: route.query.sId as any,
+      popupShow: false,
+      popupRegister: false,
+      details: [] as any[],
+      schoolType: '', // 学校类型
+      gradeYear: '', // 学制
+      bugGoods: false, // 是否购买AI
+      submitLoading: false,
+      dialogStatus: false,
+      dialogMessage: '',
+      dialogConfig: {} as any
+    });
+
+    // 查询未支付订单
+    const paymentOrderUnpaid = async () => {
+      try {
+        const { data } = await request.get('/edu-app/userPaymentOrder/unpaid');
+        // 判断是否有待支付订单
+        if (data.id) {
+          forms.dialogMessage = '您有待支付的订单,是否继续支付';
+          forms.dialogStatus = true;
+          forms.dialogConfig = data;
+          console.log(data, 'data');
+        }
+      } catch {
+        //
+      }
+    };
+
+    const getRegisterGoods = async () => {
+      try {
+        const { data } = await request.get(
+          '/edu-app/open/userOrder/registerGoods/' + forms.schoolId
+        );
+
+        // 默认选中商品
+        studentRegisterStore.setVip(data.details || []);
+        forms.details = deepClone(data.details || []);
+
+        forms.bugGoods = data.bugGoods;
+        forms.schoolType = data.schoolType;
+        forms.gradeYear = data.gradeYear;
+      } catch {}
+    };
+
+    // 计算金额
+    const calcPrice = computed(() => {
+      let amount: number = 0; //现价
+      let originAmount: number = 0; // 原价
+      const vipList: any[] = studentRegisterStore.getVip;
+      vipList.forEach((vip: any) => {
+        amount += Number(vip.currentPrice);
+        originAmount += Number(vip.originalPrice);
+      });
+
+      const goodsList: any[] = studentRegisterStore.getGoods;
+      goodsList.forEach((good: any) => {
+        amount += Number(good.price) * good.count;
+        originAmount += Number(good.originalPrice) * good.count;
+      });
+      return {
+        amount,
+        originAmount
+      };
+    });
+
+    // 删除商品
+    const onGoodsRemove = (item: any) => {
+      showConfirmDialog({
+        title: '标题',
+        message: '是否删除该商品',
+        confirmButtonColor: '#FF8633'
+      }).then(() => {
+        // on confirm
+        studentRegisterStore.deleteGoods(item.goodsId);
+      });
+    };
+
+    // 注册成功之后购买
+    const onRegisterSubmit = async () => {
+      try {
+        forms.submitLoading = true;
+        await paymentOrderUnpaid();
+        if (forms.dialogStatus) {
+          forms.submitLoading = false;
+          return;
+        }
+        const schoolInfo = await request.get(
+          '/edu-app/userPaymentOrder/registerStatus/' + forms.schoolId
+        );
+        const vipList = studentRegisterStore.getVip;
+        const goodsList = studentRegisterStore.getGoods;
+
+        if (schoolInfo.data.hasBuyCourse && vipList.length > 0) {
+          showToast('您已购买数字化器乐学练工具,请勿重复购买');
+          return;
+        }
+
+        if (vipList.length <= 0 && goodsList.length <= 0) {
+          showToast('请选择需要购买的商品');
+          return;
+        }
+
+        const params: any[] = [];
+        vipList.forEach((vip: any) => {
+          params.push({
+            goodsId: vip.goodsId,
+            goodsNum: 1,
+            goodsType: vip.goodsType,
+            paymentCashAmount: vip.currentPrice, // 现金支付金额
+            paymentCouponAmount: 0 // 优惠券金额
+          });
+        });
+
+        goodsList.forEach((goods: any) => {
+          params.push({
+            goodsId: goods.id,
+            goodsNum: goods.count,
+            goodsType: 'INSTRUMENTS',
+            paymentCashAmount: goods.price, // 现金支付金额
+            paymentCouponAmount: 0 // 优惠券金额
+          });
+        });
+
+        // 创建订单
+        const { data } = await request.post(
+          '/edu-app/userPaymentOrder/executeOrder',
+          {
+            hideLoading: false,
+            data: {
+              paymentType: 'adapay',
+              bizId: forms.schoolId, // 乐团编号
+              orderType: 'SCHOOL_REGISTER',
+              paymentCashAmount: calcPrice.value.amount || 0,
+              paymentCouponAmount: 0,
+              goodsInfos: params,
+              orderName: '学生注册',
+              orderDesc: '学生注册'
+            }
+          }
+        );
+
+        router.push({
+          path: '/order-detail',
+          query: {
+            pm: 1, // h5乐团报名
+            config: JSON.stringify({
+              ...data.paymentConfig,
+              paymentType: data.paymentType
+            }),
+            orderNo: data.orderNo
+          }
+        });
+      } finally {
+        forms.submitLoading = false;
+      }
+    };
+
+    onMounted(() => {
+      getRegisterGoods();
+    });
+    return () => (
+      <div class={styles['student-register']}>
+        {forms.bugGoods && (
+          <div class={styles.studentSection} style={{ marginTop: '18px' }}>
+            <div class={styles.titleTool}></div>
+            {forms.details.map((item: any) => (
+              <CellGroup
+                class={styles.goodsSection}
+                onClick={() => {
+                  if (studentRegisterStore.selectedVip(item.goodsId)) {
+                    studentRegisterStore.deleteVip(item.goodsId);
+                  } else {
+                    studentRegisterStore.setVip([item]);
+                  }
+                }}>
+                <Cell border={false} class={styles.goodsCell}>
+                  {{
+                    icon: () => (
+                      <Image class={styles.img} src={item.goodsUrl} />
+                    ),
+                    title: () => (
+                      <div class={styles.section}>
+                        <div class={styles.sectionContent}>
+                          <h2>
+                            {item.goodsName}
+                            <Tag class={styles.brandName}>12个月</Tag>
+                          </h2>
+
+                          <p class={[styles.model]}>{item.description}</p>
+
+                          <div class={styles.sbtnGroup}>
+                            <span
+                              class={styles.btnDetail}
+                              onClick={(e: MouseEvent) => {
+                                e.stopPropagation();
+                                router.push('/student-digital-tools');
+                              }}>
+                              查看详情
+                            </span>
+                            <span
+                              class={styles.btnVideo}
+                              onClick={(e: MouseEvent) => {
+                                e.stopPropagation();
+                                forms.popupShow = true;
+                              }}>
+                              介绍视频
+                            </span>
+                          </div>
+                        </div>
+
+                        <i
+                          class={
+                            studentRegisterStore.selectedVip(item.goodsId)
+                              ? styles.selected
+                              : styles.noSelected
+                          }></i>
+                      </div>
+                    )
+                  }}
+                </Cell>
+                <Cell border={false} class={styles.priceCell}>
+                  {{
+                    title: () => (
+                      <div class={styles.sPriceGroup}>
+                        <div class={styles.tg}>
+                          团购价:
+                          <span>
+                            <i>¥ </i>
+                            {moneyFormat(item.currentPrice)}
+                          </span>
+                        </div>
+                        <del>¥{moneyFormat(item.originalPrice)}</del>
+                      </div>
+                    )
+                  }}
+                </Cell>
+                <Cell border={false} class={styles.giftCell}>
+                  {{
+                    title: () => (
+                      <div class={styles.gift}>
+                        <img src={iconGift} class={styles.iconGift} />
+                        现在购买赠送 <span>{item.membershipDays || 0}</span>
+                        天有效期
+                      </div>
+                    )
+                  }}
+                </Cell>
+              </CellGroup>
+            ))}
+          </div>
+        )}
+
+        <div class={styles.studentSection}>
+          <div class={styles.titleBuy}></div>
+          {studentRegisterStore.getGoods &&
+          studentRegisterStore.getGoods.length <= 0 ? (
+            <div class={styles.goodsEmpty}>
+              <img src={shopEmpty} class={styles.shopImg} />
+              <div class={styles.goodsContainer}>
+                <h2>
+                  为你的<span>音乐之旅</span>做好准备
+                </h2>
+                <p class={styles.tips}>快去选购乐器吧~</p>
+                <Button
+                  class={styles.goSelect}
+                  type="primary"
+                  onClick={() => {
+                    router.push('/goods-list');
+                  }}></Button>
+              </div>
+            </div>
+          ) : (
+            studentRegisterStore.getGoods.map((goods: any) => (
+              <CellGroup class={styles.goodsSection}>
+                <Cell border={false} class={styles.goodsCell}>
+                  {{
+                    icon: () => <Image class={styles.img} src={goods.pic} />,
+                    title: () => (
+                      <div class={styles.section}>
+                        <div class={styles.sectionContent}>
+                          <h2>
+                            {goods.name}
+                            <Tag class={styles.brandName}>
+                              {goods.brandName}
+                            </Tag>
+                          </h2>
+
+                          <p class={[styles.model]}>{goods.productSn}</p>
+
+                          <Stepper min={1} max={99} v-model={goods.count} />
+                        </div>
+
+                        <i
+                          class={styles.delete}
+                          onClick={() => onGoodsRemove(goods)}></i>
+                      </div>
+                    )
+                  }}
+                </Cell>
+                <Cell border={false} class={styles.priceCell}>
+                  {{
+                    title: () => (
+                      <div class={styles.sPriceGroup}>
+                        <div class={styles.tg}>
+                          团购价:
+                          <span>
+                            <i>¥ </i>
+                            {moneyFormat(goods.price)}
+                          </span>
+                        </div>
+                        <del>¥{moneyFormat(goods.originalPrice)}</del>
+                      </div>
+                    )
+                  }}
+                </Cell>
+              </CellGroup>
+            ))
+          )}
+        </div>
+        {studentRegisterStore.getGoods &&
+          studentRegisterStore.getGoods.length > 0 && (
+            <Button
+              class={styles.addButton}
+              block
+              onClick={() => {
+                router.push('/goods-list');
+              }}>
+              <Icon name="add-o" />
+              添加购买
+            </Button>
+          )}
+
+        <MSticky position="bottom">
+          <div class={styles.paymentContainer}>
+            <div class={styles.payemntPrice}>
+              <span class={styles.needPrice}>
+                <i style="font-style: normal">¥ </i>
+                <span>{moneyFormat(calcPrice.value.amount)}</span>
+              </span>
+              <del class={styles.allPrice}>
+                ¥ {moneyFormat(calcPrice.value.originAmount)}
+              </del>
+            </div>
+            <div
+              class={styles.paymentBtn}
+              onClick={() => {
+                if (!studentRegisterStore.getToken) {
+                  forms.popupRegister = true;
+                } else {
+                  onRegisterSubmit();
+                }
+                // router.push('/order-detail');
+              }}>
+              <Button
+                disabled={forms.submitLoading}
+                loading={forms.submitLoading}></Button>
+            </div>
+          </div>
+        </MSticky>
+
+        <Popup v-model:show={forms.popupShow} class={styles.videoPopup}>
+          {forms.popupShow && (
+            <MVideo
+              src={'https://daya.ks3-cn-beijing.ksyun.com/202105/SWmqmvW.mp4'}
+            />
+          )}
+        </Popup>
+
+        <Popup
+          v-model:show={forms.popupRegister}
+          class={styles.registerPopup}
+          position="bottom"
+          round>
+          <RegisterModal
+            schoolId={forms.schoolId}
+            schoolType={forms.schoolType}
+            gradeYear={forms.gradeYear}
+            onClose={() => (forms.popupRegister = false)}
+            onSubmit={onRegisterSubmit}
+          />
+        </Popup>
+
+        <MDialog
+          title="提示"
+          v-model:show={forms.dialogStatus}
+          message={forms.dialogMessage}
+          confirmButtonText="继续支付"
+          cancelButtonText="取消订单"
+          showCancelButton
+          onConfirm={() => {
+            const paymentConfig = forms.dialogConfig.paymentConfig;
+            router.push({
+              path: '/order-detail',
+              query: {
+                pm: 1, // h5乐团报名
+                config: JSON.stringify(paymentConfig.paymentConfig),
+                orderNo: paymentConfig.orderNo
+              }
+            });
+          }}
+          onCancel={async () => {
+            try {
+              await request.post(
+                '/edu-app/userPaymentOrder/cancelPayment/' +
+                  forms.dialogConfig.orderNo
+              );
+            } catch {
+              //
+            }
+          }}
+        />
+      </div>
+    );
+  }
+});

+ 311 - 0
src/views/student-register/order-detail.module.less

@@ -0,0 +1,311 @@
+.cartConfirm {
+  padding: 10px 14px;
+  padding-bottom: 100px;
+  :global {
+    .van-cell-group {
+      border-radius: 6px;
+      overflow: hidden;
+    }
+  }
+}
+
+.cartConfirmBox {
+  padding: 0;
+  margin-bottom: 12px;
+  border-radius: 10px;
+  overflow: hidden;
+  // border-bottom: 3px solid;
+  // border-image-source: url('./images/icon-address-border.png');
+  .cartItem {
+    margin: 0;
+    border-radius: 0;
+    padding: 0;
+  }
+  :global {
+    .van-cell__value {
+      color: #666;
+      font-weight: 500;
+    }
+  }
+}
+
+.mlr13 {
+  margin-right: 13px;
+  margin-left: 13px;
+}
+
+.protocol {
+  box-shadow: none !important;
+  padding: 8px 0 !important;
+  background: #ffebdd;
+  :global {
+    .van-checkbox__label {
+      color: #777;
+    }
+  }
+}
+
+.paymentContainer {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 14px;
+  padding-left: 12px;
+  padding-right: 12px;
+  padding-bottom: calc(20px + env(safe-area-inset-bottom));
+  box-shadow: none !important;
+  background: #fff;
+  padding-top: 12px;
+  .needPrice {
+    display: flex;
+    align-items: center;
+    color: #333333;
+    span {
+      font-size: 22px;
+      font-weight: bold;
+      color: #ff4e19;
+    }
+  }
+  .allPrice {
+    color: #aaa;
+  }
+
+  :global {
+    .van-button {
+      height: 40px;
+      line-height: 40px;
+      min-width: 112px;
+    }
+  }
+}
+
+.cellItem {
+  padding: 15px 12px;
+  border-radius: 10px;
+  overflow: hidden;
+  .img {
+    width: 70px;
+    height: 70px;
+    border-radius: 6px;
+    flex-shrink: 0;
+    overflow: hidden;
+    margin-right: 15px;
+  }
+
+  .cellPrice {
+    font-size: 20px;
+    font-weight: bold;
+    color: #333333;
+    line-height: 24px;
+  }
+
+  .numFont {
+    font-family: 'DINA';
+    .numPrefix {
+      font-size: 14px !important;
+      margin-right: 2px;
+    }
+  }
+
+  .goodsContent {
+    // h2 {
+    //   font-size: 16px;
+    //   font-weight: 500;
+    //   color: #333333;
+    //   line-height: 22px;
+    // }
+    .goodsNum {
+      font-size: 18px;
+      color: #777777;
+      line-height: 20px;
+      flex-shrink: 0;
+    }
+    .goodsPrice {
+      padding-top: 4px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      .free {
+        font-size: 14px;
+      }
+    }
+    .goodsNums {
+      font-size: 18px;
+      font-weight: bold;
+      color: #fc1a19;
+    }
+    h2 {
+      font-size: 16px;
+      font-weight: 500;
+      color: #333333;
+      line-height: 22px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+    }
+
+    .brandName {
+      line-height: 18px;
+      font-size: 12px;
+      padding: 0 6px;
+      border-radius: 4px;
+    }
+
+    .model {
+      padding-top: 3px;
+      font-size: 13px;
+      color: #777;
+      line-height: 18px;
+    }
+  }
+}
+
+.popupCode {
+  :global {
+    .van-popup__close-icon {
+      color: #fff;
+      right: 24px;
+    }
+  }
+}
+
+.codeContainer {
+  position: relative;
+  .codeClose {
+    display: inline-block;
+    position: absolute;
+    top: -55px;
+    right: 0;
+    background: url('./images/icon-close.png') no-repeat center center;
+    background-size: contain;
+    width: 35px;
+    height: 35px;
+  }
+
+  .codeImg {
+    width: 331px;
+    height: 557px;
+    // padding-left: 8px;
+    background: url('./images/download.png') no-repeat center center;
+    background-size: contain;
+    margin: 0 auto;
+
+    .codeTitle {
+      text-align: center;
+      padding-top: 13px;
+      font-size: 24px;
+      font-weight: bold;
+      color: #ffffff;
+      text-shadow: 1px 1px 7px #f4672a;
+    }
+
+    .codeName {
+      padding: 38px 12px 0;
+      font-size: 16px;
+      font-weight: 600;
+      color: #ffffff;
+      text-align: center;
+    }
+    .codeQr {
+      margin: 23px auto 0;
+      width: 221px;
+      height: 221px;
+      padding: 10px;
+      background: linear-gradient(180deg, #ffffff 0%, #ffffff 100%);
+      border-radius: 11px;
+      overflow: hidden;
+      img {
+        width: 100%;
+        height: 100%;
+      }
+    }
+
+    .codeBtnText {
+      min-width: 240px;
+      margin: 15px auto 0;
+      display: inline-block;
+      background: linear-gradient(135deg, #ff9c63 0%, #ff7144 100%);
+      border-radius: 18px;
+      padding: 6px 0;
+      font-size: 16px;
+      font-weight: 600;
+      color: #ffffff;
+    }
+
+    .codeTips {
+      width: 285px;
+      box-sizing: border-box;
+      font-size: 12px;
+      font-weight: 500;
+      color: #333333;
+      line-height: 17px;
+      background: #ffffff;
+
+      overflow: hidden;
+      border: 2px solid rgba(255, 140, 87, 1);
+      // border-image: linear-gradient(133deg, rgba(255, 140, 87, 1), rgba(255, 128, 87, 1)) 2 2;
+      border-radius: 10px;
+      margin: 15px auto 0;
+      padding: 10px 0px 10px 8px;
+
+      .tipsTitle {
+        font-size: 13px;
+        font-weight: 500;
+        color: #f16437;
+        padding-bottom: 2px;
+      }
+    }
+  }
+  .close {
+    position: absolute;
+    top: 12px;
+    right: 15px;
+  }
+  .codeBottom {
+    position: relative;
+    margin-top: 32px;
+    background: #ffffff;
+    border-radius: 20px 20px 0px 0px;
+    padding-bottom: 10px;
+  }
+  .title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #333333;
+    line-height: 22px;
+    padding: 15px 15px 0;
+    i {
+      display: inline-block;
+      margin-right: 6px;
+      width: 4px;
+      height: 12px;
+      background: #ff8057;
+      border-radius: 2px;
+    }
+  }
+  .shareImg {
+    width: 47px;
+    height: 47px;
+  }
+  .shareText {
+    padding-top: 6px;
+    font-size: 14px;
+    color: #333333;
+    line-height: 20px;
+  }
+}
+
+.freight {
+  margin-top: 12px;
+  background: #ffffff;
+  border-radius: 10px;
+  overflow: hidden;
+  padding: 15px 12px;
+  font-size: 16px;
+  color: #333;
+  :global {
+    .van-cell__value {
+      color: #ff4e19;
+    }
+  }
+}

+ 489 - 0
src/views/student-register/order-detail.tsx

@@ -0,0 +1,489 @@
+import OHeader from '@/components/m-header';
+import { computed, defineComponent, onMounted, reactive, ref } from 'vue';
+import styles from './order-detail.module.less';
+import Addres from './component/addres';
+import OSticky from '@/components/m-sticky';
+import { Button, Cell, CellGroup, Image, Popup, showToast, Tag } from 'vant';
+import Payment from '@/views/adapay/payment';
+import { useRoute, useRouter } from 'vue-router';
+import request from '@/helpers/request';
+import { state as baseState } from '@/state';
+import { browser, moneyFormat } from '@/helpers/utils';
+import OProtocol from '@/components/m-protocol';
+import OPopup from '@/components/m-popup';
+import UserAuth from './component/user-auth';
+import qs from 'query-string';
+import ODialog from '@/components/m-dialog';
+import { orderStatus } from '@/helpers/constant';
+import QrcodePayment from './qrcode-payment';
+import { beforeSubmit } from './order-state';
+
+/**
+ * 接入jsdk
+ * 乐团报名-原生js支付
+ * 会员购买-汇付
+ */
+
+export default defineComponent({
+  name: 'order-detail',
+  setup() {
+    const route = useRoute();
+    const router = useRouter();
+    const state = reactive({
+      paymentType: 'adapay' as 'wxpay' | 'adapay', // 支付方式
+      orderTimer: null as any,
+      paymentStatus: false,
+      showQrcode: false,
+      qrCodeUrl: '',
+      pay_channel: '',
+      orderNo: route.query.orderNo,
+      orderInfo: {} as any, // 订单信息
+      goodsInfos: [] as any, // 订单信息列表
+      config: route.query.config ? JSON.parse(route.query.config as any) : {},
+      hasFreight: route.query.hf ? false : true, // 是否显示
+      freight: '', // 运费
+      agreeStatus: true, //是否勾选协议
+      showHeader: false,
+      authShow: false, // 是否进行实名认证
+      selectGoodsId: null as any,
+      currentPrice: 0,
+      dialogStatus: false,
+      dialogMessage: '',
+      submitStatus: false
+    });
+
+    const orderType = computed(() => {
+      return state.orderInfo.orderType;
+    });
+
+    const addressDetails = ref<any>({});
+
+    const getOrderDetails = async () => {
+      try {
+        const { data } = await request.get(
+          '/edu-app/userPaymentOrder/detail/' + state.orderNo
+        );
+        const goodsInfos = data.goodsInfos || [];
+        state.orderInfo = data;
+        let hasInstrument = false; // 是否有乐器
+        let hasTextbook = false; // 是否购买教材
+        goodsInfos.forEach((item: any) => {
+          const img = item.goodsUrl ? item.goodsUrl.split(',')[0] : '';
+          item.goodsUrl = img;
+
+          if (item.goodsType === 'INSTRUMENTS') {
+            hasInstrument = true;
+          } else if (item.goodsType === 'TEXTBOOK') {
+            hasTextbook = true;
+          }
+        });
+        state.goodsInfos = goodsInfos;
+
+        if (!addressDetails.value.id) {
+          addressDetails.value = data.addresses || {};
+        }
+
+        // 判断运费状态
+        // 如果没有购买商品,有购买教材则『到付』 其它则免运费
+        console.log(hasInstrument, hasTextbook);
+        if (!hasInstrument && hasTextbook) {
+          state.freight = '到付';
+        } else {
+          state.freight = '免运费';
+        }
+
+        // 判断订单状态,如果不是待支付则返回
+        // WAIT_PAY: '待支付',
+        // PAYING: '支付中',
+        // PAID: '已付款',
+        // TIMEOUT: '订单超时',
+        // FAIL: '支付失败',
+        // CLOSED: '订单关闭',
+        // REFUNDING: '退款中',
+        // REFUNDED: '已退款'
+        if (data.status !== 'WAIT_PAY' && data.status !== 'PAYING') {
+          // status
+          state.dialogStatus = true;
+          state.dialogMessage = '订单' + orderStatus[data.status];
+        }
+      } catch {
+        //
+      }
+    };
+
+    const onConfirm = (val: any) => {
+      const config: any = state.config;
+      state.pay_channel = val.pay_channel;
+
+      const params = qs.stringify({
+        pay_channel: val.pay_channel,
+        wxAppId: config.wxAppId,
+        body: config.body,
+        price: config.price,
+        orderNo: config.merOrderNo,
+        userId: config.userId
+      });
+      if (val.payCode === 'payResult') {
+        window.location.href =
+          window.location.origin + '/classroom-app/#/payResult?' + params;
+      } else {
+        state.qrCodeUrl =
+          window.location.origin + '/classroom-app/#/payDefine?' + params;
+        state.showQrcode = true;
+        state.paymentStatus = false;
+
+        setTimeout(() => {
+          getPaymentOrderStatus();
+        }, 300);
+      }
+    };
+
+    // 轮询查询订单状态
+    const getPaymentOrderStatus = async () => {
+      // 循环查询订单
+      // const orderNo = state.orderNo
+      const orderTimer = setInterval(async () => {
+        // 判断是否在当前路由,如果不是则清除定时器
+        if (route.name != 'orderDetail') {
+          clearInterval(orderTimer);
+          return;
+        }
+        state.orderTimer = orderTimer;
+        try {
+          const { data } = await request.post(
+            '/api-student/open/userOrder/paymentStatus/' + state.orderNo,
+            {
+              hideLoading: true
+            }
+          );
+          // console.log(data)
+          if (data.status !== 'WAIT_PAY' && data.status !== 'PAYING') {
+            // 默认关闭支付二维码弹窗
+            state.showQrcode = false;
+            clearInterval(state.orderTimer);
+            // window.location.replace(
+            //   window.location.origin + '/#/payment-result?orderNo=' + state.orderNo
+            // )
+            setTimeout(() => {
+              checkOrderTypeJump();
+            }, 100);
+          }
+        } catch {
+          //
+          clearInterval(state.orderTimer);
+        }
+      }, 5000);
+    };
+
+    // 确定支付
+    const onSubmit = async () => {
+      clearInterval(state.orderTimer);
+      if (orderType.value === 'VIP') {
+        buyVip(onCallback);
+      } else {
+        buyOrchestra(onCallback);
+      }
+    };
+
+    /**
+     * @description 回调,判断是否有支付渠道,如果有则直接去支付
+     * @returns void
+     */
+    const onCallback = () => {
+      const pt = state.pay_channel;
+      // 判断是否有支付方式
+      if (pt) {
+        const payCode: string = beforeSubmit(state.pay_channel);
+        onConfirm({
+          payCode,
+          pay_channel: pt
+        });
+      } else {
+        if (orderType.value === 'VIP') {
+          state.paymentStatus = true;
+        } else {
+          // 直接去拉取微信支付
+          onConfirm({
+            payCode: 'payResult',
+            pay_channel: 'wx_pub'
+          });
+        }
+      }
+    };
+
+    /**
+     * @description 会员购买
+     * @param callback 回调方式
+     */
+    const buyVip = async (callback?: any) => {
+      try {
+        state.submitStatus = true;
+        const { data } = await request.get(
+          '/api-student/userPaymentOrder/detail/' + state.orderNo,
+          {
+            hideLoading: false
+          }
+        );
+        state.pay_channel = data.paymentChannel;
+        state.submitStatus = false;
+        if (data.status !== 'WAIT_PAY' && data.status !== 'PAYING') {
+          router.replace({
+            path: '/payment-result',
+            query: {
+              orderNo: state.orderNo
+            }
+          });
+        } else {
+          callback && callback();
+        }
+      } catch {
+        //
+        state.submitStatus = false;
+      }
+    };
+
+    /**
+     * @description 学生注册 - 汇付
+     * @param callback 回调方式
+     */
+    const buyOrchestra = async (callback: any) => {
+      // 请选择收货地址
+      if (!addressDetails.value.id) {
+        showToast('请选择收货地址');
+        return;
+      }
+
+      if (!state.agreeStatus) {
+        showToast('请先阅读并同意《管乐团平台服务协议》');
+        return;
+      }
+      const users = baseState.user.data;
+      // console.group(users)
+      // 判断是否需要实名认证, 姓名,卡号
+      // if (!users?.account.realName || !users?.account.idCardNo) {
+      //   state.authShow = true;
+      //   return;
+      // }
+
+      state.submitStatus = true;
+      try {
+        const { data } = await request.post(
+          '/edu-app/userPaymentOrder/updateReceiveAddress',
+          {
+            hideLoading: false,
+            data: {
+              orderNo: state.orderNo,
+              orderType: 'SCHOOL_REGISTER',
+              receiveAddress: addressDetails.value.id
+            }
+          }
+        );
+        // console.log(data)
+        state.pay_channel = data.paymentChannel;
+        if (data.status !== 'WAIT_PAY' && data.status !== 'PAYING') {
+          checkOrderTypeJump();
+        } else {
+          callback && callback();
+        }
+      } catch {
+        //
+      } finally {
+        state.submitStatus = false;
+      }
+    };
+
+    // 有支付结果后回调
+    const checkOrderTypeJump = () => {
+      // 判断是否是乐团报名
+      // if (orderType.value === 'SCHOOL_REGISTER') {
+      //   window.location.replace(
+      //     'https://mp.weixin.qq.com/s?__biz=MzkxMDMwOTI5Nw==&mid=2247485362&idx=3&sn=9b265d36b5dabe7f9393fc679c367540&chksm=c12c256cf65bac7ae2a865435b950f6e1285afd226356db0ffde815b1ee345f29cfcdb798cc9#rd'
+      //   );
+      // } else {
+      router.replace({
+        path: '/payment-result',
+        query: {
+          orderNo: state.orderNo
+        }
+      });
+      // }
+    };
+
+    // 放弃支付时,则取消订单
+    const onBackOut = async () => {
+      try {
+        await request.post(
+          '/edu-app/userPaymentOrder/cancelPayment/' + state.orderNo
+        );
+        router.back();
+      } catch {
+        //
+      }
+    };
+
+    // 实名认证成功
+    const onAuthSuccess = () => {
+      //
+      state.authShow = false;
+      onSubmit(); // 实名成功后自动支付
+    };
+
+    onMounted(() => {
+      if (browser().isApp) {
+        state.showHeader = true;
+      } else {
+        state.showHeader = false;
+      }
+
+      // 获取收货地址
+      let details = sessionStorage.getItem('addressDetails');
+      details = details ? JSON.parse(details) : {};
+      addressDetails.value = details;
+      sessionStorage.removeItem('addressDetails');
+
+      getOrderDetails();
+    });
+    return () => (
+      <>
+        {browser().isApp && <OHeader border={false} />}
+        <div class={styles.cartConfirm}>
+          {/* 只有乐团购买的时候显示收货地址 */}
+          {orderType.value === 'SCHOOL_REGISTER' && (
+            <div class={styles.cartConfirmBox}>
+              <Addres item={addressDetails.value} />
+            </div>
+          )}
+
+          <CellGroup style={{ margin: 0 }}>
+            {state.goodsInfos &&
+              state.goodsInfos.map((goods: any) => (
+                <Cell class={styles.cellItem}>
+                  {{
+                    icon: () => (
+                      <Image class={styles.img} src={goods.goodsUrl} />
+                    ),
+                    title: () => (
+                      <div class={styles.goodsContent}>
+                        <h2>
+                          <span>{goods.goodsName}</span>
+                          <span class={styles.goodsNum}>
+                            {goods.goodsType === 'VIP' ||
+                            goods.goodsType === 'DEPOSIT'
+                              ? '6个月'
+                              : 'x 1'}
+                          </span>
+                        </h2>
+                        <div class={styles.goodsPrice}>
+                          <Tag
+                            color="linear-gradient(135deg, #FF8C4A 0%, #FF531C 100%)"
+                            textColor="#fff"
+                            class={styles.brandName}>
+                            {goods.brandName}
+                          </Tag>
+                          <span
+                            class={[
+                              styles.goodsNums,
+                              goods.paymentCashAmount > 0
+                                ? styles.numFont
+                                : styles.free
+                            ]}>
+                            {goods.paymentCashAmount > 0 ? (
+                              <>
+                                <span class={styles.numPrefix}>¥ </span>
+                                {moneyFormat(goods.paymentCashAmount)}
+                              </>
+                            ) : (
+                              '免费'
+                            )}
+                          </span>
+                        </div>
+                        <p class={styles.model}>{goods.description}</p>
+                      </div>
+                    )
+                  }}
+                </Cell>
+              ))}
+          </CellGroup>
+
+          {orderType.value === 'SCHOOL_REGISTER' && (
+            <Cell
+              class={styles.freight}
+              title="运费"
+              value={state.freight}></Cell>
+          )}
+        </div>
+
+        <OSticky position="bottom">
+          <div class={styles.protocol}>
+            <OProtocol
+              v-model:modelValue={state.agreeStatus}
+              showHeader={state.showHeader}
+              style={{ paddingTop: 0, paddingBottom: 0 }}
+            />
+          </div>
+          <div class={styles.paymentContainer}>
+            <div class={styles.payemntPrice}>
+              <p class={styles.needPrice}>
+                支付金额:
+                <span>¥ {moneyFormat(state.orderInfo.currentPrice)}</span>
+              </p>
+            </div>
+            <div class={styles.paymentBtn}>
+              <Button
+                color="linear-gradient(135deg, #FF8C4A 0%, #FF531C 100%)"
+                round
+                onClick={onSubmit}
+                loading={state.submitStatus}
+                disabled={state.submitStatus}>
+                立即购买
+              </Button>
+            </div>
+          </div>
+        </OSticky>
+
+        <Popup
+          show={state.paymentStatus}
+          closeOnClickOverlay={false}
+          position="bottom"
+          round
+          closeOnPopstate
+          safeAreaInsetBottom
+          style={{ minHeight: '30%' }}>
+          <Payment
+            paymentConfig={state.orderInfo}
+            onClose={() => (state.paymentStatus = false)}
+            onBackOut={onBackOut}
+            onConfirm={(val: any) => onConfirm(val)}
+          />
+        </Popup>
+
+        <OPopup
+          v-model:modelValue={state.showQrcode}
+          onClose={() => {
+            // 二维码关闭时清除定时器
+            clearInterval(state.orderTimer);
+          }}>
+          <QrcodePayment
+            url={state.qrCodeUrl}
+            pay_channel={state.pay_channel}
+            orderType={orderType.value}
+          />
+        </OPopup>
+
+        <OPopup v-model:modelValue={state.authShow}>
+          <UserAuth onSuccess={onAuthSuccess} hideHeader={!browser().isApp} />
+        </OPopup>
+
+        <ODialog
+          title="提示"
+          v-model:show={state.dialogStatus}
+          message={state.dialogMessage}
+          confirmButtonText="确定"
+          onConfirm={() => {
+            checkOrderTypeJump();
+          }}
+        />
+      </>
+    );
+  }
+});

+ 32 - 0
src/views/student-register/order-state.ts

@@ -0,0 +1,32 @@
+/**
+ * @author wxl
+ * @description 处理基础支付功能
+ */
+
+import { browser } from '@/helpers/utils'
+
+// 判断浏览器与支付类型,返回对应页面名称
+export const beforeSubmit = (pt: string) => {
+  // const pt = state.pay_channel
+  let payCode = 'qrCode'
+  // 判断当前浏览器
+  if (browser().weixin) {
+    // 微信浏览器
+    if (pt == 'alipay_qr' || pt == 'alipay_wap') {
+      payCode = 'qrCode'
+    } else if (pt == 'wx_pub') {
+      payCode = 'pay'
+    }
+  } else if (browser().alipay) {
+    // 支付宝浏览器
+    if (pt == 'alipay_wap') {
+      // 支付宝 H5 支付
+      payCode = 'pay'
+    } else {
+      payCode = 'qrCode'
+    }
+  } else {
+    payCode = 'qrCode'
+  }
+  return payCode == 'qrCode' ? 'payDefine' : 'payResult'
+}

+ 155 - 0
src/views/student-register/qrcode-payment/index.module.less

@@ -0,0 +1,155 @@
+.saveShareImage {
+  position: relative;
+  min-height: 100vh;
+  overflow: hidden;
+
+  &::before {
+    content: ' ';
+    background: linear-gradient(134deg, #ff906c 0%, #ff602d 100%);
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    z-index: -1;
+  }
+}
+
+.btnHeader {
+  display: flex;
+  align-items: center;
+  height: var(--van-nav-bar-height);
+
+  .iconBack {
+    position: relative;
+    padding-left: var(--van-padding-md);
+    font-size: 20px;
+    color: #fff;
+    z-index: 9;
+  }
+}
+
+.previewSection {
+  z-index: -1;
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+}
+
+.topImage {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  top: var(--header-height);
+}
+
+.shareContaienr {
+  position: relative;
+  margin: 212px 22px 0;
+  padding-top: 50px;
+  padding-bottom: 23px;
+  background: #ffffff;
+  border-radius: 18px;
+  text-align: center;
+
+  &.orchestraContainer {
+    margin-top: 168px;
+    padding-top: 20px;
+
+    .schoolName {
+      font-size: 20px;
+      font-weight: 500;
+      color: #f67146;
+      line-height: 28px;
+    }
+  }
+
+  &.tips {
+    margin-top: 15px;
+    margin-bottom: 12px;
+    padding: 12px 22px 15px;
+    text-align: left;
+
+    .tipsTitle {
+      font-size: 15px;
+      font-weight: 500;
+      color: #f16437;
+      line-height: 21px;
+    }
+
+    .tipsContent {
+      padding-top: 7px;
+      font-size: 13px;
+      color: #333333;
+      line-height: 20px;
+    }
+  }
+
+  .schoolLogo {
+    position: absolute;
+    left: 50%;
+    top: 0;
+    // transform: translate(-50%, -50%);
+    margin-top: -38px;
+    margin-left: -38px;
+    width: 76px;
+    height: 76px;
+    border-radius: 50%;
+    overflow: hidden;
+    border: 3px solid #fff;
+    background-color: #fff;
+  }
+
+  .schoolName {
+    font-size: 17px;
+    font-weight: 500;
+    color: #000000;
+    line-height: 24px;
+    padding: 0 30px 0;
+  }
+
+  .shareType {
+    font-size: 15px;
+    padding: 8px 0 20px;
+    color: #000000;
+    line-height: 21px;
+
+    span {
+      color: #f67146;
+    }
+  }
+
+  .qrcodeSection {
+    width: 150px;
+    height: 150px;
+    background: url('@/school/save-share-image/images/icon-qrcode-bg.png') no-repeat center center;
+    background-size: contain;
+    margin: 0 auto;
+    padding: 14px;
+  }
+
+  .memo {
+    display: inline-block;
+    margin: 17px 0 11px;
+    background: linear-gradient(135deg, #ff9c63 0%, #ff7144 100%);
+    border-radius: 18px;
+    font-size: 16px;
+    font-family: PingFangSC-Medium, PingFang SC;
+    font-weight: 500;
+    color: #ffffff;
+    line-height: 22px;
+    padding: 6px 16px;
+  }
+
+  .endTime {
+    font-size: 13px;
+    color: #666666;
+    line-height: 18px;
+
+    span {
+      color: #ff8057;
+    }
+  }
+}

+ 82 - 0
src/views/student-register/qrcode-payment/index.tsx

@@ -0,0 +1,82 @@
+import { defineComponent, reactive } from 'vue';
+import { Icon, Image } from 'vant';
+import styles from './index.module.less';
+import orchestraTopBg from '@/school/save-share-image/images/orchestra-top_bg.png';
+import OQrcode from '@/components/m-qrcode';
+import { browser } from '@/helpers/utils';
+import { useRouter } from 'vue-router';
+import OHeader from '@/components/m-header';
+import OSticky from '@/components/m-sticky';
+import { postMessage } from '@/helpers/native-message';
+
+export default defineComponent({
+  name: 'qrcode-payment',
+  props: {
+    url: {
+      type: String,
+      default: ''
+    },
+    pay_channel: {
+      type: String,
+      default: 'wx_pub'
+    },
+    orderType: {
+      type: String,
+      default: ''
+    }
+  },
+  setup(props) {
+    const router = useRouter();
+    const state = reactive({
+      height: 0
+    });
+    const onBack = () => {
+      if (browser().isApp) {
+        postMessage({ api: 'goBack' });
+      } else {
+        router.back();
+      }
+    };
+    return () => (
+      <div class={[styles.saveShareImage]}>
+        {browser().isApp && (
+          <OSticky position="top">
+            <OHeader
+              title={props.orderType === 'VIP' ? '会员购买' : '报名缴费'}
+            />
+          </OSticky>
+        )}
+
+        <Image src={orchestraTopBg} class={styles.topImage} />
+        <div class={[styles.shareContaienr, styles.orchestraContainer]}>
+          <div class={styles.schoolName}>
+            {props.orderType === 'VIP' ? '会员购买' : '报名缴费'}
+          </div>
+          <div class={styles.shareType}>
+            请截图下方二维码
+            <span>
+              登录{props.pay_channel === 'wx_pub' ? '微信' : '支付宝'}扫码支付
+            </span>
+          </div>
+
+          <div class={styles.qrcodeSection}>
+            <OQrcode text={props.url} logoSize={'small'} size={'100%'} />
+          </div>
+
+          <div class={styles.memo}>请在30分钟内扫码支付</div>
+        </div>
+
+        <div class={[styles.shareContaienr, styles.tips]}>
+          <div class={styles.tipsTitle}>使用说明:</div>
+          <div class={styles.tipsContent}>
+            1.打开{props.pay_channel === 'wx_pub' ? '微信' : '支付宝'}扫一扫
+            <br />
+            2.选择相册中的二维码
+            <br />
+            3.请在30分钟内扫码支付
+          </div>
+        </div>
+      </div>
+    );
+  }
+});

+ 52 - 0
src/views/student-register/register-modal/index.module.less

@@ -0,0 +1,52 @@
+.registerModal {
+  background: linear-gradient(180deg, #FFFFFF 0%, #FFDAB4 15%, #FFFFFF 100%);
+  box-shadow: 0px 1px 6px 0px #DCC8F0;
+  border-radius: 18px 18px 0px 0px;
+  overflow: hidden;
+}
+
+.infoTitle {
+  width: 315px;
+  height: 31px;
+  display: block;
+  margin: 14px auto 10px;
+}
+
+.registerForm {
+  background: #FFFFFF;
+  box-shadow: 0px 1px 6px 0px #F0D8C8;
+  border-radius: 18px;
+  margin: 0 12px;
+  overflow: hidden;
+
+  :global {
+    .van-cell {
+      padding: 13px 16px;
+    }
+
+    .van-field__label {
+      font-size: 16px;
+      font-weight: 600;
+      color: #5B2C03;
+      line-height: 22px;
+      margin-bottom: 10px;
+    }
+  }
+
+  .codeText {
+    color: #DE801E;
+    font-size: 14px;
+    font-weight: 600;
+  }
+}
+
+.submitBtn {
+  margin: 0px 12px 22px;
+  width: calc(100% - 24px);
+  height: 46px;
+  border-radius: 12px;
+  font-size: 16px;
+  font-weight: 600;
+  color: #5B2C03 !important;
+  line-height: 22px;
+}

+ 314 - 0
src/views/student-register/register-modal/index.tsx

@@ -0,0 +1,314 @@
+import { computed, defineComponent, nextTick, reactive, ref } from 'vue';
+import styles from './index.module.less';
+import infoTitle from '../images/info-title.png';
+import { Button, CountDown, Field, Form, Picker, Popup, showToast } from 'vant';
+import MProtocol from '@/components/m-protocol';
+import MImgCode from '@/components/m-img-code';
+import { checkPhone } from '@/helpers/utils';
+import request from '@/helpers/request';
+import { useStudentRegisterStore } from '@/store/modules/student-register-store';
+const studentRegisterStore = useStudentRegisterStore();
+const classList: any = [];
+for (let i = 1; i <= 40; i++) {
+  classList.push({ text: i + '班', value: i });
+}
+
+export default defineComponent({
+  name: 'register-modal',
+  props: {
+    schoolId: {
+      type: String,
+      default: ''
+    },
+    gradeYear: {
+      type: String,
+      default: ''
+    },
+    schoolType: {
+      type: String,
+      default: ''
+    }
+  },
+  emits: ['close', 'submit'],
+  setup(props, { emit }) {
+    const countDownRef = ref();
+    const gradeList = computed(() => {
+      let tempList: any = [];
+      const five = [
+        { text: '一年级', value: 1 },
+        { text: '二年级', value: 2 },
+        { text: '三年级', value: 3 },
+        { text: '四年级', value: 4 },
+        { text: '五年级', value: 5 }
+      ];
+      const one = [{ text: '六年级', value: 6 }];
+      const three = [
+        { text: '七年级', value: 7 },
+        { text: '八年级', value: 8 },
+        { text: '九年级', value: 9 }
+      ];
+      // THREE_YEAR_SYSTEM: '三年制',
+      // FORE_YEAR_SYSTEM: '四年制',
+      // FIVE_YEAR_SYSTEM: '五年制',
+      // SIX_YEAR_SYSTEM: '六年制',
+      // NINE_YEAR_SYSTEM: '九年制'
+
+      // if (props.schoolType === 'PRIMARY') {
+      //   if (props.gradeYear === 'FIVE_YEAR_SYSTEM') {
+      //     tempList.push([...five]);
+      //   } else if (props.gradeYear === 'SIX_YEAR_SYSTEM') {
+      //     tempList.push([...five, ...one]);
+      //   }
+      // } else if (props.schoolType === 'JUNIOR') {
+      //   if (props.gradeYear === 'THREE_YEAR_SYSTEM') {
+      //     tempList.push([...three]);
+      //   } else if (props.gradeYear === 'FORE_YEAR_SYSTEM') {
+      //     tempList.push([...one, ...three]);
+      //   }
+      // } else if (props.schoolType === 'PRIMARY_JUNIOR') {
+      //   tempList.push([...five, ...one, ...three]);
+      // }
+      if (props.gradeYear === 'FIVE_YEAR_SYSTEM') {
+        tempList.push([...five]);
+      } else if (props.gradeYear === 'SIX_YEAR_SYSTEM') {
+        tempList.push([...five, ...one]);
+      } else if (props.gradeYear === 'THREE_YEAR_SYSTEM') {
+        tempList.push([...three]);
+      } else if (props.gradeYear === 'FORE_YEAR_SYSTEM') {
+        tempList.push([...one, ...three]);
+      } else {
+        tempList.push([...five, ...one, ...three]);
+      }
+      console.log(tempList, props.schoolType, props.gradeYear);
+      return tempList;
+    });
+    const forms = reactive({
+      countDownStatus: true,
+      countDownTime: 1000 * 120, // 倒计时时间
+      modelValue: false, // 是否选中协议
+      imgCodeStatus: false,
+      gradeNumText: '',
+      currentClassText: '',
+      gradeStatus: false,
+      classStatus: false,
+      loading: false
+    });
+    const studentInfo = reactive({
+      autoRegister: true,
+      client_id: 'cooleshow-student',
+      client_secret: 'cooleshow-student',
+      extra: {
+        nickname: '',
+        currentGradeNum: '',
+        currentClass: ''
+      },
+      grant_type: 'password',
+      loginType: 'SMS',
+      password: '',
+      username: ''
+    });
+
+    const onCodeSend = () => {
+      forms.countDownStatus = false;
+      nextTick(() => {
+        countDownRef.value.start();
+      });
+    };
+
+    const onSendCode = () => {
+      // 发送验证码
+      if (!checkPhone(studentInfo.username)) {
+        return showToast('请输入正确的手机号码');
+      }
+      forms.imgCodeStatus = true;
+    };
+
+    const onFinished = () => {
+      forms.countDownStatus = true;
+      countDownRef.value.reset();
+    };
+
+    const onSubmit = async () => {
+      try {
+        if (checkForm()) return;
+        forms.loading = true;
+        const { extra, ...res } = studentInfo;
+        const { data } = await request.post('/edu-oauth/userlogin', {
+          hideLoading: false,
+          requestType: 'form',
+          data: {
+            ...res,
+            extra: JSON.stringify({ ...extra, schoolId: props.schoolId })
+          }
+        });
+
+        studentRegisterStore.setToken(
+          data.token_type + ' ' + data.access_token
+        );
+
+        emit('close');
+        emit('submit');
+      } catch {
+      } finally {
+        forms.loading = false;
+      }
+    };
+
+    const checkForm = () => {
+      if (!checkPhone(studentInfo.username)) {
+        showToast('请输入正确的手机号码');
+        return true;
+      } else if (!studentInfo.password) {
+        showToast('请输入验证码');
+        return true;
+      } else if (!studentInfo.extra.nickname) {
+        showToast('请输入学生姓名');
+        return true;
+      } else if (!studentInfo.extra.currentGradeNum) {
+        showToast('请选择所在年级');
+        return true;
+      } else if (!studentInfo.password) {
+        showToast('请选择所在班级');
+        return true;
+      }
+      return false;
+    };
+
+    return () => (
+      <div class={styles.registerModal}>
+        <img src={infoTitle} class={styles.infoTitle} />
+
+        <Form labelAlign="top" class={styles.registerForm}>
+          <Field
+            clearable
+            label="联系方式(直接监护人)"
+            placeholder="请输入手机号码"
+            type="tel"
+            autocomplete="off"
+            v-model={studentInfo.username}
+            maxlength={11}
+          />
+          <Field
+            center
+            clearable
+            label="验证码"
+            placeholder="请输入验证码"
+            autocomplete="off"
+            type="number"
+            v-model={studentInfo.password}
+            maxlength={6}>
+            {{
+              button: () =>
+                forms.countDownStatus ? (
+                  <span class={styles.codeText} onClick={onSendCode}>
+                    获取验证码
+                  </span>
+                ) : (
+                  <CountDown
+                    ref={(el: any) => (countDownRef.value = el)}
+                    auto-start={false}
+                    time={forms.countDownTime}
+                    onFinish={onFinished}
+                    format="ss秒"
+                  />
+                )
+            }}
+          </Field>
+          <Field
+            clearable
+            label="学生姓名"
+            placeholder="请输入学生姓名"
+            autocomplete="off"
+            v-model={studentInfo.extra.nickname}
+          />
+          <Field
+            clearable
+            label="所在年级"
+            placeholder="请选择年级"
+            isLink
+            readonly
+            clickable={false}
+            modelValue={forms.gradeNumText}
+            onClick={() => (forms.gradeStatus = true)}
+          />
+          <Field
+            clearable
+            label="所在班级"
+            placeholder="请选择班级"
+            isLink
+            readonly
+            clickable={false}
+            modelValue={forms.currentClassText}
+            onClick={() => (forms.classStatus = true)}
+          />
+        </Form>
+        <MProtocol
+          center
+          v-model:modelValue={forms.modelValue}
+          prototcolType="REGISTER"
+        />
+
+        <Button
+          type="primary"
+          class={styles.submitBtn}
+          color="linear-gradient(121deg, #FFD892 0%, #FFCB75 100%)"
+          block
+          onClick={onSubmit}
+          disabled={forms.loading}
+          loading={forms.loading}>
+          确认
+        </Button>
+
+        {forms.imgCodeStatus ? (
+          <MImgCode
+            v-model:value={forms.imgCodeStatus}
+            phone={studentInfo.username}
+            onClose={() => {
+              forms.imgCodeStatus = false;
+            }}
+            onSendCode={onCodeSend}
+          />
+        ) : null}
+
+        {/* 年级 */}
+        <Popup
+          v-model:show={forms.gradeStatus}
+          position="bottom"
+          round
+          safeAreaInsetBottom
+          lazyRender={false}
+          class={'popupBottomSearch'}>
+          <Picker
+            showToolbar
+            columns={gradeList.value as any}
+            onCancel={() => (forms.gradeStatus = false)}
+            onConfirm={(val: any) => {
+              const selectedOption = val.selectedOptions[0];
+              studentInfo.extra.currentGradeNum = selectedOption.value;
+              forms.gradeNumText = selectedOption.text;
+              forms.gradeStatus = false;
+            }}
+          />
+        </Popup>
+        {/* 班级 */}
+        <Popup
+          v-model:show={forms.classStatus}
+          position="bottom"
+          round
+          class={'popupBottomSearch'}>
+          <Picker
+            showToolbar
+            columns={classList}
+            onCancel={() => (forms.classStatus = false)}
+            onConfirm={(val: any) => {
+              const selectedOption = val.selectedOptions[0];
+              studentInfo.extra.currentClass = selectedOption.value;
+              forms.currentClassText = selectedOption.text;
+              forms.classStatus = false;
+            }}
+          />
+        </Popup>
+      </div>
+    );
+  }
+});

+ 238 - 0
src/views/student-register/shop-address/address-operation.tsx

@@ -0,0 +1,238 @@
+import OSticky from '@/components/m-sticky';
+import {
+  Button,
+  Cell,
+  CellGroup,
+  Field,
+  Picker,
+  Popup,
+  showToast,
+  Switch
+} from 'vant';
+import { defineComponent, onMounted, reactive } from 'vue';
+import styles from './index.module.less';
+import { areas } from '@/helpers/area';
+import { verifiyNumberInteger } from '@/helpers/toolsValidate';
+import { useRoute, useRouter } from 'vue-router';
+import request from '@/helpers/request';
+
+export default defineComponent({
+  name: 'address-operation',
+  setup() {
+    const route = useRoute();
+    const router = useRouter();
+    const state = reactive({
+      isClick: false,
+      showPicker: false,
+      defaultStatus: false,
+      phoneNumber: null,
+      province: null,
+      city: null,
+      region: null,
+      pcrStr: '',
+      name: null,
+      detailAddress: null
+    });
+
+    const onFormatterInt = (val: any) => {
+      if (val && val >= 1) {
+        return verifiyNumberInteger(val);
+      } else {
+        return '';
+      }
+    };
+
+    const onSubmit = async () => {
+      try {
+        if (!state.name) {
+          showToast('请选择收货人');
+          return;
+        }
+        if (
+          !state.phoneNumber ||
+          !/^((13[0-9])|(14(0|[5-7]|9))|(15([0-3]|[5-9]))|(16(2|[5-7]))|(17[0-8])|(18[0-9])|(19([0-3]|[5-9])))\d{8}$/.test(
+            state.phoneNumber as any
+          )
+        ) {
+          showToast('手机号输入有误');
+          return;
+        }
+        if (!state.pcrStr) {
+          showToast('请选择所在地区');
+          return;
+        }
+        if (!state.detailAddress) {
+          showToast('请输入详细地址');
+          return;
+        }
+        state.isClick = true;
+        const params: any = {
+          name: state.name,
+          phoneNumber: state.phoneNumber,
+          province: state.province,
+          city: state.city,
+          region: state.region,
+          detailAddress: state.detailAddress,
+          defaultStatus: state.defaultStatus
+        };
+        if (route.query.id) {
+          await request.post('/edu-app/userReceiveAddress/update', {
+            hideLoading: false,
+            data: {
+              id: route.query.id,
+              ...params
+            }
+          });
+        } else {
+          await request.post('/edu-app/userReceiveAddress/save', {
+            hideLoading: false,
+            data: {
+              ...params
+            }
+          });
+        }
+
+        state.isClick = false;
+        router.back();
+      } catch (e: any) {
+        //
+        state.isClick = false;
+      }
+    };
+
+    const getDetails = async () => {
+      try {
+        const { data } = await request.get(
+          '/edu-app/userReceiveAddress/detail/' + route.query.id
+        );
+
+        state.name = data.name;
+        state.phoneNumber = data.phoneNumber;
+        state.province = data.province;
+        state.city = data.city;
+        state.region = data.region ? data.region : '';
+        state.pcrStr =
+          (data.provinceName || '') +
+          (data.cityName || '') +
+          (data.regionName || '');
+        state.detailAddress = data.detailAddress;
+        state.defaultStatus = data.defaultStatus;
+      } catch {
+        //
+      }
+    };
+    onMounted(() => {
+      // 判断是否有编号,有则为修改
+      if (route.query.id) {
+        getDetails();
+      }
+    });
+    return () => (
+      <div class={styles.operation}>
+        <CellGroup inset class={styles.form}>
+          <Field
+            label="收货人"
+            placeholder="请输入收货人姓名"
+            v-model={state.name}
+            autocomplete="off"
+          />
+          <Field
+            label="手机号"
+            placeholder="请输入收货人手机号"
+            v-model={state.phoneNumber}
+            maxlength={11}
+            type="tel"
+            autocomplete="off"
+            formatter={onFormatterInt}
+          />
+          <Field
+            label="所在地区"
+            placeholder="省/市/区"
+            readonly
+            isLink
+            modelValue={state.pcrStr}
+            onClick={() => {
+              state.showPicker = true;
+            }}
+          />
+          <Field
+            label="详细地址"
+            placeholder="街道/小区楼栋/乡村名称"
+            type="textarea"
+            rows={3}
+            autocomplete="off"
+            v-model={state.detailAddress}
+            maxlength={100}
+          />
+        </CellGroup>
+
+        <CellGroup inset style={{ marginTop: '12px' }}>
+          <Cell title="设置为默认地址" center class={styles.default}>
+            {{
+              value: () => <Switch v-model={state.defaultStatus} size="23px" />
+            }}
+          </Cell>
+        </CellGroup>
+
+        <OSticky position="bottom">
+          <div class="btnGroup">
+            <Button
+              type="primary"
+              block
+              round
+              onClick={onSubmit}
+              disabled={state.isClick}>
+              确认
+            </Button>
+          </div>
+        </OSticky>
+
+        <Popup
+          v-model:show={state.showPicker}
+          position="bottom"
+          round
+          class={'popupBottomSearch'}>
+          <Picker
+            showToolbar
+            columns={areas}
+            columnsFieldNames={{
+              text: 'name',
+              value: 'code',
+              children: 'areas'
+            }}
+            onCancel={() => (state.showPicker = false)}
+            onConfirm={(val: any) => {
+              console.log(val, 'val');
+              const selectedOptions = val.selectedOptions || [];
+              // 因为有的只
+              state.pcrStr = '';
+              if (selectedOptions.length === 2) {
+                selectedOptions.forEach((item: any, index: number) => {
+                  state.pcrStr += item.name;
+                  if (index === 0) {
+                    state.province = item.code;
+                  } else if (index === 1) {
+                    state.city = item.code;
+                  }
+                });
+              } else {
+                selectedOptions.forEach((item: any, index: number) => {
+                  state.pcrStr += item.name;
+                  if (index === 0) {
+                    state.province = item.code;
+                  } else if (index === 1) {
+                    state.city = item.code;
+                  } else if (index === 2) {
+                    state.region = item.code;
+                  }
+                });
+              }
+
+              state.showPicker = false;
+            }}
+          />
+        </Popup>
+      </div>
+    );
+  }
+});

+ 77 - 0
src/views/student-register/shop-address/index.module.less

@@ -0,0 +1,77 @@
+.shopAddress {
+  overflow: hidden;
+}
+
+.swipeCell {
+  margin: 12px 13px 12px 13px;
+
+  .title {
+    display: flex;
+    align-items: center;
+    font-size: 16px;
+    color: #777777;
+    line-height: 22px;
+    .name {
+      font-size: 16px;
+      font-weight: 600;
+      color: #333333;
+      line-height: 22px;
+      padding-right: 12px;
+    }
+    :global {
+      .van-tag {
+        padding: 0 8px;
+        margin-left: 6px;
+        font-size: 12px;
+      }
+    }
+  }
+  .content {
+    font-size: 14px;
+    color: #777777;
+    line-height: 20px;
+    margin-right: 40px;
+    word-break: break-all;
+    word-wrap: break-word;
+  }
+
+  :global {
+    .van-cell {
+      padding: 15px 12px;
+      border-radius: 10px;
+      overflow: hidden;
+    }
+    .van-button {
+      height: 100%;
+      border-radius: 10px;
+      border: 1px solid;
+    }
+  }
+}
+
+.operation {
+  padding-top: 12px;
+  .form {
+    :global {
+      .van-cell__title {
+        width: 4.5em;
+      }
+    }
+  }
+  :global {
+    .van-cell {
+      font-size: 16px;
+      padding: 18px 12px;
+    }
+  }
+
+  .default {
+    :global {
+      .van-cell__value {
+        display: flex;
+        align-items: center;
+        justify-content: flex-end;
+      }
+    }
+  }
+}

+ 193 - 0
src/views/student-register/shop-address/index.tsx

@@ -0,0 +1,193 @@
+import {
+  Button,
+  Cell,
+  SwipeCell,
+  Tag,
+  Image,
+  Icon,
+  showConfirmDialog,
+  List,
+  showToast
+} from 'vant';
+import { defineComponent, onMounted, onUpdated, reactive } from 'vue';
+import styles from './index.module.less';
+import iconEdit from '../images/icon-edit.png';
+import OSticky from '@/components/m-sticky';
+import OEmpty from '@/components/m-empty';
+import { useRouter } from 'vue-router';
+import request from '@/helpers/request';
+
+export default defineComponent({
+  name: 'shop-address',
+  setup() {
+    const router = useRouter();
+    const form = reactive({
+      isClick: false,
+      list: [] as any,
+      listState: {
+        dataShow: true, // 判断是否有数据
+        loading: false,
+        finished: false
+      },
+      params: {
+        page: 1,
+        rows: 20
+      },
+      selectItem: {} // 选择的地址
+    });
+    const onBeforeClose = ({ position }: any, item: any) => {
+      if (position === 'right') {
+        showConfirmDialog({
+          title: '确定删除吗?'
+        }).then(async () => {
+          await request.post('/edu-app/userReceiveAddress/remove', {
+            requestType: 'form',
+            data: {
+              id: item.id
+            }
+          });
+
+          setTimeout(() => {
+            showToast('删除成功');
+          }, 100);
+
+          setTimeout(() => {
+            form.params.page = 1;
+            form.list = [];
+            form.listState.dataShow = true; // 判断是否有数据
+            form.listState.loading = false;
+            form.listState.finished = false;
+            getList();
+          }, 1100);
+          return true;
+        });
+      } else {
+        return true;
+      }
+    };
+
+    const onUpdate = (item: any) => {
+      router.push({
+        path: '/addressOperation',
+        query: {
+          id: item.id
+        }
+      });
+    };
+
+    // api-student/userReceiveAddress/page
+    const getList = async () => {
+      try {
+        if (form.isClick) return;
+        form.isClick = true;
+        const res = await request.post('/edu-app/userReceiveAddress/page', {
+          data: {
+            ...form.params
+          }
+        });
+        form.listState.loading = false;
+        const result = res.data || {};
+        // 处理重复请求数据
+        if (form.list.length > 0 && result.current === 1) {
+          return;
+        }
+        form.list = form.list.concat(result.rows || []);
+        form.listState.finished = result.current >= result.pages;
+        form.params.page = result.current + 1;
+        form.listState.dataShow = form.list.length > 0;
+        form.isClick = false;
+      } catch {
+        form.listState.dataShow = false;
+        form.listState.finished = true;
+        form.isClick = false;
+      }
+    };
+
+    // 选择地址
+    const onDetails = (item: any) => {
+      sessionStorage.setItem('addressDetails', JSON.stringify(item));
+      router.back();
+    };
+
+    onMounted(() => {
+      getList();
+    });
+    return () => (
+      <div
+        class={[
+          styles.shopAddress,
+          !form.listState.dataShow && 'emptyRootContainer'
+        ]}>
+        {form.listState.dataShow ? (
+          <List
+            // v-model:loading={form.listState.loading}
+            finished={form.listState.finished}
+            finishedText=" "
+            class={[styles.liveList]}
+            onLoad={getList}
+            immediateCheck={false}>
+            {form.list.map((item: any) => (
+              <SwipeCell
+                class={styles.swipeCell}
+                beforeClose={(args: any) => onBeforeClose(args, item)}>
+                {{
+                  default: () => (
+                    <Cell center onClick={() => onDetails(item)}>
+                      {{
+                        title: () => (
+                          <div class={styles.title}>
+                            <span class={styles.name}>{item.name}</span>
+                            <span class={styles.phone}>{item.phoneNumber}</span>
+                            {item.defaultStatus && (
+                              <Tag round color="#FF8057">
+                                默认
+                              </Tag>
+                            )}
+                          </div>
+                        ),
+                        label: () => (
+                          <div class={styles.content}>
+                            {item.provinceName}
+                            {item.cityName}
+                            {item.regionName}
+                            {item.detailAddress}
+                          </div>
+                        ),
+                        'right-icon': () => (
+                          <Icon
+                            name={iconEdit}
+                            size="18"
+                            onClick={(e: Event) => {
+                              e.stopPropagation();
+                              onUpdate(item);
+                            }}
+                          />
+                        )
+                      }}
+                    </Cell>
+                  ),
+                  right: () => <Button type="danger">删除</Button>
+                }}
+              </SwipeCell>
+            ))}
+          </List>
+        ) : (
+          <OEmpty btnStatus={false} tips="暂无收货地址" />
+        )}
+        <OSticky position="bottom">
+          <div class={'btnGroup'}>
+            <Button
+              type="primary"
+              round
+              block
+              onClick={() => {
+                router.push('addressOperation');
+              }}>
+              新建收货地址
+            </Button>
+          </div>
+        </OSticky>
+      </div>
+    );
+  }
+});

+ 71 - 0
src/views/student-register/shop-mall/components/goods/index.module.less

@@ -0,0 +1,71 @@
+.goods {
+  width: 168px;
+  background: #ffffff;
+  border-radius: 8px;
+  overflow: hidden;
+  margin-bottom: 14px;
+  --van-image-placeholder-background-color: #f1f1f1;
+}
+
+.goodsSection {
+  position: relative;
+  height: 168px;
+  width: 100%;
+
+  .sellOut {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: rgba(0, 0, 0, 0.2);
+    .sellOutImg {
+      width: 92px;
+      height: 92px;
+    }
+  }
+}
+
+.goodsImg {
+  width: 100%;
+  height: 168px;
+}
+.goodsInfo {
+  position: relative;
+  padding: 14px 10px 10px 10px;
+
+  .goodsName {
+    font-size: 14px;
+    color: #333333;
+    line-height: 20px;
+    padding-bottom: 6px;
+  }
+}
+
+.goodsSale {
+  font-size: 12px;
+  color: #999999;
+  line-height: 20px;
+}
+.pre{
+  font-size: 12px;
+}
+.goodsPrice {
+  font-size: 18px;
+  font-weight: bold;
+  color: #FB1C00;
+  line-height: 24px;
+}
+.addCart {
+  position: absolute;
+  bottom: 12px;
+  right: 12px;
+}
+.addCartDisabled {
+  :global(.van-icon__image) {
+    filter: grayscale(100%);
+  }
+}

+ 70 - 0
src/views/student-register/shop-mall/components/goods/index.tsx

@@ -0,0 +1,70 @@
+import { Icon, Image } from 'vant';
+import { defineComponent } from 'vue';
+import styles from './index.module.less';
+
+import iconSellOut from '../../images/icon-sell-out.png';
+import { moneyFormat } from '@/helpers/utils';
+
+export default defineComponent({
+  name: 'goods',
+  props: {
+    showAdd: {
+      type: Boolean,
+      default: true
+    },
+    item: {
+      type: Object,
+      default: {}
+    },
+    onItemClick: {
+      type: Function,
+      default: (item: any) => {}
+    },
+    onBuyClick: {
+      type: Function,
+      default: (item: any) => {}
+    }
+  },
+  render() {
+    const item = this.item;
+    return (
+      <div class={styles.goods} onClick={() => this.onItemClick(item)}>
+        <div class={styles.goodsSection}>
+          <Image src={item.pic} fit="cover" class={styles.goodsImg} />
+          {item.stock <= 0 && (
+            <div class={styles.sellOut}>
+              <Image src={iconSellOut} fit="cover" class={styles.sellOutImg} />
+            </div>
+          )}
+        </div>
+        <div class={styles.goodsInfo}>
+          <div class={[styles.goodsName, 'van-ellipsis']}>{item.name}</div>
+          <div class={styles.goodsBuy}>
+            {/* <del class={styles.goodsSale}>
+              ¥{moneyFormat(item.originalPrice)}
+            </del> */}
+            <p class={styles.goodsPrice}>
+              <span class={styles.pre}>¥</span>
+              {moneyFormat(item.price)}
+            </p>
+
+            {/* {this.showAdd && (
+              <Icon
+                class={[
+                  styles.addCart,
+                  item.stock <= 0 && styles.addCartDisabled
+                ]}
+                name={iconAddCart}
+                size={22}
+                onClick={(e: MouseEvent) => {
+                  e.stopPropagation()
+                  item.stock > 0 && this.onBuyClick(item)
+                }}
+              />
+            )} */}
+          </div>
+        </div>
+      </div>
+    );
+  }
+});

+ 42 - 0
src/views/student-register/shop-mall/components/menu-list/index.module.less

@@ -0,0 +1,42 @@
+.swipeType {
+  padding-top: 20px;
+  padding-bottom: 20px;
+  :global {
+    .van-swipe__indicators {
+      bottom: 12px;
+    }
+    .van-swipe__indicator:not(:last-child) {
+      margin-right: 0;
+    }
+    .van-swipe__indicator {
+      width: 20px;
+      height: 4px;
+      background: #ebebeb;
+      border-radius: 4px;
+    }
+  }
+}
+.swipeTypeShow {
+  padding-bottom: 30px;
+}
+
+.typeSection {
+  display: flex;
+  align-items: center;
+}
+
+.typeItem {
+  width: 20%;
+  text-align: center;
+  .swipeTypeImg {
+    width: 60px;
+    height: 60px;
+    border-radius: 50%;
+    overflow: hidden;
+  }
+  .typeName {
+    padding-top: 3px;
+    font-size: 12px;
+    color: #333333;
+  }
+}

+ 52 - 0
src/views/student-register/shop-mall/components/menu-list/index.tsx

@@ -0,0 +1,52 @@
+import { Swipe, SwipeItem, Image } from 'vant'
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
+
+export default defineComponent({
+  name: 'menu-list',
+  props: {
+    productList: {
+      type: Array,
+      default: []
+    },
+    onOpenWebView: {
+      type: Function,
+      default: (a: any) => {}
+    }
+  },
+  render() {
+    return (
+      <Swipe
+        class={[
+          styles.swipeType,
+          this.productList.length > 1 && styles.swipeTypeShow
+        ]}
+        indicator-color="var(--van-primary)"
+        loop={false}
+        showIndicators={this.productList.length > 1}
+      >
+        {this.productList.map((product: any) => (
+          <SwipeItem class={styles.typeSection}>
+            {product.map((item: any) => (
+              <div
+                class={styles.typeItem}
+                onClick={() => {
+                  this.onOpenWebView(
+                    '/goodsList?' + 'id=' + item.id + '&tag=' + encodeURIComponent(item.name)
+                  )
+                }}
+              >
+                <Image
+                  class={styles.swipeTypeImg}
+                  src={item.icon}
+                  fit="cover"
+                />
+                <p class={styles.typeName}>{item.name}</p>
+              </div>
+            ))}
+          </SwipeItem>
+        ))}
+      </Swipe>
+    )
+  }
+})

+ 43 - 0
src/views/student-register/shop-mall/components/shop-item/index.module.less

@@ -0,0 +1,43 @@
+body {
+  :global {
+    --van-cart: #ff4e19;
+  }
+}
+.item {
+  :global {
+    .van-card {
+      background: #fff;
+      flex: 1;
+      margin: 0;
+      padding: 14px 12px;
+    }
+    .van-card__title {
+      font-size: 16px;
+      color: #333;
+      font-weight: 400;
+      line-height: 22px;
+      max-height: 44px;
+    }
+    .van-card__desc {
+      font-size: 14px;
+      color: #999;
+      font-weight: 400;
+      line-height: 20px;
+      max-height: 40px;
+      white-space: break-spaces;
+    }
+    .van-card__thumb {
+      width: auto;
+      height: auto;
+    }
+    .van-image {
+      width: 100px !important;
+      height: 100px !important;
+      border-radius: 8px;
+      overflow: hidden;
+    }
+    .van-card__price {
+      color: var(--van-cart);
+    }
+  }
+}

+ 33 - 0
src/views/student-register/shop-mall/components/shop-item/index.tsx

@@ -0,0 +1,33 @@
+import { moneyFormat } from '@/helpers/utils'
+import { formateAttr } from '@/views/cart/cart'
+import { Card } from 'vant'
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
+
+export default defineComponent({
+  name: 'shop-item',
+  props: {
+    item: {
+      type: Object,
+      default: {
+        productPic: '',
+        productName: '',
+        productAttr: '',
+        productPrice: 0,
+        productQuantity: 0
+      }
+    }
+  },
+  setup({ item }) {
+    return () => (
+      <Card
+        class={styles.item}
+        thumb={item.productPic}
+        title={item.productName}
+        desc={formateAttr(item.productAttr)}
+        price={moneyFormat(item.productPrice)}
+        num={item.productQuantity}
+      ></Card>
+    )
+  }
+})

+ 18 - 0
src/views/student-register/shop-mall/components/tab-list/index.module.less

@@ -0,0 +1,18 @@
+.tabList {
+  :global {
+
+    .van-list__loading,
+    .van-list__finished-text,
+    .van-list__error-text {
+      width: 100%;
+    }
+  }
+}
+
+.goodsList {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-between;
+  margin: 0 14px;
+  height: 100%;
+}

+ 155 - 0
src/views/student-register/shop-mall/components/tab-list/index.tsx

@@ -0,0 +1,155 @@
+import ColResult from '@/components/m-empty';
+import request from '@/helpers/request';
+import { List, Popup } from 'vant';
+import { defineComponent } from 'vue';
+import Goods from '../goods';
+import styles from './index.module.less';
+
+export default defineComponent({
+  name: 'tab-list',
+  props: {
+    showAdd: {
+      type: Boolean,
+      default: true
+    },
+    // 商品分类ID
+    typeId: {
+      type: Number,
+      default: 0
+    },
+    // 商品类型ID
+    productAttributeCategoryId: {
+      type: Number,
+      default: 0
+    },
+    // 品牌 ID
+    brandId: {
+      type: Number,
+      default: 0
+    },
+    sort: {
+      type: Number,
+      defalut: 0
+    },
+    keyword: {
+      type: String as any,
+      defalut: ''
+    },
+    isTab: {
+      type: Boolean,
+      default: false
+    },
+    onOpenWebView: {
+      type: Function,
+      default: (a: any) => {}
+    }
+  },
+  data() {
+    return {
+      list: [],
+      loading: false,
+      finished: false,
+      params: {
+        productCategoryId: undefined as any,
+        productAttributeCategoryId: undefined as any,
+        brandId: null as any,
+        sort: null as any, // 1->按新品;2->按销量;3->价格从低到高;4->价格从高到低
+        keyword: '',
+        pageNum: 1,
+        pageSize: 20
+      },
+      addGoodsShow: false,
+      selectGoodsItem: {} as any
+    };
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    onSearch() {
+      this.finished = false;
+      this.list = [];
+      this.params.pageNum = 1;
+      this.getList(); // list组件没有触发, 手动触发获取数据
+    },
+    async getList() {
+      this.loading = true;
+      try {
+        let params = this.params;
+        params.productCategoryId = this.typeId ? this.typeId : undefined; // 商品分类
+        params.productAttributeCategoryId = this.productAttributeCategoryId // 商品类型
+          ? this.productAttributeCategoryId
+          : undefined;
+        params.brandId = this.brandId ? this.brandId : undefined; // 品牌
+        params.sort = this.sort ? this.sort : undefined;
+        params.keyword = this.keyword ? this.keyword : undefined;
+        const res = await request.post('/edu-app/open/mall/productSearch', {
+          data: {
+            ...params
+          }
+        });
+
+        const result = res.data || {};
+        // 处理重复请求数据
+        if (this.list.length > 0 && result.pageNum === 1) {
+          return;
+        }
+        this.list = this.list.concat(result.list || []);
+        this.finished = result.pageNum >= result.totalPage;
+        this.params.pageNum = result.pageNum + 1;
+      } catch {
+        this.finished = true;
+      }
+      this.loading = false;
+    },
+    onDetailClick(item: any) {
+      if (this.isTab) {
+        let url = this.$router.resolve({
+          path: '/goodsDetail',
+          query: { id: item.id }
+        }).fullPath;
+
+        this.onOpenWebView(url);
+        return;
+      }
+      this.$router.push({
+        path: '/goodsDetail',
+        query: {
+          id: item.id
+        }
+      });
+    },
+    onBuyClick(item: any) {
+      this.selectGoodsItem = item;
+      this.addGoodsShow = true;
+    }
+  },
+  render() {
+    return (
+      <div class={styles.tabList}>
+        <List
+          v-model:loading={this.loading}
+          finished={this.finished}
+          finishedText={''}
+          immediateCheck={false}
+          class={[styles.goodsList, 'mb12']}
+          onLoad={this.getList}>
+          {(this.list.length &&
+            this.list.map((item: any) => (
+              <Goods
+                item={item}
+                onItemClick={this.onDetailClick}
+                onBuyClick={this.onBuyClick}
+                showAdd={this.showAdd}
+              />
+            ))) ||
+            null}
+          {(!this.loading && !this.list.length && (
+            <ColResult description="暂无商品" />
+          )) ||
+            null}
+        </List>
+      </div>
+    );
+  }
+});

+ 323 - 0
src/views/student-register/shop-mall/goods-detail/index.module.less

@@ -0,0 +1,323 @@
+.swipeItemImg,
+.swipe {
+  width: 100%;
+  height: 375px;
+  vertical-align: middle;
+}
+
+.custom-indicator {
+  position: absolute;
+  right: 5px;
+  bottom: 5px;
+  padding: 4px 8px;
+  font-size: 14px;
+  color: #fff;
+  background: rgba(0, 0, 0, 0.5);
+  border-radius: 12px;
+}
+
+.goodsHead {
+  padding: 8px 0;
+
+  :global {
+    .van-cell {
+      padding-top: 5px;
+      padding-bottom: 5px;
+    }
+  }
+}
+
+.priceGroup {
+  display: flex;
+  align-items: center;
+
+  .price {
+    color: #ff4e19;
+    font-size: 24px;
+    font-weight: bold;
+
+    i {
+      font-size: 16px;
+      font-style: normal;
+    }
+  }
+
+  .delPrice {
+    font-size: 14px;
+    color: #999999;
+    margin-left: 12px;
+    line-height: 20px;
+  }
+
+  .stock {
+    font-size: 14px;
+    color: #999999;
+  }
+}
+
+.goodsName {
+  font-size: 16px;
+  font-weight: 500;
+  color: #333333;
+  line-height: 22px;
+}
+
+.row {
+  background-color: #fff;
+  padding: var(--van-cell-vertical-padding) var(--van-cell-horizontal-padding);
+
+  .col {
+    font-size: 16px;
+    color: #333333;
+  }
+}
+
+.radio-group {
+  display: flex;
+  flex-wrap: wrap;
+  // margin-top: 14px;
+}
+
+.radio {
+  margin-right: 8px;
+  margin-bottom: 8px;
+  min-width: 60px;
+
+  :global {
+    .van-radio__label--disabled {
+      opacity: 0.5;
+    }
+
+    .van-radio__icon {
+      display: none;
+    }
+
+    .van-tag--large {
+      height: 27px;
+      font-size: 13px;
+      text-align: center;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+
+    .van-tag {
+      box-sizing: border-box;
+    }
+
+    .van-tag--default {
+      color: #999999;
+    }
+
+    .van-tag--primary {
+      background-color: #f7f8f9;
+    }
+
+    .van-radio__label {
+      margin-left: 0;
+    }
+  }
+}
+
+.badge {
+  :global(.van-badge) {
+    border-radius: 6px 0px 6px 0px;
+    font-size: 12px;
+  }
+}
+
+.section {
+  background: #fff;
+  padding: 12px 0 0;
+}
+
+.detail {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 14px;
+  color: #999999;
+  line-height: 20px;
+  margin-bottom: 12px;
+
+  span {
+    padding: 0 10px;
+  }
+
+  &::before,
+  &::after {
+    display: inline-block;
+    content: ' ';
+    width: 40px;
+    height: 3px;
+  }
+
+  &::before {
+    background: linear-gradient(90deg, rgba(238, 238, 238, 0) 0%, #d8d8d8 100%);
+  }
+
+  &::after {
+    background: linear-gradient(270deg,
+        rgba(238, 238, 238, 0) 0%,
+        #d8d8d8 100%);
+  }
+}
+
+.photoDetail {
+  img {
+    width: 100%;
+    vertical-align: middle;
+  }
+}
+
+.goodsDetail {
+  margin-bottom: var(--van-action-bar-height);
+}
+
+.actionBar {
+  padding-left: 16px;
+  padding-right: 16px;
+  justify-content: space-between;
+  box-shadow: 0px -10px 10px var(--box-shadow-color);
+  box-sizing: border-box;
+
+  :global {
+    .van-submit-bar__bar {
+      justify-content: center;
+      padding: 0;
+      height: 68px;
+
+    }
+
+    .van-action-bar-icon {
+      align-items: center;
+    }
+
+    .van-action-bar-icon__icon {
+      margin-bottom: 0;
+      line-height: 0;
+    }
+
+    .van-badge {
+      background: #ff4e19;
+    }
+  }
+
+  .text {
+    font-size: 12px;
+    color: #333;
+    text-align: center;
+  }
+}
+
+.addCertBtn {
+  background: linear-gradient(121deg, #FFD892 0%, #FFCB75 100%);
+  border-radius: 12px;
+  font-size: 16px;
+  font-weight: 600;
+  color: #5B2C03;
+  width: 148px;
+  height: 40px;
+}
+
+
+.buyGroup {
+  display: flex;
+  justify-content: center;
+  // border: var(--van-button-border-width) solid
+  //   var(--van-button-primary-border-color) !important;
+  // border-radius: 20px;
+  // background-color: var(--van-primary);
+  overflow: hidden;
+  box-sizing: border-box;
+
+}
+
+.selectWrap {
+  padding-top: 1.5px;
+  font-size: 14px;
+  color: #666;
+  padding-bottom: 12px;
+}
+
+.shareBtn {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  color: #666666;
+}
+
+.shareWrap {
+  display: flex;
+  border-radius: 10px;
+  border: 1px solid var(--van-primary);
+  overflow: hidden;
+  padding: 14px;
+  align-items: center;
+  background-color: #fff;
+  margin-top: 16px;
+
+  .sharePic {
+    width: 100px;
+    height: 100px;
+    border-radius: 8px;
+  }
+
+  .shareLeft {
+    margin-right: 10px;
+  }
+
+  .shareRight {
+    flex: 1;
+    overflow: hidden;
+  }
+
+  .shareShopTitle {
+    font-size: 16px;
+    font-weight: 400;
+    color: #333333;
+    display: -webkit-box;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
+  }
+
+  .shareShopDes {
+    font-size: 14px;
+    font-weight: 400;
+    color: #999999;
+    margin: 10px 0 20px 0;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+
+  .shareShopValue {
+    font-size: 16px;
+    color: #ff4e19;
+  }
+
+  .shareShopOldPrice {
+    color: #e5e5e5;
+    margin-left: 5px;
+  }
+
+  :global {
+    .van-card {
+      background: transparent;
+    }
+  }
+}
+
+.imagesOverlayWrap {
+  :global {
+    .van-badge__wrapper {
+      top: 40px;
+    }
+
+    .van-image-preview__index {
+      top: 40px;
+    }
+  }
+}

+ 315 - 0
src/views/student-register/shop-mall/goods-detail/index.tsx

@@ -0,0 +1,315 @@
+import request from '@/helpers/request';
+import { moneyFormat } from '@/helpers/utils';
+import {
+  Swipe,
+  SwipeItem,
+  Image,
+  CellGroup,
+  Cell,
+  RadioGroup,
+  Radio,
+  Tag,
+  Row,
+  Col,
+  ActionBarButton,
+  Badge,
+  SubmitBar,
+  showImagePreview,
+  showToast
+} from 'vant';
+import { defineComponent } from 'vue';
+import styles from './index.module.less';
+import { useStudentRegisterStore } from '@/store/modules/student-register-store';
+const studentRegisterStore = useStudentRegisterStore();
+export default defineComponent({
+  name: 'goods-detail',
+  data() {
+    const query = this.$route.query;
+    return {
+      id: query.id,
+      albumPics: [] as any[],
+      product: {} as Record<string | number | symbol, any>,
+      radio: 0,
+      skuStockListTemp: [],
+      detailMobileHtml: '',
+      loading: false
+    };
+  },
+  computed: {
+    skuStockList() {
+      // 处理规格
+      const product = this.product;
+      const skuStockList: any =
+        this.skuStockListTemp.length > 0
+          ? this.skuStockListTemp
+          : [
+              {
+                id: -1,
+                price: product.price,
+                pic: product.pic,
+                stock: product.stock,
+                spData: null
+              }
+            ];
+      skuStockList.forEach((item: any) => {
+        if (item.spData) {
+          const spData = JSON.parse(item.spData);
+          item.spDataJson = spData.reduce(
+            (spDataJson: any, value: { value: any }) => {
+              spDataJson += value.value;
+              return spDataJson;
+            },
+            ''
+          );
+          item.sku = spData
+            .reduce((sku: string[], value: { key: any; value: any }) => {
+              sku.push(`${value.key}: ${value.value}`);
+              return sku;
+            }, [])
+            .join(',');
+        } else {
+          item.spDataJson = '默认';
+        }
+      });
+      return skuStockList;
+    },
+    getPrice() {
+      let item = this.skuStockList.filter(
+        (n: { id: number }) => n.id == this.radio
+      ) as any;
+      if (item && Array.isArray(item) && item.length) {
+        return item[0].price;
+      }
+      return 0;
+    }
+  },
+  async mounted() {
+    try {
+      this.loading = true;
+      const res = await request.get(
+        `/edu-app/open/mall/product/detail/${this.id}`
+      );
+      this.loading = false;
+      const result = res.data || {};
+      this.albumPics = [result.product.pic]
+        .concat(result.product.albumPics.split(','))
+        .filter(n => n);
+      this.product = result.product;
+      this.skuStockListTemp = result.skuStockList || [];
+      if (this.skuStockListTemp.length) {
+        let len = this.skuStockListTemp.length;
+        for (let i = 0; i < len; i++) {
+          let item = this.skuStockListTemp[i] as any;
+          if (item.stock >= 0) {
+            this.radio = item.id;
+            break;
+          }
+        }
+      }
+      this.detailMobileHtml = result.product.detailMobileHtml;
+    } catch {}
+  },
+  methods: {
+    onPreview(index: number) {
+      // 图片预览
+      showImagePreview({
+        images: this.albumPics,
+        startPosition: index,
+        closeable: true,
+        className: styles.imagesOverlayWrap
+      });
+    },
+    onShowImg(target: any) {
+      const { localName } = target.srcElement;
+      if (localName !== 'img') {
+        return;
+      }
+      let startPosition = 0;
+      const domList = document.querySelectorAll('.msgWrap img');
+      let imgList = Array.from(domList).map((item: any, index: number) => {
+        if (target.srcElement == item) {
+          startPosition = index;
+        }
+        return item.src;
+      });
+
+      showImagePreview({
+        images: imgList,
+        startPosition: startPosition,
+        closeable: true,
+        className: styles.imagesOverlayWrap
+      });
+    },
+    onShowCart() {
+      const selectGoodsItem = {
+        price: this.product.price,
+        originalPrice: this.product.originalPrice,
+        pic: this.product.pic,
+        stock: this.product.stock,
+        skuStockList: this.skuStockListTemp.length
+          ? this.skuStockListTemp
+          : undefined,
+        brandName: this.product.brandName,
+        productCategoryId: this.product.productCategoryId,
+        name: this.product.name,
+        productSn: this.product.productSn,
+        productSubTitle: this.product.subTitle,
+        count: 1,
+        id: this.product.id
+      };
+      let isExist = false; // 是否存在
+      studentRegisterStore.getGoods.forEach((goods: any) => {
+        if (goods.id === this.product.id) {
+          isExist = true;
+          goods.count += 1;
+        }
+      });
+
+      if (!isExist) {
+        studentRegisterStore.setGoods(selectGoodsItem);
+      }
+
+      showToast('添加成功');
+    }
+  },
+  render() {
+    const product = this.product;
+    const selectSku = this.skuStockList.find((n: any) => n.id === this.radio);
+    return (
+      <div class={styles.goodsDetail}>
+        {/* <ColHeader /> */}
+        <Swipe
+          class={styles.swipe}
+          lazyRender
+          v-slots={{
+            indicator: (item: any) =>
+              item.total > 1 && (
+                <div class={styles['custom-indicator']}>
+                  {(item.active || 0) + 1} / {item.total}
+                </div>
+              )
+          }}>
+          {this.albumPics.map((item: string, index: number) => (
+            <SwipeItem>
+              <Image
+                class={styles.swipeItemImg}
+                src={item}
+                onClick={() => this.onPreview(index)}
+                fit="cover"
+              />
+            </SwipeItem>
+          ))}
+        </Swipe>
+
+        <CellGroup border={false} class={[styles.goodsHead, 'mb12']}>
+          <Cell
+            center
+            border={false}
+            v-slots={{
+              title: () => (
+                <div class={styles.priceGroup}>
+                  <span class={styles.price}>
+                    <i>¥</i>
+                    {moneyFormat(this.getPrice)}
+                  </span>
+                  {/* <del class={styles.delPrice}>
+                    ¥{moneyFormat(product.originalPrice)}
+                  </del> */}
+                </div>
+              )
+              // default: () => <div class={styles.stock}>销量4件</div>
+            }}
+          />
+          <Cell
+            center
+            border={false}
+            title={product.name}
+            titleClass={[styles.goodsName, 'van-ellipsis']}
+          />
+        </CellGroup>
+
+        <Row class={[styles.row, 'mb12']}>
+          <Col span={4} class={styles.col}>
+            规格
+          </Col>
+          <Col span={20}>
+            {selectSku ? (
+              <div class={styles.selectWrap}>
+                {selectSku.stock <= 0
+                  ? `当前款式暂时缺货`
+                  : `已选择 ${selectSku.spDataJson}`}
+              </div>
+            ) : (
+              <div>请选择 规格</div>
+            )}
+            <RadioGroup
+              class={styles['radio-group']}
+              modelValue={this.radio}
+              onUpdate:modelValue={val => (this.radio = val)}>
+              {this.skuStockList.map((item: any) => {
+                const isActive = item.id === this.radio;
+                const type = isActive ? 'primary' : 'default';
+                return (
+                  <Badge
+                    position="top-right"
+                    content={item.stock <= 0 ? '缺货' : ''}
+                    color={'#999999'}
+                    class={styles.badge}
+                    offset={[-20, 0]}>
+                    <Radio
+                      class={styles.radio}
+                      name={item.id}
+                      disabled={item.stock <= 0}
+                      onClick={() => {
+                        // 判断是否有库存
+                        if (item.stock <= 0) {
+                          return;
+                        }
+                        this.radio = item.id;
+                      }}>
+                      <Tag size="large" plain={isActive} type={type}>
+                        {item.spDataJson}
+                      </Tag>
+                    </Radio>
+                  </Badge>
+                );
+              })}
+            </RadioGroup>
+          </Col>
+        </Row>
+        {this.detailMobileHtml && (
+          <div class={[styles.section]}>
+            <div class={styles.detail}>
+              <span>图文详情</span>
+            </div>
+
+            <div
+              class={[styles.photoDetail, 'msgWrap']}
+              onClick={this.onShowImg}
+              v-html={this.detailMobileHtml}></div>
+          </div>
+        )}
+
+        {!this.loading && (
+          <>
+            <SubmitBar
+              class={styles.actionBar}
+              safe-area-inset-bottom
+              v-slots={{
+                button: () => (
+                  <div class={styles.buyGroup}>
+                    <ActionBarButton
+                      type="primary"
+                      class={styles.addCertBtn}
+                      text="添加购买"
+                      onClick={() => this.onShowCart()}
+                    />
+                  </div>
+                )
+              }}></SubmitBar>
+          </>
+        )}
+      </div>
+    );
+  }
+});

+ 108 - 0
src/views/student-register/shop-mall/goods-list/index.module.less

@@ -0,0 +1,108 @@
+:global {
+  .van-search {
+    .van-button {
+      background: #FFCF7C !important;
+      font-size: 14px !important;
+      font-weight: 600 !important;
+      color: #5B2C03 !important;
+    }
+  }
+}
+
+.filter-top {
+  height: 37px;
+  font-size: 14px;
+  color: #666666;
+  transition: color cubic-bezier(0.075, 0.82, 0.165, 1);
+  background: #ffffff;
+
+  :global {
+    .van-col {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
+
+  .active {
+    color: #333333;
+    font-weight: 500;
+  }
+
+  .filterBtn {
+    color: #333333;
+  }
+}
+
+.filterTagWrap {
+  display: flex;
+  padding: 6px 0 0 14px;
+  flex-wrap: wrap;
+
+  .filterTag {
+    border: 1px solid #FFCF7C !important;
+    color: #F39F11 !important;
+    border-radius: 12px;
+    font-size: 12px;
+    background-color: #FFFAF4;
+    padding: 4px 10px;
+    margin-right: 8px;
+    margin-bottom: 8px;
+    font-weight: 500;
+  }
+}
+
+.filter-productCategory {
+  font-size: 14px;
+  color: #666666;
+
+  :global {
+    .van-tab {
+      padding: 0;
+    }
+
+    .van-tabs__line {
+      display: none !important;
+    }
+
+    .van-col {
+      height: 37px;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
+
+  .filter-tag {
+    padding: 5px 10px;
+    height: 80%;
+    border-radius: 20px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    margin: 0 5px;
+    min-width: 50px;
+  }
+
+  .filter-tag-checked {
+    background: var(--van-primary);
+    color: #fff;
+  }
+}
+
+.filterSort {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  margin-left: 5px;
+
+  .icon-active {
+    color: #01c1b5;
+  }
+
+  .iconSort {
+    margin-top: -5px;
+    margin-left: -1px;
+  }
+}

+ 272 - 0
src/views/student-register/shop-mall/goods-list/index.tsx

@@ -0,0 +1,272 @@
+import { Popup, Col, Row, Icon, Tag, Sticky, Tabs, Tab } from 'vant';
+import { defineComponent } from 'vue';
+import TabList from '../components/tab-list';
+import styles from './index.module.less';
+import iconFilter from '../images/icon-filter.png';
+import iconSearchY from '../images/icon-search-y.png';
+import GoodsFilterList from '../modal/goods-filter-list';
+import ColSearch from '@/components/m-search';
+import request from '@/helpers/request';
+import MSticky from '@/components/m-sticky';
+export default defineComponent({
+  name: 'goods-list',
+  data() {
+    const query = this.$route.query;
+    return {
+      tabListShow: query.id ? false : true,
+      typeId: 0,
+      filterActive: 0,
+      filterListShow: false,
+      productCategory: {
+        active: 0,
+        name: query.tag || '',
+        id: Number(query.id) || 0,
+        children: []
+      } as any,
+      productAttributeCategory: {
+        children: [],
+        name: '',
+        id: 0
+      } as any,
+      brand: {
+        name: '',
+        id: 0
+      },
+      keyword: '' as any,
+      autofocus: false
+    };
+  },
+  computed: {
+    getProductAttributeCategory() {
+      if (this.productCategory.id) {
+        if (this.productCategory.children) {
+          let child = (this.productCategory.children[
+            this.productCategory.active
+          ] || {}) as any;
+          return child.id || '';
+        }
+        this.productCategory.id;
+      }
+      return 0;
+    }
+  },
+  async mounted() {
+    this.$nextTick(() => {
+      if (this.$route.query.input === 'focus') {
+        let input: HTMLInputElement = document.querySelector(
+          '.van-field__control'
+        ) as HTMLInputElement;
+        input.focus();
+      }
+    });
+    this.tabListShow = true;
+  },
+  methods: {
+    onFilter(n: number) {
+      if (this.filterActive === 3 && n === 3) n = 4;
+      if (this.filterActive === 4 && n === 3) n = 3;
+      if (this.filterActive === n) return;
+      this.filterActive = n;
+      this.$nextTick(() => {
+        this.onSearch();
+      });
+    },
+    setFilter({ productCategory, productAttributeCategory, brand }: any) {
+      if (productCategory && productCategory.active === undefined) {
+        productCategory.active = 0;
+      }
+      this.productCategory = productCategory
+        ? productCategory
+        : { id: 0, name: '' };
+      this.productAttributeCategory = productAttributeCategory
+        ? productAttributeCategory
+        : { id: 0, name: '' };
+      this.brand = brand ? brand : { id: 0, name: '' };
+      this.$nextTick(() => {
+        this.onSearch();
+        this.filterListShow = false;
+      });
+    },
+
+    onToggleTag() {
+      let tabList = this.$refs.tabList as any;
+      if (tabList.loading) return;
+      this.$nextTick(() => {
+        this.onSearch();
+      });
+    },
+
+    onClearTag(key: string) {
+      if (key === 'productCategory') {
+        this.productCategory = { id: 0, name: '' };
+      } else if (key === 'productAttributeCategory') {
+        this.productAttributeCategory = { id: 0, name: '' };
+      } else {
+        this.brand = { id: 0, name: '' };
+      }
+      // this[key] = { id: 0, name: '' };
+      let goodsFilter = this.$refs.goodsFilter as any;
+      if (goodsFilter) {
+        if (key === 'productAttributeCategory') {
+          goodsFilter.setParams('productAttributeCategoryList');
+        } else {
+          goodsFilter.setParams('brandList');
+        }
+      }
+      this.$nextTick(() => {
+        this.onSearch();
+      });
+    },
+    onSearch() {
+      let tabList = this.$refs.tabList as any;
+      tabList.onSearch();
+    },
+    searchBtn(keyword?: string) {
+      this.keyword = keyword;
+      this.$nextTick(() => {
+        this.onSearch();
+      });
+    }
+  },
+  render() {
+    return (
+      <div>
+        <MSticky>
+          <ColSearch
+            modelValue={this.keyword}
+            searchIcon={iconSearchY}
+            onSearch={this.searchBtn}
+            placeholder="请输入商品名称"
+          />
+          <Row class={styles['filter-top']} align="center">
+            <Col
+              span={6}
+              class={this.filterActive === 0 ? styles.active : ''}
+              onClick={() => this.onFilter(0)}>
+              综合排序
+            </Col>
+            <Col
+              span={6}
+              class={
+                this.filterActive === 3 || this.filterActive === 4
+                  ? styles.active
+                  : ''
+              }
+              onClick={() => this.onFilter(3)}>
+              价格
+              <div class={styles.filterSort}>
+                <Icon
+                  class={this.filterActive === 3 ? styles['icon-active'] : ''}
+                  style={{ transform: 'rotate(-90deg)' }}
+                  name="play"
+                  size={12}
+                />
+                <Icon
+                  class={[
+                    styles.iconSort,
+                    this.filterActive === 4 ? [styles['icon-active']] : ''
+                  ]}
+                  style={{ transform: 'rotate(90deg)' }}
+                  name="play"
+                  size={12}
+                />
+              </div>
+            </Col>
+            <Col
+              style={{ marginLeft: 'auto' }}
+              span={6}
+              class={styles.filterBtn}
+              onClick={() => (this.filterListShow = true)}>
+              筛选
+              <Icon name={iconFilter} size={18} />
+            </Col>
+          </Row>
+
+          {this.productCategory.id &&
+          this.productCategory.children &&
+          this.productCategory.children.length ? (
+            <Tabs
+              class={styles['filter-productCategory']}
+              shrink
+              ellipsis={false}
+              v-model:active={this.productCategory.active}
+              onChange={() => this.onToggleTag()}>
+              {this.productCategory &&
+                this.productCategory.children.map((n: any, i: number) => (
+                  <Tab
+                    name={i}
+                    title={n.name}
+                    v-slots={{
+                      title: () => (
+                        <div
+                          class={[
+                            styles['filter-tag'],
+                            this.productCategory.active === i
+                              ? styles['filter-tag-checked']
+                              : ''
+                          ]}>
+                          {n.name}
+                        </div>
+                      )
+                    }}></Tab>
+                ))}
+            </Tabs>
+          ) : null}
+        </MSticky>
+
+        <div class={styles.filterTagWrap}>
+          {this.productAttributeCategory.id ? (
+            <Tag
+              class={styles.filterTag}
+              closeable={true}
+              onClose={() => this.onClearTag('productAttributeCategory')}>
+              {this.productAttributeCategory.name}
+            </Tag>
+          ) : (
+            ''
+          )}
+          {this.brand.id ? (
+            <Tag
+              class={styles.filterTag}
+              closeable={true}
+              onClose={() => this.onClearTag('brand')}>
+              {this.brand.name}
+            </Tag>
+          ) : (
+            ''
+          )}
+        </div>
+
+        {this.tabListShow ? (
+          <TabList
+            ref="tabList"
+            style={{
+              height: 'calc(100vh - var(--header-height))'
+            }}
+            showAdd={false}
+            // typeId={Number(20)}
+            productAttributeCategoryId={this.productAttributeCategory.id}
+            brandId={this.brand.id}
+            sort={this.filterActive}
+            keyword={this.keyword}
+          />
+        ) : null}
+
+        <Popup
+          show={this.filterListShow}
+          closeable
+          position="bottom"
+          round
+          onClose={() => {
+            this.filterListShow = false;
+          }}>
+          <GoodsFilterList
+            cateGoryId={this.productCategory.id}
+            ref="goodsFilter"
+            setFilter={this.setFilter}
+          />
+        </Popup>
+      </div>
+    );
+  }
+});

BIN
src/views/student-register/shop-mall/images/icon-address.png


BIN
src/views/student-register/shop-mall/images/icon-filter.png


BIN
src/views/student-register/shop-mall/images/icon-more.png


BIN
src/views/student-register/shop-mall/images/icon-order.png


BIN
src/views/student-register/shop-mall/images/icon-search-y.png


Some files were not shown because too many files changed in this diff