Kaynağa Gözat

Merge branch 'master' into cygx_crm_14.7.1

bding 3 ay önce
ebeveyn
işleme
0303f4ff1d
55 değiştirilmiş dosya ile 6598 ekleme ve 252 silme
  1. 2 1
      config/dev.env.js
  2. 2 1
      config/prod.env.js
  3. 2 1
      config/prod.test.env.js
  4. 19 0
      src/api/modules/businessCustom.js
  5. 16 2
      src/api/modules/contractApi.js
  6. 29 0
      src/api/modules/roadshowApi.js
  7. 34 1
      src/api/modules/setApi.js
  8. 25 6
      src/components/calendar.vue
  9. 55 6
      src/components/searchDistPicker.vue
  10. 19 1
      src/routes/modules/contractRoutes.js
  11. 16 1
      src/routes/modules/ficcXcxRoutes.js
  12. 4225 0
      src/utils/distpicker.js
  13. 12 2
      src/views/Home.vue
  14. 19 5
      src/views/business_ETA_manage/addBusiness.vue
  15. 14 1
      src/views/business_ETA_manage/businessDetail.vue
  16. 70 12
      src/views/business_ETA_manage/businessEdit.vue
  17. 17 2
      src/views/business_ETA_manage/businessList.vue
  18. 30 10
      src/views/business_ETA_manage/components/AddRenewal.vue
  19. 134 0
      src/views/contract_manage/components/tableColums.js
  20. 326 0
      src/views/contract_manage/paymentRecords.vue
  21. 335 0
      src/views/contract_manage/refundRecord.vue
  22. 2 2
      src/views/custom_manage/customList/applyTurn.vue
  23. 1 2
      src/views/custom_manage/customList/components/raiPermissionbox.vue
  24. 1 0
      src/views/custom_manage/customList/customDetail.vue
  25. 6 0
      src/views/custom_manage/customList/customShareList.vue
  26. 2 5
      src/views/custom_manage/customList/editCustom.vue
  27. 1 1
      src/views/custom_manage/customList/mixins/quartersMixin.js
  28. 2 2
      src/views/custom_manage/customList/updateServe.vue
  29. 1 0
      src/views/custom_manage/points/AddNewEntries.vue
  30. 12 1
      src/views/custom_manage/points/EntryRecords.vue
  31. 2 2
      src/views/ficc_manage/chapterVariety.vue
  32. 0 1
      src/views/interaction_manage/bannerStatistics.vue
  33. 7 2
      src/views/interaction_manage/components/connectiveReportDialog.vue
  34. 104 0
      src/views/interaction_manage/components/moneyDetailsChart.vue
  35. 155 0
      src/views/interaction_manage/registrationDetails.vue
  36. 98 0
      src/views/interaction_manage/researchStatistics.vue
  37. 30 6
      src/views/interaction_manage/videoManage.vue
  38. 1 1
      src/views/rai_manage/activityManage/activityManage.vue
  39. 0 1
      src/views/rai_manage/components/addSummary.vue
  40. 14 9
      src/views/rai_manage/reportManage/yanXuanSpecial.vue
  41. 40 41
      src/views/report_manage/dayilyNews.vue
  42. 17 2
      src/views/research_manage/shareRecord.vue
  43. 93 43
      src/views/roadshow_manage/compononts/addActivityBtnDia.vue
  44. 100 35
      src/views/roadshow_manage/compononts/addActivityCellDia.vue
  45. 208 0
      src/views/roadshow_manage/compononts/addParticipateDia.vue
  46. 113 0
      src/views/roadshow_manage/compononts/showParticipateListDia.vue
  47. 13 6
      src/views/roadshow_manage/feedbackList.vue
  48. 58 15
      src/views/roadshow_manage/myCalendar.vue
  49. 10 1
      src/views/roadshow_manage/researcherBusinessTrip.vue
  50. 9 1
      src/views/roadshow_manage/researcherCalendar.vue
  51. 9 4
      src/views/roadshow_manage/roleConfig/activityBtnDiaConfig.js
  52. 11 6
      src/views/roadshow_manage/roleConfig/activityCellDiaConfig.js
  53. 14 1
      src/views/roadshow_manage/roleConfig/index.js
  54. 53 9
      src/views/roadshow_manage/roleConfig/mixins.js
  55. 10 1
      src/views/roadshow_manage/statistics/specialSeller.vue

+ 2 - 1
config/dev.env.js

@@ -11,5 +11,6 @@ module.exports = merge(prodEnv, {
   HR_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8391/login"',
   FINANCIAL_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8618/login"',
   ETA_SYSTEM:'"http://8.136.199.33:7778/temppage"',
-  CYGX_WEB:'"https://clpttest.hzinsights.com"' // 查研观向网页版首页地址
+  CYGX_WEB:'"https://clpttest.hzinsights.com"', // 查研观向网页版首页地址
+  ETA_Forum:'"http://8.136.199.33:8900/autoLogin"',//ETA社区
 });

+ 2 - 1
config/prod.env.js

@@ -7,5 +7,6 @@ module.exports = {
 	HR_MANAGEMENT_SYSTEM:'"https://hr.hzinsights.com/login"',
 	FINANCIAL_MANAGEMENT_SYSTEM:'"https://fms.hzinsights.com/login"',
 	ETA_SYSTEM:'"https://eta.hzinsights.com/temppage"',
-	CYGX_WEB:'"https://web.hzinsights.com"' // 查研观向网页版首页地址
+	CYGX_WEB:'"https://web.hzinsights.com"', // 查研观向网页版首页地址
+	ETA_Forum:'"https://forumadmin.hzinsights.com/autoLogin"',//ETA社区
 }

+ 2 - 1
config/prod.test.env.js

@@ -9,5 +9,6 @@ module.exports = {
 	HR_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8391/login"',
   FINANCIAL_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8618/login"',
   ETA_SYSTEM:'"http://8.136.199.33:7778/temppage"',
-	CYGX_WEB:'"https://clpttest.hzinsights.com"' // 查研观向网页版首页地址
+	CYGX_WEB:'"https://clpttest.hzinsights.com"', // 查研观向网页版首页地址
+	ETA_Forum:'"http://8.136.199.33:8900/autoLogin"',//ETA社区
 }

+ 19 - 0
src/api/modules/businessCustom.js

@@ -51,6 +51,25 @@ export const businessCustomInterence = {
     addNewContract:(params)=>{
         return http.post('/eta_business/signing',params)
     },
+    /** 
+     * 编辑续约
+     * @param EtaBusinessId Integer 商家ID
+     * @param EtaBusinessContractId Integer 商家合约ID
+     * @param SigningTime String 签约时间
+     * @param ExpiredTime String 到期时间
+     * @returns 
+    */
+    editContract:(params)=>{
+        return http.post('/eta_business/edit_sign',params)
+    },
+    /**
+     * 删除续约信息
+     * @param EtaBusinessContractId Integer 商家合约ID
+     * @returns 
+     */
+    removeContract:(params)=>{
+        return http.post('/eta_business/remove_sign',params)
+    },
     /**
      * 修改销售
      * @param EtaBusinessId Integer 商家ID

+ 16 - 2
src/api/modules/contractApi.js

@@ -245,8 +245,22 @@ const contractInterface={
 	getAllocationStatistic:params=>{
 		return http.get('/cygx/allocation/statistics',params)
 	},
-
-	
+	// 订单列表接口
+	getOrderList:params=>{
+		return http.get('/cygx/order/list',params)
+	},
+	// 退款
+	orderRefund:params=>{
+		return http.post('/cygx/order/refund',params)
+	},
+	// 退款记录
+	orderRefundList:params=>{
+		return http.get('/cygx/order/refund/list',params)
+	},
+	// 退款撤销接口
+	refundRevokeOrder:params=>{
+		return http.get('/cygx/order/refund_revoke',params)
+	},
 }
 
 export {

+ 29 - 0
src/api/modules/roadshowApi.js

@@ -195,6 +195,35 @@ const roadshowInterence={
 		return http.get('/roadshow/matters/list',params)
 	},
 
+	/**
+	 * 新增参会名单
+	 * @param {Object} params 
+	 * @param {Number} params.RsCalendarId 日程ID
+	 * @param {Number[]} params.UserId 用户ID
+	 * @returns 
+	 */
+	addMeetingUser:params=>{
+		return http.post('/roadshow/rs_calendar_meeting_user/add',params)
+	},
+	/**
+	 * 参会名单列表
+	 * @param {Object} params 
+	 * @param {Number} params.RsCalendarId
+	 * @returns 
+	 */
+	getMeetingUserList:params=>{
+		return http.get('/roadshow/rs_calendar_meeting_user/list',params)
+	},
+	/**
+	 * 删除参会名单
+	 * @param {Object} params 
+	 * @param {Number} params.RsCalendarMeetingUserId
+	 * @returns 
+	 */
+	deleteMeetingUser:params=>{
+		return http.post('/roadshow/rs_calendar_meeting_user/delete',params)
+	},
+
 	/* ==================  路演统计 ================= */
 	/**
 	 * 研究员统计

+ 34 - 1
src/api/modules/setApi.js

@@ -325,7 +325,40 @@ const departInterence = {
 	 */
 	getBannerStatistic:params=>{
 		return http.get('/banner/statistic',params)
-	}
+	},
+	/**
+	 * 调研报名统计
+	 * @returns 
+	 */
+	getResearchStatistics:params=>{
+		return http.get('/banner/research_statistics/list',params)
+	},
+	/**
+	 * 调研报名统计-活动报名详情
+	 * @returns 
+	 */
+	getResearchStatisticsItem:params=>{
+		return http.get('/banner/research_statistics/item',params)
+	},
+	/**
+	 * 调研报名统计-分享人报名详情
+	 * @returns 
+	 */
+	getResearchStatisticsDetail:params=>{
+		return http.get('/banner/research_statistics/detail',params)
+	},
+	/**
+	 * 调研报名修改付款金额
+	 * @returns 
+	 */
+	getResearchStatisticsAmount:params=>{
+		return http.get('/banner/research_statistics/amount',params)
+	},
+
+	//获取跳转到ETA社区的code
+	getToETAForumCode:()=>{
+		return http.get('/sysuser/forum_admin/auth_code',{})
+	},
 }
 
 /* 视频管理 */

+ 25 - 6
src/components/calendar.vue

@@ -345,7 +345,7 @@ export default {
         }]
         //根据ActivityType判断是什么类型,根据RoadshowType展示对应信息
         const {ActivityType,RoadshowType} = this.selectEventInfo
-        const {Province,City} = this.selectEventInfo
+        const {Province,City,District} = this.selectEventInfo
         //ActivityType为路演时,需要显示的内容
         const {RoadshowPlatform,CompanyName,CompanyStatus} = this.selectEventInfo
         const RoadshowContent = [{
@@ -356,7 +356,7 @@ export default {
         },{
             key:'RoadshowCity',
             label:'路演城市:',
-            content:`${Province}${City}`,
+            content:`${Province}${City}${District}`,
             RoadshowType:'线下'
         },{
             key:'CompanyName',
@@ -388,6 +388,23 @@ export default {
                 content:`${CooperationName}`,
                 RoadshowType:RoadshowType
             }].filter(item=>item.RoadshowType===RoadshowType)
+         const SalonContent = [
+            {
+                key:'RoadshowPlatform',
+                label:'会议平台:',
+                content:`${RoadshowPlatform}`,
+                RoadshowType:'线上'
+            },{
+                key:'RoadshowCity',
+                label:'会议城市:',
+                content:`${Province}${City}`,
+                RoadshowType:'线下'
+            },{
+                key:'Theme',
+                label:'会议主题:',
+                content:`${Theme}`,
+                RoadshowType:RoadshowType
+            }].filter(item=>item.RoadshowType===RoadshowType)
         ////ActivityType不为空时,需要显示的内容
         const {ResearcherName,SysUserRealName} = this.selectEventInfo
         const SuppleContent=[{
@@ -415,6 +432,7 @@ export default {
         const contentMap = {
             '路演':RoadshowContent,
             '公开会议':MeetingContent,
+            '沙龙':SalonContent,
         }
         if(ActivityType){
             this.popContentArr = [...popContent,...contentMap[ActivityType]||[],...SuppleContent]
@@ -468,9 +486,9 @@ export default {
     // 处理赋值函数
     getReservationList() {
       const arr = this.eventList.map((item) => {
-        let title = (this.isSeller && item.ActivityType==='路演')
+        let title = (this.isSeller && (item.ActivityType==='路演'))
         ? `${item.CompanyName}${item.CompanyStatus ? '('+ item.CompanyStatus + ')' : ''}` 
-        : (this.isSeller && item.ActivityType==='公开会议')
+        : (this.isSeller && (item.ActivityType==='公开会议' || item.ActivityType==='沙龙'))
         ? item.Theme 
         : this.setDynamicTitle(item);
 
@@ -493,7 +511,6 @@ export default {
         };
       });
       this.calendarOptions.events = arr
-      console.log(this.eventList)
     },
 
     /* 拆分出活动id相同的数组和不同的数组 */
@@ -561,13 +578,14 @@ export default {
     },
 
     // 拼接标题 type 内部会议 公开会议 路演 报告电话会 事项
-    setDynamicTitle({ActivityType,RsMattersId,MatterContent,RoadshowType,RoadshowPlatform,Province,City,ActivityCategory,Source,Title}) {
+    setDynamicTitle({ActivityType,RsMattersId,MatterContent,RoadshowType,RoadshowPlatform,Province,City,ActivityCategory,Source,Title,Theme}) {
 
       //第三方添加的日历活动
       if(Source === 1) return Title;
 
       switch(ActivityType || RsMattersId) {
         case '内部会议': return ActivityType;
+        case '沙龙': return Theme;
         case '公开会议': return `${RoadshowType}${ActivityType}(${RoadshowType==='线上' ? RoadshowPlatform : Province+City})`;
         case '路演': return `${RoadshowType}${ActivityType}(${RoadshowType==='线上' ? RoadshowPlatform : Province+City})`;
         case '报告电话会': return `${ActivityCategory}电话会`;
@@ -582,6 +600,7 @@ export default {
 
   },
   mounted() {
+    console.log(112233,'bushizhegyemian');
     this.getCalendarApi();
     // this.today()
     this.toogelDate('today');

+ 55 - 6
src/components/searchDistPicker.vue

@@ -24,7 +24,7 @@
             v-model="city"
             value-key="cityKey"
             :disabled="disabled"
-            @change="handleSelectChange"
+            @change="handleSelectChange('city')"
         >
             <el-option
                 v-for="city in citySource"
@@ -33,11 +33,27 @@
                 :value="city"
             />
         </el-select>
+        <!-- 区选择器 -->
+        <el-select v-if="showArea"
+            placeholder="请选择区"
+            filterable
+            v-model="area"
+            value-key="areaKey"
+            :disabled="disabled"
+            @change="handleSelectChange"
+        >
+            <el-option
+                v-for="area in areaSource"
+                :key="area.areaKey"
+                :label="area.areaName"
+                :value="area"
+            />
+        </el-select>
     </div>
 </template>
 
 <script>
-import {province_sorce,city_sorce} from '@/utils/distpicker';
+import {province_sorce,city_sorce,area_sorce} from '@/utils/distpicker';
 export default {
     props:{
         provinceInfo:{
@@ -51,6 +67,14 @@ export default {
         disabled:{
             type:Boolean,
             default:false
+        },
+        showArea:{
+            type:Boolean,
+            default:false
+        },
+        areaInfo:{
+            type:String,
+            default:''
         }
     },
     data() {
@@ -63,6 +87,10 @@ export default {
                 cityKey:'',
                 cityName:''
             },
+            area:{
+                areaKey:'',
+                areaName:''
+            }
         };
     },
     watch:{
@@ -78,9 +106,16 @@ export default {
                     }else{
                         this.city = {cityKey:'',cityName:this.cityInfo}
                     }
+                    if(this.city.cityKey){
+                        const areaResult = Object.entries(area_sorce[this.city.cityKey]).find(([key,val])=>val===this.areaInfo)||['',this.areaInfo]
+                        this.area={areaKey:areaResult[0],areaName:areaResult[1]}
+                    }else{
+                        this.area={areaKey:'',areaName:this.areaInfo}
+                    }
                 }else{
                     this.province={provinceKey:'',provinceName:''}
                     this.city={cityKey:'',cityName:''}
+                    this.area={areaKey:'',areaName:''}
                 }
             },
             immediate:true
@@ -104,17 +139,31 @@ export default {
                             cityName:cityMap[cityKey]||''
                         }
                     })
+        },
+        areaSource(){
+            const areaMap = area_sorce[this.city.cityKey]||{}
+            return Object.keys(areaMap).map(areaKey=>{
+                        return {
+                            areaKey:areaKey||'',
+                            areaName:areaMap[areaKey]||''
+                        }
+                    })
         }
     },
     methods: {
         handleSelectChange(type){
             if(type==='province'){
                 this.city = {cityKey:'',cityName:''}
+                this.area = {areaKey:'',areaName:''}
             }
-            this.$emit('selected',{province:{value:this.province.provinceName},
-                city:{
-                    value:this.city.cityName
-                }})
+            if(type==='city'&&this.showArea){
+                this.area = {areaKey:'',areaName:''}
+            }
+            this.$emit('selected',{
+                province:{value:this.province.provinceName},
+                city:{value:this.city.cityName},
+                area:{value:this.area.areaName}
+            })
         }
     },
 };

+ 19 - 1
src/routes/modules/contractRoutes.js

@@ -167,7 +167,25 @@ export default [
 				meta: {
 					keepAlive: false
 				}
-			}
+			},
+			{
+				path:"paymentRecords",
+				component:()=>import("@/views/contract_manage/paymentRecords.vue"),
+				name:"研选支付记录",
+				hidden:false,
+				meta: {
+					keepAlive: false
+				}
+			},
+			{
+				path:"refundRecord",
+				component:()=>import("@/views/contract_manage/refundRecord.vue"),
+				name:"研选退款记录",
+				hidden:false,
+				meta: {
+					keepAlive: false
+				}
+			},
 		]
 	},
 ]

+ 16 - 1
src/routes/modules/ficcXcxRoutes.js

@@ -112,7 +112,22 @@ export default [
 				  pathName: "报告分类配置",
 				},
 			  },
-
+			{
+				path:'researchStatisticsFICC',
+				component:()=> import('@/views/interaction_manage/researchStatistics.vue'),
+				name:'调研报名统计',
+				hidden:true
+			},
+			{
+				path:'registrationDetails',
+				component:()=> import('@/views/interaction_manage/registrationDetails.vue'),
+				name:'报名详情',
+				hidden:true,
+				meta: {
+					pathFrom: "researchStatisticsFICC",
+					pathName: "调研报名统计",
+				}
+			},
         ]
     }
 ]

+ 4225 - 0
src/utils/distpicker.js

@@ -1,4 +1,5 @@
 //v-distpicker的数据源
+//https://github.com/jcc/v-distpicker/blob/master/src/districts.js
 //省
 export const province_sorce = {
   "110000": "北京市",
@@ -477,4 +478,4228 @@ export const city_sorce = {
     "900100": "其它市",
     "900200": "新加坡"
   }
+}
+export const area_sorce =  {
+    110100: {
+      110101: '东城区',
+      110102: '西城区',
+      110105: '朝阳区',
+      110106: '丰台区',
+      110107: '石景山区',
+      110108: '海淀区',
+      110109: '门头沟区',
+      110111: '房山区',
+      110112: '通州区',
+      110113: '顺义区',
+      110114: '昌平区',
+      110115: '大兴区',
+      110116: '怀柔区',
+      110117: '平谷区',
+      110118: '密云区',
+      110119: '延庆区',
+    },
+    120100: {
+      120101: '和平区',
+      120102: '河东区',
+      120103: '河西区',
+      120104: '南开区',
+      120105: '河北区',
+      120106: '红桥区',
+      120110: '东丽区',
+      120111: '西青区',
+      120112: '津南区',
+      120113: '北辰区',
+      120114: '武清区',
+      120115: '宝坻区',
+      120116: '滨海新区',
+      120117: '宁河区',
+      120118: '静海区',
+      120119: '蓟州区',
+    },
+    130100: {
+      130102: '长安区',
+      130104: '桥西区',
+      130105: '新华区',
+      130107: '井陉矿区',
+      130108: '裕华区',
+      130109: '藁城区',
+      130110: '鹿泉区',
+      130111: '栾城区',
+      130121: '井陉县',
+      130123: '正定县',
+      130125: '行唐县',
+      130126: '灵寿县',
+      130127: '高邑县',
+      130128: '深泽县',
+      130129: '赞皇县',
+      130130: '无极县',
+      130131: '平山县',
+      130132: '元氏县',
+      130133: '赵县',
+      130171: '石家庄高新技术产业开发区',
+      130172: '石家庄循环化工园区',
+      130181: '辛集市',
+      130183: '晋州市',
+      130184: '新乐市',
+    },
+    130200: {
+      130202: '路南区',
+      130203: '路北区',
+      130204: '古冶区',
+      130205: '开平区',
+      130207: '丰南区',
+      130208: '丰润区',
+      130209: '曹妃甸区',
+      130224: '滦南县',
+      130225: '乐亭县',
+      130227: '迁西县',
+      130229: '玉田县',
+      130271: '河北唐山芦台经济开发区',
+      130272: '唐山市汉沽管理区',
+      130273: '唐山高新技术产业开发区',
+      130274: '河北唐山海港经济开发区',
+      130281: '遵化市',
+      130283: '迁安市',
+      130284: '滦州市',
+    },
+    130300: {
+      130302: '海港区',
+      130303: '山海关区',
+      130304: '北戴河区',
+      130306: '抚宁区',
+      130321: '青龙满族自治县',
+      130322: '昌黎县',
+      130324: '卢龙县',
+      130371: '秦皇岛市经济技术开发区',
+      130372: '北戴河新区',
+    },
+    130400: {
+      130402: '邯山区',
+      130403: '丛台区',
+      130404: '复兴区',
+      130406: '峰峰矿区',
+      130407: '肥乡区',
+      130408: '永年区',
+      130423: '临漳县',
+      130424: '成安县',
+      130425: '大名县',
+      130426: '涉县',
+      130427: '磁县',
+      130430: '邱县',
+      130431: '鸡泽县',
+      130432: '广平县',
+      130433: '馆陶县',
+      130434: '魏县',
+      130435: '曲周县',
+      130471: '邯郸经济技术开发区',
+      130473: '邯郸冀南新区',
+      130481: '武安市',
+    },
+    130500: {
+      130502: '襄都区',
+      130503: '信都区',
+      130505: '任泽区',
+      130506: '南和区',
+      130522: '临城县',
+      130523: '内丘县',
+      130524: '柏乡县',
+      130525: '隆尧县',
+      130528: '宁晋县',
+      130529: '巨鹿县',
+      130530: '新河县',
+      130531: '广宗县',
+      130532: '平乡县',
+      130533: '威县',
+      130534: '清河县',
+      130535: '临西县',
+      130571: '河北邢台经济开发区',
+      130581: '南宫市',
+      130582: '沙河市',
+    },
+    130600: {
+      130602: '竞秀区',
+      130606: '莲池区',
+      130607: '满城区',
+      130608: '清苑区',
+      130609: '徐水区',
+      130623: '涞水县',
+      130624: '阜平县',
+      130626: '定兴县',
+      130627: '唐县',
+      130628: '高阳县',
+      130629: '容城县',
+      130630: '涞源县',
+      130631: '望都县',
+      130632: '安新县',
+      130633: '易县',
+      130634: '曲阳县',
+      130635: '蠡县',
+      130636: '顺平县',
+      130637: '博野县',
+      130638: '雄县',
+      130671: '保定高新技术产业开发区',
+      130672: '保定白沟新城',
+      130681: '涿州市',
+      130682: '定州市',
+      130683: '安国市',
+      130684: '高碑店市',
+    },
+    130700: {
+      130702: '桥东区',
+      130703: '桥西区',
+      130705: '宣化区',
+      130706: '下花园区',
+      130708: '万全区',
+      130709: '崇礼区',
+      130722: '张北县',
+      130723: '康保县',
+      130724: '沽源县',
+      130725: '尚义县',
+      130726: '蔚县',
+      130727: '阳原县',
+      130728: '怀安县',
+      130730: '怀来县',
+      130731: '涿鹿县',
+      130732: '赤城县',
+      130771: '张家口经济开发区',
+      130772: '张家口市察北管理区',
+      130773: '张家口市塞北管理区',
+    },
+    130800: {
+      130802: '双桥区',
+      130803: '双滦区',
+      130804: '鹰手营子矿区',
+      130821: '承德县',
+      130822: '兴隆县',
+      130824: '滦平县',
+      130825: '隆化县',
+      130826: '丰宁满族自治县',
+      130827: '宽城满族自治县',
+      130828: '围场满族蒙古族自治县',
+      130871: '承德高新技术产业开发区',
+      130881: '平泉市',
+    },
+    130900: {
+      130902: '新华区',
+      130903: '运河区',
+      130921: '沧县',
+      130922: '青县',
+      130923: '东光县',
+      130924: '海兴县',
+      130925: '盐山县',
+      130926: '肃宁县',
+      130927: '南皮县',
+      130928: '吴桥县',
+      130929: '献县',
+      130930: '孟村回族自治县',
+      130971: '河北沧州经济开发区',
+      130972: '沧州高新技术产业开发区',
+      130973: '沧州渤海新区',
+      130981: '泊头市',
+      130982: '任丘市',
+      130983: '黄骅市',
+      130984: '河间市',
+    },
+    131000: {
+      131002: '安次区',
+      131003: '广阳区',
+      131022: '固安县',
+      131023: '永清县',
+      131024: '香河县',
+      131025: '大城县',
+      131026: '文安县',
+      131028: '大厂回族自治县',
+      131071: '廊坊经济技术开发区',
+      131081: '霸州市',
+      131082: '三河市',
+    },
+    131100: {
+      131102: '桃城区',
+      131103: '冀州区',
+      131121: '枣强县',
+      131122: '武邑县',
+      131123: '武强县',
+      131124: '饶阳县',
+      131125: '安平县',
+      131126: '故城县',
+      131127: '景县',
+      131128: '阜城县',
+      131171: '河北衡水高新技术产业开发区',
+      131172: '衡水滨湖新区',
+      131182: '深州市',
+    },
+    140100: {
+      140105: '小店区',
+      140106: '迎泽区',
+      140107: '杏花岭区',
+      140108: '尖草坪区',
+      140109: '万柏林区',
+      140110: '晋源区',
+      140121: '清徐县',
+      140122: '阳曲县',
+      140123: '娄烦县',
+      140171: '山西转型综合改革示范区',
+      140181: '古交市',
+    },
+    140200: {
+      140212: '新荣区',
+      140213: '平城区',
+      140214: '云冈区',
+      140215: '云州区',
+      140221: '阳高县',
+      140222: '天镇县',
+      140223: '广灵县',
+      140224: '灵丘县',
+      140225: '浑源县',
+      140226: '左云县',
+      140271: '山西大同经济开发区',
+    },
+    140300: {
+      140302: '城区',
+      140303: '矿区',
+      140311: '郊区',
+      140321: '平定县',
+      140322: '盂县',
+    },
+    140400: {
+      140403: '潞州区',
+      140404: '上党区',
+      140405: '屯留区',
+      140406: '潞城区',
+      140423: '襄垣县',
+      140425: '平顺县',
+      140426: '黎城县',
+      140427: '壶关县',
+      140428: '长子县',
+      140429: '武乡县',
+      140430: '沁县',
+      140431: '沁源县',
+      140471: '山西长治高新技术产业园区',
+    },
+    140500: {
+      140502: '城区',
+      140521: '沁水县',
+      140522: '阳城县',
+      140524: '陵川县',
+      140525: '泽州县',
+      140581: '高平市',
+    },
+    140600: {
+      140602: '朔城区',
+      140603: '平鲁区',
+      140621: '山阴县',
+      140622: '应县',
+      140623: '右玉县',
+      140671: '山西朔州经济开发区',
+      140681: '怀仁市',
+    },
+    140700: {
+      140702: '榆次区',
+      140703: '太谷区',
+      140721: '榆社县',
+      140722: '左权县',
+      140723: '和顺县',
+      140724: '昔阳县',
+      140725: '寿阳县',
+      140727: '祁县',
+      140728: '平遥县',
+      140729: '灵石县',
+      140781: '介休市',
+    },
+    140800: {
+      140802: '盐湖区',
+      140821: '临猗县',
+      140822: '万荣县',
+      140823: '闻喜县',
+      140824: '稷山县',
+      140825: '新绛县',
+      140826: '绛县',
+      140827: '垣曲县',
+      140828: '夏县',
+      140829: '平陆县',
+      140830: '芮城县',
+      140881: '永济市',
+      140882: '河津市',
+    },
+    140900: {
+      140902: '忻府区',
+      140921: '定襄县',
+      140922: '五台县',
+      140923: '代县',
+      140924: '繁峙县',
+      140925: '宁武县',
+      140926: '静乐县',
+      140927: '神池县',
+      140928: '五寨县',
+      140929: '岢岚县',
+      140930: '河曲县',
+      140931: '保德县',
+      140932: '偏关县',
+      140971: '五台山风景名胜区',
+      140981: '原平市',
+    },
+    141000: {
+      141002: '尧都区',
+      141021: '曲沃县',
+      141022: '翼城县',
+      141023: '襄汾县',
+      141024: '洪洞县',
+      141025: '古县',
+      141026: '安泽县',
+      141027: '浮山县',
+      141028: '吉县',
+      141029: '乡宁县',
+      141030: '大宁县',
+      141031: '隰县',
+      141032: '永和县',
+      141033: '蒲县',
+      141034: '汾西县',
+      141081: '侯马市',
+      141082: '霍州市',
+    },
+    141100: {
+      141102: '离石区',
+      141121: '文水县',
+      141122: '交城县',
+      141123: '兴县',
+      141124: '临县',
+      141125: '柳林县',
+      141126: '石楼县',
+      141127: '岚县',
+      141128: '方山县',
+      141129: '中阳县',
+      141130: '交口县',
+      141181: '孝义市',
+      141182: '汾阳市',
+    },
+    150100: {
+      150102: '新城区',
+      150103: '回民区',
+      150104: '玉泉区',
+      150105: '赛罕区',
+      150121: '土默特左旗',
+      150122: '托克托县',
+      150123: '和林格尔县',
+      150124: '清水河县',
+      150125: '武川县',
+      150172: '呼和浩特经济技术开发区',
+    },
+    150200: {
+      150202: '东河区',
+      150203: '昆都仑区',
+      150204: '青山区',
+      150205: '石拐区',
+      150206: '白云鄂博矿区',
+      150207: '九原区',
+      150221: '土默特右旗',
+      150222: '固阳县',
+      150223: '达尔罕茂明安联合旗',
+      150271: '包头稀土高新技术产业开发区',
+    },
+    150300: {
+      150302: '海勃湾区',
+      150303: '海南区',
+      150304: '乌达区',
+    },
+    150400: {
+      150402: '红山区',
+      150403: '元宝山区',
+      150404: '松山区',
+      150421: '阿鲁科尔沁旗',
+      150422: '巴林左旗',
+      150423: '巴林右旗',
+      150424: '林西县',
+      150425: '克什克腾旗',
+      150426: '翁牛特旗',
+      150428: '喀喇沁旗',
+      150429: '宁城县',
+      150430: '敖汉旗',
+    },
+    150500: {
+      150502: '科尔沁区',
+      150521: '科尔沁左翼中旗',
+      150522: '科尔沁左翼后旗',
+      150523: '开鲁县',
+      150524: '库伦旗',
+      150525: '奈曼旗',
+      150526: '扎鲁特旗',
+      150571: '通辽经济技术开发区',
+      150581: '霍林郭勒市',
+    },
+    150600: {
+      150602: '东胜区',
+      150603: '康巴什区',
+      150621: '达拉特旗',
+      150622: '准格尔旗',
+      150623: '鄂托克前旗',
+      150624: '鄂托克旗',
+      150625: '杭锦旗',
+      150626: '乌审旗',
+      150627: '伊金霍洛旗',
+    },
+    150700: {
+      150702: '海拉尔区',
+      150703: '扎赉诺尔区',
+      150721: '阿荣旗',
+      150722: '莫力达瓦达斡尔族自治旗',
+      150723: '鄂伦春自治旗',
+      150724: '鄂温克族自治旗',
+      150725: '陈巴尔虎旗',
+      150726: '新巴尔虎左旗',
+      150727: '新巴尔虎右旗',
+      150781: '满洲里市',
+      150782: '牙克石市',
+      150783: '扎兰屯市',
+      150784: '额尔古纳市',
+      150785: '根河市',
+    },
+    150800: {
+      150802: '临河区',
+      150821: '五原县',
+      150822: '磴口县',
+      150823: '乌拉特前旗',
+      150824: '乌拉特中旗',
+      150825: '乌拉特后旗',
+      150826: '杭锦后旗',
+    },
+    150900: {
+      150902: '集宁区',
+      150921: '卓资县',
+      150922: '化德县',
+      150923: '商都县',
+      150924: '兴和县',
+      150925: '凉城县',
+      150926: '察哈尔右翼前旗',
+      150927: '察哈尔右翼中旗',
+      150928: '察哈尔右翼后旗',
+      150929: '四子王旗',
+      150981: '丰镇市',
+    },
+    152200: {
+      152201: '乌兰浩特市',
+      152202: '阿尔山市',
+      152221: '科尔沁右翼前旗',
+      152222: '科尔沁右翼中旗',
+      152223: '扎赉特旗',
+      152224: '突泉县',
+    },
+    152500: {
+      152501: '二连浩特市',
+      152502: '锡林浩特市',
+      152522: '阿巴嘎旗',
+      152523: '苏尼特左旗',
+      152524: '苏尼特右旗',
+      152525: '东乌珠穆沁旗',
+      152526: '西乌珠穆沁旗',
+      152527: '太仆寺旗',
+      152528: '镶黄旗',
+      152529: '正镶白旗',
+      152530: '正蓝旗',
+      152531: '多伦县',
+      152571: '乌拉盖管委会',
+    },
+    152900: {
+      152921: '阿拉善左旗',
+      152922: '阿拉善右旗',
+      152923: '额济纳旗',
+      152971: '内蒙古阿拉善高新技术产业开发区',
+    },
+    210100: {
+      210102: '和平区',
+      210103: '沈河区',
+      210104: '大东区',
+      210105: '皇姑区',
+      210106: '铁西区',
+      210111: '苏家屯区',
+      210112: '浑南区',
+      210113: '沈北新区',
+      210114: '于洪区',
+      210115: '辽中区',
+      210123: '康平县',
+      210124: '法库县',
+      210181: '新民市',
+    },
+    210200: {
+      210202: '中山区',
+      210203: '西岗区',
+      210204: '沙河口区',
+      210211: '甘井子区',
+      210212: '旅顺口区',
+      210213: '金州区',
+      210214: '普兰店区',
+      210224: '长海县',
+      210281: '瓦房店市',
+      210283: '庄河市',
+    },
+    210300: {
+      210302: '铁东区',
+      210303: '铁西区',
+      210304: '立山区',
+      210311: '千山区',
+      210321: '台安县',
+      210323: '岫岩满族自治县',
+      210381: '海城市',
+    },
+    210400: {
+      210402: '新抚区',
+      210403: '东洲区',
+      210404: '望花区',
+      210411: '顺城区',
+      210421: '抚顺县',
+      210422: '新宾满族自治县',
+      210423: '清原满族自治县',
+    },
+    210500: {
+      210502: '平山区',
+      210503: '溪湖区',
+      210504: '明山区',
+      210505: '南芬区',
+      210521: '本溪满族自治县',
+      210522: '桓仁满族自治县',
+    },
+    210600: {
+      210602: '元宝区',
+      210603: '振兴区',
+      210604: '振安区',
+      210624: '宽甸满族自治县',
+      210681: '东港市',
+      210682: '凤城市',
+    },
+    210700: {
+      210702: '古塔区',
+      210703: '凌河区',
+      210711: '太和区',
+      210726: '黑山县',
+      210727: '义县',
+      210781: '凌海市',
+      210782: '北镇市',
+    },
+    210800: {
+      210802: '站前区',
+      210803: '西市区',
+      210804: '鲅鱼圈区',
+      210811: '老边区',
+      210881: '盖州市',
+      210882: '大石桥市',
+    },
+    210900: {
+      210902: '海州区',
+      210903: '新邱区',
+      210904: '太平区',
+      210905: '清河门区',
+      210911: '细河区',
+      210921: '阜新蒙古族自治县',
+      210922: '彰武县',
+    },
+    211000: {
+      211002: '白塔区',
+      211003: '文圣区',
+      211004: '宏伟区',
+      211005: '弓长岭区',
+      211011: '太子河区',
+      211021: '辽阳县',
+      211081: '灯塔市',
+    },
+    211100: {
+      211102: '双台子区',
+      211103: '兴隆台区',
+      211104: '大洼区',
+      211122: '盘山县',
+    },
+    211200: {
+      211202: '银州区',
+      211204: '清河区',
+      211221: '铁岭县',
+      211223: '西丰县',
+      211224: '昌图县',
+      211281: '调兵山市',
+      211282: '开原市',
+    },
+    211300: {
+      211302: '双塔区',
+      211303: '龙城区',
+      211321: '朝阳县',
+      211322: '建平县',
+      211324: '喀喇沁左翼蒙古族自治县',
+      211381: '北票市',
+      211382: '凌源市',
+    },
+    211400: {
+      211402: '连山区',
+      211403: '龙港区',
+      211404: '南票区',
+      211421: '绥中县',
+      211422: '建昌县',
+      211481: '兴城市',
+    },
+    220100: {
+      220102: '南关区',
+      220103: '宽城区',
+      220104: '朝阳区',
+      220105: '二道区',
+      220106: '绿园区',
+      220112: '双阳区',
+      220113: '九台区',
+      220122: '农安县',
+      220171: '长春经济技术开发区',
+      220172: '长春净月高新技术产业开发区',
+      220173: '长春高新技术产业开发区',
+      220174: '长春汽车经济技术开发区',
+      220182: '榆树市',
+      220183: '德惠市',
+      220184: '公主岭市',
+    },
+    220200: {
+      220202: '昌邑区',
+      220203: '龙潭区',
+      220204: '船营区',
+      220211: '丰满区',
+      220221: '永吉县',
+      220271: '吉林经济开发区',
+      220272: '吉林高新技术产业开发区',
+      220273: '吉林中国新加坡食品区',
+      220281: '蛟河市',
+      220282: '桦甸市',
+      220283: '舒兰市',
+      220284: '磐石市',
+    },
+    220300: {
+      220302: '铁西区',
+      220303: '铁东区',
+      220322: '梨树县',
+      220323: '伊通满族自治县',
+      220382: '双辽市',
+    },
+    220400: {
+      220402: '龙山区',
+      220403: '西安区',
+      220421: '东丰县',
+      220422: '东辽县',
+    },
+    220500: {
+      220502: '东昌区',
+      220503: '二道江区',
+      220521: '通化县',
+      220523: '辉南县',
+      220524: '柳河县',
+      220581: '梅河口市',
+      220582: '集安市',
+    },
+    220600: {
+      220602: '浑江区',
+      220605: '江源区',
+      220621: '抚松县',
+      220622: '靖宇县',
+      220623: '长白朝鲜族自治县',
+      220681: '临江市',
+    },
+    220700: {
+      220702: '宁江区',
+      220721: '前郭尔罗斯蒙古族自治县',
+      220722: '长岭县',
+      220723: '乾安县',
+      220771: '吉林松原经济开发区',
+      220781: '扶余市',
+    },
+    220800: {
+      220802: '洮北区',
+      220821: '镇赉县',
+      220822: '通榆县',
+      220871: '吉林白城经济开发区',
+      220881: '洮南市',
+      220882: '大安市',
+    },
+    222400: {
+      222401: '延吉市',
+      222402: '图们市',
+      222403: '敦化市',
+      222404: '珲春市',
+      222405: '龙井市',
+      222406: '和龙市',
+      222424: '汪清县',
+      222426: '安图县',
+    },
+    230100: {
+      230102: '道里区',
+      230103: '南岗区',
+      230104: '道外区',
+      230108: '平房区',
+      230109: '松北区',
+      230110: '香坊区',
+      230111: '呼兰区',
+      230112: '阿城区',
+      230113: '双城区',
+      230123: '依兰县',
+      230124: '方正县',
+      230125: '宾县',
+      230126: '巴彦县',
+      230127: '木兰县',
+      230128: '通河县',
+      230129: '延寿县',
+      230183: '尚志市',
+      230184: '五常市',
+    },
+    230200: {
+      230202: '龙沙区',
+      230203: '建华区',
+      230204: '铁锋区',
+      230205: '昂昂溪区',
+      230206: '富拉尔基区',
+      230207: '碾子山区',
+      230208: '梅里斯达斡尔族区',
+      230221: '龙江县',
+      230223: '依安县',
+      230224: '泰来县',
+      230225: '甘南县',
+      230227: '富裕县',
+      230229: '克山县',
+      230230: '克东县',
+      230231: '拜泉县',
+      230281: '讷河市',
+    },
+    230300: {
+      230302: '鸡冠区',
+      230303: '恒山区',
+      230304: '滴道区',
+      230305: '梨树区',
+      230306: '城子河区',
+      230307: '麻山区',
+      230321: '鸡东县',
+      230381: '虎林市',
+      230382: '密山市',
+    },
+    230400: {
+      230402: '向阳区',
+      230403: '工农区',
+      230404: '南山区',
+      230405: '兴安区',
+      230406: '东山区',
+      230407: '兴山区',
+      230421: '萝北县',
+      230422: '绥滨县',
+    },
+    230500: {
+      230502: '尖山区',
+      230503: '岭东区',
+      230505: '四方台区',
+      230506: '宝山区',
+      230521: '集贤县',
+      230522: '友谊县',
+      230523: '宝清县',
+      230524: '饶河县',
+    },
+    230600: {
+      230602: '萨尔图区',
+      230603: '龙凤区',
+      230604: '让胡路区',
+      230605: '红岗区',
+      230606: '大同区',
+      230621: '肇州县',
+      230622: '肇源县',
+      230623: '林甸县',
+      230624: '杜尔伯特蒙古族自治县',
+      230671: '大庆高新技术产业开发区',
+    },
+    230700: {
+      230717: '伊美区',
+      230718: '乌翠区',
+      230719: '友好区',
+      230722: '嘉荫县',
+      230723: '汤旺县',
+      230724: '丰林县',
+      230725: '大箐山县',
+      230726: '南岔县',
+      230751: '金林区',
+      230781: '铁力市',
+    },
+    230800: {
+      230803: '向阳区',
+      230804: '前进区',
+      230805: '东风区',
+      230811: '郊区',
+      230822: '桦南县',
+      230826: '桦川县',
+      230828: '汤原县',
+      230881: '同江市',
+      230882: '富锦市',
+      230883: '抚远市',
+    },
+    230900: {
+      230902: '新兴区',
+      230903: '桃山区',
+      230904: '茄子河区',
+      230921: '勃利县',
+    },
+    231000: {
+      231002: '东安区',
+      231003: '阳明区',
+      231004: '爱民区',
+      231005: '西安区',
+      231025: '林口县',
+      231071: '牡丹江经济技术开发区',
+      231081: '绥芬河市',
+      231083: '海林市',
+      231084: '宁安市',
+      231085: '穆棱市',
+      231086: '东宁市',
+    },
+    231100: {
+      231102: '爱辉区',
+      231123: '逊克县',
+      231124: '孙吴县',
+      231181: '北安市',
+      231182: '五大连池市',
+      231183: '嫩江市',
+    },
+    231200: {
+      231202: '北林区',
+      231221: '望奎县',
+      231222: '兰西县',
+      231223: '青冈县',
+      231224: '庆安县',
+      231225: '明水县',
+      231226: '绥棱县',
+      231281: '安达市',
+      231282: '肇东市',
+      231283: '海伦市',
+    },
+    232700: {
+      232701: '漠河市',
+      232721: '呼玛县',
+      232722: '塔河县',
+      232761: '加格达奇区',
+      232762: '松岭区',
+      232763: '新林区',
+      232764: '呼中区',
+    },
+    310100: {
+      310101: '黄浦区',
+      310104: '徐汇区',
+      310105: '长宁区',
+      310106: '静安区',
+      310107: '普陀区',
+      310109: '虹口区',
+      310110: '杨浦区',
+      310112: '闵行区',
+      310113: '宝山区',
+      310114: '嘉定区',
+      310115: '浦东新区',
+      310116: '金山区',
+      310117: '松江区',
+      310118: '青浦区',
+      310120: '奉贤区',
+      310151: '崇明区',
+    },
+    320100: {
+      320102: '玄武区',
+      320104: '秦淮区',
+      320105: '建邺区',
+      320106: '鼓楼区',
+      320111: '浦口区',
+      320112: '江北新区',
+      320113: '栖霞区',
+      320114: '雨花台区',
+      320115: '江宁区',
+      320116: '六合区',
+      320117: '溧水区',
+      320118: '高淳区',
+    },
+    320200: {
+      320205: '锡山区',
+      320206: '惠山区',
+      320211: '滨湖区',
+      320213: '梁溪区',
+      320214: '新吴区',
+      320281: '江阴市',
+      320282: '宜兴市',
+    },
+    320300: {
+      320302: '鼓楼区',
+      320303: '云龙区',
+      320305: '贾汪区',
+      320311: '泉山区',
+      320312: '铜山区',
+      320321: '丰县',
+      320322: '沛县',
+      320324: '睢宁县',
+      320371: '徐州经济技术开发区',
+      320381: '新沂市',
+      320382: '邳州市',
+    },
+    320400: {
+      320402: '天宁区',
+      320404: '钟楼区',
+      320411: '新北区',
+      320412: '武进区',
+      320413: '金坛区',
+      320481: '溧阳市',
+    },
+    320500: {
+      320505: '虎丘区',
+      320506: '吴中区',
+      320507: '相城区',
+      320508: '姑苏区',
+      320509: '吴江区',
+      320571: '苏州工业园区',
+      320581: '常熟市',
+      320582: '张家港市',
+      320583: '昆山市',
+      320585: '太仓市',
+    },
+    320600: {
+      320612: '通州区',
+      320613: '崇川区',
+      320614: '海门区',
+      320623: '如东县',
+      320671: '南通经济技术开发区',
+      320681: '启东市',
+      320682: '如皋市',
+      320685: '海安市',
+    },
+    320700: {
+      320703: '连云区',
+      320706: '海州区',
+      320707: '赣榆区',
+      320722: '东海县',
+      320723: '灌云县',
+      320724: '灌南县',
+      320771: '连云港经济技术开发区',
+      320772: '连云港高新技术产业开发区',
+    },
+    320800: {
+      320803: '淮安区',
+      320804: '淮阴区',
+      320812: '清江浦区',
+      320813: '洪泽区',
+      320826: '涟水县',
+      320830: '盱眙县',
+      320831: '金湖县',
+      320871: '淮安经济技术开发区',
+    },
+    320900: {
+      320902: '亭湖区',
+      320903: '盐都区',
+      320904: '大丰区',
+      320921: '响水县',
+      320922: '滨海县',
+      320923: '阜宁县',
+      320924: '射阳县',
+      320925: '建湖县',
+      320971: '盐城经济技术开发区',
+      320981: '东台市',
+    },
+    321000: {
+      321002: '广陵区',
+      321003: '邗江区',
+      321012: '江都区',
+      321023: '宝应县',
+      321071: '扬州经济技术开发区',
+      321081: '仪征市',
+      321084: '高邮市',
+    },
+    321100: {
+      321102: '京口区',
+      321111: '润州区',
+      321112: '丹徒区',
+      321171: '镇江新区',
+      321181: '丹阳市',
+      321182: '扬中市',
+      321183: '句容市',
+    },
+    321200: {
+      321202: '海陵区',
+      321203: '高港区',
+      321204: '姜堰区',
+      321271: '泰州医药高新技术产业开发区',
+      321281: '兴化市',
+      321282: '靖江市',
+      321283: '泰兴市',
+    },
+    321300: {
+      321302: '宿城区',
+      321311: '宿豫区',
+      321322: '沭阳县',
+      321323: '泗阳县',
+      321324: '泗洪县',
+      321371: '宿迁经济技术开发区',
+    },
+    330100: {
+      330102: '上城区',
+      330105: '拱墅区',
+      330106: '西湖区',
+      330108: '滨江区',
+      330109: '萧山区',
+      330110: '余杭区',
+      330111: '富阳区',
+      330112: '临安区',
+      330113: '临平区',
+      330114: '钱塘区',
+      330122: '桐庐县',
+      330127: '淳安县',
+      330182: '建德市',
+    },
+    330200: {
+      330203: '海曙区',
+      330205: '江北区',
+      330206: '北仑区',
+      330211: '镇海区',
+      330212: '鄞州区',
+      330213: '奉化区',
+      330225: '象山县',
+      330226: '宁海县',
+      330281: '余姚市',
+      330282: '慈溪市',
+    },
+    330300: {
+      330302: '鹿城区',
+      330303: '龙湾区',
+      330304: '瓯海区',
+      330305: '洞头区',
+      330324: '永嘉县',
+      330326: '平阳县',
+      330327: '苍南县',
+      330328: '文成县',
+      330329: '泰顺县',
+      330371: '温州经济技术开发区',
+      330381: '瑞安市',
+      330382: '乐清市',
+      330383: '龙港市',
+    },
+    330400: {
+      330402: '南湖区',
+      330411: '秀洲区',
+      330421: '嘉善县',
+      330424: '海盐县',
+      330481: '海宁市',
+      330482: '平湖市',
+      330483: '桐乡市',
+    },
+    330500: {
+      330502: '吴兴区',
+      330503: '南浔区',
+      330521: '德清县',
+      330522: '长兴县',
+      330523: '安吉县',
+    },
+    330600: {
+      330602: '越城区',
+      330603: '柯桥区',
+      330604: '上虞区',
+      330624: '新昌县',
+      330681: '诸暨市',
+      330683: '嵊州市',
+    },
+    330700: {
+      330702: '婺城区',
+      330703: '金东区',
+      330723: '武义县',
+      330726: '浦江县',
+      330727: '磐安县',
+      330781: '兰溪市',
+      330782: '义乌市',
+      330783: '东阳市',
+      330784: '永康市',
+    },
+    330800: {
+      330802: '柯城区',
+      330803: '衢江区',
+      330822: '常山县',
+      330824: '开化县',
+      330825: '龙游县',
+      330881: '江山市',
+    },
+    330900: {
+      330902: '定海区',
+      330903: '普陀区',
+      330921: '岱山县',
+      330922: '嵊泗县',
+    },
+    331000: {
+      331002: '椒江区',
+      331003: '黄岩区',
+      331004: '路桥区',
+      331022: '三门县',
+      331023: '天台县',
+      331024: '仙居县',
+      331081: '温岭市',
+      331082: '临海市',
+      331083: '玉环市',
+    },
+    331100: {
+      331102: '莲都区',
+      331121: '青田县',
+      331122: '缙云县',
+      331123: '遂昌县',
+      331124: '松阳县',
+      331125: '云和县',
+      331126: '庆元县',
+      331127: '景宁畲族自治县',
+      331181: '龙泉市',
+    },
+    340100: {
+      340102: '瑶海区',
+      340103: '庐阳区',
+      340104: '蜀山区',
+      340111: '包河区',
+      340121: '长丰县',
+      340122: '肥东县',
+      340123: '肥西县',
+      340124: '庐江县',
+      340171: '合肥高新技术产业开发区',
+      340172: '合肥经济技术开发区',
+      340173: '合肥新站高新技术产业开发区',
+      340181: '巢湖市',
+    },
+    340200: {
+      340202: '镜湖区',
+      340207: '鸠江区',
+      340209: '弋江区',
+      340210: '湾沚区',
+      340212: '繁昌区',
+      340223: '南陵县',
+      340271: '芜湖经济技术开发区',
+      340272: '安徽芜湖三山经济开发区',
+      340281: '无为市',
+    },
+    340300: {
+      340302: '龙子湖区',
+      340303: '蚌山区',
+      340304: '禹会区',
+      340311: '淮上区',
+      340321: '怀远县',
+      340322: '五河县',
+      340323: '固镇县',
+      340371: '蚌埠市高新技术开发区',
+      340372: '蚌埠市经济开发区',
+    },
+    340400: {
+      340402: '大通区',
+      340403: '田家庵区',
+      340404: '谢家集区',
+      340405: '八公山区',
+      340406: '潘集区',
+      340421: '凤台县',
+      340422: '寿县',
+    },
+    340500: {
+      340503: '花山区',
+      340504: '雨山区',
+      340506: '博望区',
+      340521: '当涂县',
+      340522: '含山县',
+      340523: '和县',
+    },
+    340600: {
+      340602: '杜集区',
+      340603: '相山区',
+      340604: '烈山区',
+      340621: '濉溪县',
+    },
+    340700: {
+      340705: '铜官区',
+      340706: '义安区',
+      340711: '郊区',
+      340722: '枞阳县',
+    },
+    340800: {
+      340802: '迎江区',
+      340803: '大观区',
+      340811: '宜秀区',
+      340822: '怀宁县',
+      340825: '太湖县',
+      340826: '宿松县',
+      340827: '望江县',
+      340828: '岳西县',
+      340871: '安徽安庆经济开发区',
+      340881: '桐城市',
+      340882: '潜山市',
+    },
+    341000: {
+      341002: '屯溪区',
+      341003: '黄山区',
+      341004: '徽州区',
+      341021: '歙县',
+      341022: '休宁县',
+      341023: '黟县',
+      341024: '祁门县',
+    },
+    341100: {
+      341102: '琅琊区',
+      341103: '南谯区',
+      341122: '来安县',
+      341124: '全椒县',
+      341125: '定远县',
+      341126: '凤阳县',
+      341171: '中新苏滁高新技术产业开发区',
+      341172: '滁州经济技术开发区',
+      341181: '天长市',
+      341182: '明光市',
+    },
+    341200: {
+      341202: '颍州区',
+      341203: '颍东区',
+      341204: '颍泉区',
+      341221: '临泉县',
+      341222: '太和县',
+      341225: '阜南县',
+      341226: '颍上县',
+      341271: '阜阳合肥现代产业园区',
+      341272: '阜阳经济技术开发区',
+      341282: '界首市',
+    },
+    341300: {
+      341302: '埇桥区',
+      341321: '砀山县',
+      341322: '萧县',
+      341323: '灵璧县',
+      341324: '泗县',
+      341371: '宿州马鞍山现代产业园区',
+      341372: '宿州经济技术开发区',
+    },
+    341500: {
+      341502: '金安区',
+      341503: '裕安区',
+      341504: '叶集区',
+      341522: '霍邱县',
+      341523: '舒城县',
+      341524: '金寨县',
+      341525: '霍山县',
+    },
+    341600: {
+      341602: '谯城区',
+      341621: '涡阳县',
+      341622: '蒙城县',
+      341623: '利辛县',
+    },
+    341700: {
+      341702: '贵池区',
+      341721: '东至县',
+      341722: '石台县',
+      341723: '青阳县',
+    },
+    341800: {
+      341802: '宣州区',
+      341821: '郎溪县',
+      341823: '泾县',
+      341824: '绩溪县',
+      341825: '旌德县',
+      341871: '宣城市经济开发区',
+      341881: '宁国市',
+      341882: '广德市',
+    },
+    350100: {
+      350102: '鼓楼区',
+      350103: '台江区',
+      350104: '仓山区',
+      350105: '马尾区',
+      350111: '晋安区',
+      350112: '长乐区',
+      350121: '闽侯县',
+      350122: '连江县',
+      350123: '罗源县',
+      350124: '闽清县',
+      350125: '永泰县',
+      350128: '平潭县',
+      350181: '福清市',
+    },
+    350200: {
+      350203: '思明区',
+      350205: '海沧区',
+      350206: '湖里区',
+      350211: '集美区',
+      350212: '同安区',
+      350213: '翔安区',
+    },
+    350300: {
+      350302: '城厢区',
+      350303: '涵江区',
+      350304: '荔城区',
+      350305: '秀屿区',
+      350322: '仙游县',
+    },
+    350400: {
+      350404: '三元区',
+      350405: '沙县区',
+      350421: '明溪县',
+      350423: '清流县',
+      350424: '宁化县',
+      350425: '大田县',
+      350426: '尤溪县',
+      350428: '将乐县',
+      350429: '泰宁县',
+      350430: '建宁县',
+      350481: '永安市',
+    },
+    350500: {
+      350502: '鲤城区',
+      350503: '丰泽区',
+      350504: '洛江区',
+      350505: '泉港区',
+      350521: '惠安县',
+      350524: '安溪县',
+      350525: '永春县',
+      350526: '德化县',
+      350527: '金门县',
+      350581: '石狮市',
+      350582: '晋江市',
+      350583: '南安市',
+    },
+    350600: {
+      350602: '芗城区',
+      350603: '龙文区',
+      350604: '龙海区',
+      350605: '长泰区',
+      350622: '云霄县',
+      350623: '漳浦县',
+      350624: '诏安县',
+      350626: '东山县',
+      350627: '南靖县',
+      350628: '平和县',
+      350629: '华安县',
+    },
+    350700: {
+      350702: '延平区',
+      350703: '建阳区',
+      350721: '顺昌县',
+      350722: '浦城县',
+      350723: '光泽县',
+      350724: '松溪县',
+      350725: '政和县',
+      350781: '邵武市',
+      350782: '武夷山市',
+      350783: '建瓯市',
+    },
+    350800: {
+      350802: '新罗区',
+      350803: '永定区',
+      350821: '长汀县',
+      350823: '上杭县',
+      350824: '武平县',
+      350825: '连城县',
+      350881: '漳平市',
+    },
+    350900: {
+      350902: '蕉城区',
+      350921: '霞浦县',
+      350922: '古田县',
+      350923: '屏南县',
+      350924: '寿宁县',
+      350925: '周宁县',
+      350926: '柘荣县',
+      350981: '福安市',
+      350982: '福鼎市',
+    },
+    360100: {
+      360102: '东湖区',
+      360103: '西湖区',
+      360104: '青云谱区',
+      360111: '青山湖区',
+      360112: '新建区',
+      360113: '红谷滩区',
+      360121: '南昌县',
+      360123: '安义县',
+      360124: '进贤县',
+    },
+    360200: {
+      360202: '昌江区',
+      360203: '珠山区',
+      360222: '浮梁县',
+      360281: '乐平市',
+    },
+    360300: {
+      360302: '安源区',
+      360313: '湘东区',
+      360321: '莲花县',
+      360322: '上栗县',
+      360323: '芦溪县',
+    },
+    360400: {
+      360402: '濂溪区',
+      360403: '浔阳区',
+      360404: '柴桑区',
+      360423: '武宁县',
+      360424: '修水县',
+      360425: '永修县',
+      360426: '德安县',
+      360428: '都昌县',
+      360429: '湖口县',
+      360430: '彭泽县',
+      360481: '瑞昌市',
+      360482: '共青城市',
+      360483: '庐山市',
+    },
+    360500: {
+      360502: '渝水区',
+      360521: '分宜县',
+    },
+    360600: {
+      360602: '月湖区',
+      360603: '余江区',
+      360681: '贵溪市',
+    },
+    360700: {
+      360702: '章贡区',
+      360703: '南康区',
+      360704: '赣县区',
+      360722: '信丰县',
+      360723: '大余县',
+      360724: '上犹县',
+      360725: '崇义县',
+      360726: '安远县',
+      360728: '定南县',
+      360729: '全南县',
+      360730: '宁都县',
+      360731: '于都县',
+      360732: '兴国县',
+      360733: '会昌县',
+      360734: '寻乌县',
+      360735: '石城县',
+      360781: '瑞金市',
+      360783: '龙南市',
+    },
+    360800: {
+      360802: '吉州区',
+      360803: '青原区',
+      360821: '吉安县',
+      360822: '吉水县',
+      360823: '峡江县',
+      360824: '新干县',
+      360825: '永丰县',
+      360826: '泰和县',
+      360827: '遂川县',
+      360828: '万安县',
+      360829: '安福县',
+      360830: '永新县',
+      360881: '井冈山市',
+    },
+    360900: {
+      360902: '袁州区',
+      360921: '奉新县',
+      360922: '万载县',
+      360923: '上高县',
+      360924: '宜丰县',
+      360925: '靖安县',
+      360926: '铜鼓县',
+      360981: '丰城市',
+      360982: '樟树市',
+      360983: '高安市',
+    },
+    361000: {
+      361002: '临川区',
+      361003: '东乡区',
+      361021: '南城县',
+      361022: '黎川县',
+      361023: '南丰县',
+      361024: '崇仁县',
+      361025: '乐安县',
+      361026: '宜黄县',
+      361027: '金溪县',
+      361028: '资溪县',
+      361030: '广昌县',
+    },
+    361100: {
+      361102: '信州区',
+      361103: '广丰区',
+      361104: '广信区',
+      361123: '玉山县',
+      361124: '铅山县',
+      361125: '横峰县',
+      361126: '弋阳县',
+      361127: '余干县',
+      361128: '鄱阳县',
+      361129: '万年县',
+      361130: '婺源县',
+      361181: '德兴市',
+    },
+    370100: {
+      370102: '历下区',
+      370103: '市中区',
+      370104: '槐荫区',
+      370105: '天桥区',
+      370112: '历城区',
+      370113: '长清区',
+      370114: '章丘区',
+      370115: '济阳区',
+      370116: '莱芜区',
+      370117: '钢城区',
+      370124: '平阴县',
+      370126: '商河县',
+      370171: '济南高新技术产业开发区',
+    },
+    370200: {
+      370202: '市南区',
+      370203: '市北区',
+      370211: '黄岛区',
+      370212: '崂山区',
+      370213: '李沧区',
+      370214: '城阳区',
+      370215: '即墨区',
+      370271: '青岛高新技术产业开发区',
+      370281: '胶州市',
+      370283: '平度市',
+      370285: '莱西市',
+    },
+    370300: {
+      370302: '淄川区',
+      370303: '张店区',
+      370304: '博山区',
+      370305: '临淄区',
+      370306: '周村区',
+      370321: '桓台县',
+      370322: '高青县',
+      370323: '沂源县',
+    },
+    370400: {
+      370402: '市中区',
+      370403: '薛城区',
+      370404: '峄城区',
+      370405: '台儿庄区',
+      370406: '山亭区',
+      370481: '滕州市',
+    },
+    370500: {
+      370502: '东营区',
+      370503: '河口区',
+      370505: '垦利区',
+      370522: '利津县',
+      370523: '广饶县',
+      370571: '东营经济技术开发区',
+      370572: '东营港经济开发区',
+    },
+    370600: {
+      370602: '芝罘区',
+      370611: '福山区',
+      370612: '牟平区',
+      370613: '莱山区',
+      370614: '蓬莱区',
+      370671: '烟台高新技术产业开发区',
+      370672: '烟台经济技术开发区',
+      370681: '龙口市',
+      370682: '莱阳市',
+      370683: '莱州市',
+      370685: '招远市',
+      370686: '栖霞市',
+      370687: '海阳市',
+    },
+    370700: {
+      370702: '潍城区',
+      370703: '寒亭区',
+      370704: '坊子区',
+      370705: '奎文区',
+      370724: '临朐县',
+      370725: '昌乐县',
+      370772: '潍坊滨海经济技术开发区',
+      370781: '青州市',
+      370782: '诸城市',
+      370783: '寿光市',
+      370784: '安丘市',
+      370785: '高密市',
+      370786: '昌邑市',
+    },
+    370800: {
+      370811: '任城区',
+      370812: '兖州区',
+      370826: '微山县',
+      370827: '鱼台县',
+      370828: '金乡县',
+      370829: '嘉祥县',
+      370830: '汶上县',
+      370831: '泗水县',
+      370832: '梁山县',
+      370871: '济宁高新技术产业开发区',
+      370881: '曲阜市',
+      370883: '邹城市',
+    },
+    370900: {
+      370902: '泰山区',
+      370911: '岱岳区',
+      370921: '宁阳县',
+      370923: '东平县',
+      370982: '新泰市',
+      370983: '肥城市',
+    },
+    371000: {
+      371002: '环翠区',
+      371003: '文登区',
+      371071: '威海火炬高技术产业开发区',
+      371072: '威海经济技术开发区',
+      371073: '威海临港经济技术开发区',
+      371082: '荣成市',
+      371083: '乳山市',
+    },
+    371100: {
+      371102: '东港区',
+      371103: '岚山区',
+      371121: '五莲县',
+      371122: '莒县',
+      371171: '日照经济技术开发区',
+    },
+    371300: {
+      371302: '兰山区',
+      371311: '罗庄区',
+      371312: '河东区',
+      371321: '沂南县',
+      371322: '郯城县',
+      371323: '沂水县',
+      371324: '兰陵县',
+      371325: '费县',
+      371326: '平邑县',
+      371327: '莒南县',
+      371328: '蒙阴县',
+      371329: '临沭县',
+      371371: '临沂高新技术产业开发区',
+    },
+    371400: {
+      371402: '德城区',
+      371403: '陵城区',
+      371422: '宁津县',
+      371423: '庆云县',
+      371424: '临邑县',
+      371425: '齐河县',
+      371426: '平原县',
+      371427: '夏津县',
+      371428: '武城县',
+      371471: '德州经济技术开发区',
+      371472: '德州运河经济开发区',
+      371481: '乐陵市',
+      371482: '禹城市',
+    },
+    371500: {
+      371502: '东昌府区',
+      371503: '茌平区',
+      371521: '阳谷县',
+      371522: '莘县',
+      371524: '东阿县',
+      371525: '冠县',
+      371526: '高唐县',
+      371581: '临清市',
+    },
+    371600: {
+      371602: '滨城区',
+      371603: '沾化区',
+      371621: '惠民县',
+      371622: '阳信县',
+      371623: '无棣县',
+      371625: '博兴县',
+      371681: '邹平市',
+    },
+    371700: {
+      371702: '牡丹区',
+      371703: '定陶区',
+      371721: '曹县',
+      371722: '单县',
+      371723: '成武县',
+      371724: '巨野县',
+      371725: '郓城县',
+      371726: '鄄城县',
+      371728: '东明县',
+      371771: '菏泽经济技术开发区',
+      371772: '菏泽高新技术开发区',
+    },
+    410100: {
+      410102: '中原区',
+      410103: '二七区',
+      410104: '管城回族区',
+      410105: '金水区',
+      410106: '上街区',
+      410108: '惠济区',
+      410122: '中牟县',
+      410171: '郑州经济技术开发区',
+      410172: '郑州高新技术产业开发区',
+      410173: '郑州航空港经济综合实验区',
+      410181: '巩义市',
+      410182: '荥阳市',
+      410183: '新密市',
+      410184: '新郑市',
+      410185: '登封市',
+    },
+    410200: {
+      410202: '龙亭区',
+      410203: '顺河回族区',
+      410204: '鼓楼区',
+      410205: '禹王台区',
+      410212: '祥符区',
+      410221: '杞县',
+      410222: '通许县',
+      410223: '尉氏县',
+      410225: '兰考县',
+    },
+    410300: {
+      410302: '老城区',
+      410303: '西工区',
+      410304: '瀍河回族区',
+      410305: '涧西区',
+      410307: '偃师区',
+      410308: '孟津区',
+      410311: '洛龙区',
+      410323: '新安县',
+      410324: '栾川县',
+      410325: '嵩县',
+      410326: '汝阳县',
+      410327: '宜阳县',
+      410328: '洛宁县',
+      410329: '伊川县',
+      410371: '洛阳高新技术产业开发区',
+    },
+    410400: {
+      410402: '新华区',
+      410403: '卫东区',
+      410404: '石龙区',
+      410411: '湛河区',
+      410421: '宝丰县',
+      410422: '叶县',
+      410423: '鲁山县',
+      410425: '郏县',
+      410471: '平顶山高新技术产业开发区',
+      410472: '平顶山市城乡一体化示范区',
+      410481: '舞钢市',
+      410482: '汝州市',
+    },
+    410500: {
+      410502: '文峰区',
+      410503: '北关区',
+      410505: '殷都区',
+      410506: '龙安区',
+      410522: '安阳县',
+      410523: '汤阴县',
+      410526: '滑县',
+      410527: '内黄县',
+      410571: '安阳高新技术产业开发区',
+      410581: '林州市',
+    },
+    410600: {
+      410602: '鹤山区',
+      410603: '山城区',
+      410611: '淇滨区',
+      410621: '浚县',
+      410622: '淇县',
+      410671: '鹤壁经济技术开发区',
+    },
+    410700: {
+      410702: '红旗区',
+      410703: '卫滨区',
+      410704: '凤泉区',
+      410711: '牧野区',
+      410721: '新乡县',
+      410724: '获嘉县',
+      410725: '原阳县',
+      410726: '延津县',
+      410727: '封丘县',
+      410771: '新乡高新技术产业开发区',
+      410772: '新乡经济技术开发区',
+      410773: '新乡市平原城乡一体化示范区',
+      410781: '卫辉市',
+      410782: '辉县市',
+      410783: '长垣市',
+    },
+    410800: {
+      410802: '解放区',
+      410803: '中站区',
+      410804: '马村区',
+      410811: '山阳区',
+      410821: '修武县',
+      410822: '博爱县',
+      410823: '武陟县',
+      410825: '温县',
+      410871: '焦作城乡一体化示范区',
+      410882: '沁阳市',
+      410883: '孟州市',
+    },
+    410900: {
+      410902: '华龙区',
+      410922: '清丰县',
+      410923: '南乐县',
+      410926: '范县',
+      410927: '台前县',
+      410928: '濮阳县',
+      410971: '河南濮阳工业园区',
+      410972: '濮阳经济技术开发区',
+    },
+    411000: {
+      411002: '魏都区',
+      411003: '建安区',
+      411024: '鄢陵县',
+      411025: '襄城县',
+      411071: '许昌经济技术开发区',
+      411081: '禹州市',
+      411082: '长葛市',
+    },
+    411100: {
+      411102: '源汇区',
+      411103: '郾城区',
+      411104: '召陵区',
+      411121: '舞阳县',
+      411122: '临颍县',
+      411171: '漯河经济技术开发区',
+    },
+    411200: {
+      411202: '湖滨区',
+      411203: '陕州区',
+      411221: '渑池县',
+      411224: '卢氏县',
+      411271: '河南三门峡经济开发区',
+      411281: '义马市',
+      411282: '灵宝市',
+    },
+    411300: {
+      411302: '宛城区',
+      411303: '卧龙区',
+      411321: '南召县',
+      411322: '方城县',
+      411323: '西峡县',
+      411324: '镇平县',
+      411325: '内乡县',
+      411326: '淅川县',
+      411327: '社旗县',
+      411328: '唐河县',
+      411329: '新野县',
+      411330: '桐柏县',
+      411371: '南阳高新技术产业开发区',
+      411372: '南阳市城乡一体化示范区',
+      411381: '邓州市',
+    },
+    411400: {
+      411402: '梁园区',
+      411403: '睢阳区',
+      411421: '民权县',
+      411422: '睢县',
+      411423: '宁陵县',
+      411424: '柘城县',
+      411425: '虞城县',
+      411426: '夏邑县',
+      411471: '豫东综合物流产业聚集区',
+      411472: '河南商丘经济开发区',
+      411481: '永城市',
+    },
+    411500: {
+      411502: '浉河区',
+      411503: '平桥区',
+      411521: '罗山县',
+      411522: '光山县',
+      411523: '新县',
+      411524: '商城县',
+      411525: '固始县',
+      411526: '潢川县',
+      411527: '淮滨县',
+      411528: '息县',
+      411571: '信阳高新技术产业开发区',
+    },
+    411600: {
+      411602: '川汇区',
+      411603: '淮阳区',
+      411621: '扶沟县',
+      411622: '西华县',
+      411623: '商水县',
+      411624: '沈丘县',
+      411625: '郸城县',
+      411627: '太康县',
+      411628: '鹿邑县',
+      411671: '河南周口经济开发区',
+      411681: '项城市',
+    },
+    411700: {
+      411702: '驿城区',
+      411721: '西平县',
+      411722: '上蔡县',
+      411723: '平舆县',
+      411724: '正阳县',
+      411725: '确山县',
+      411726: '泌阳县',
+      411727: '汝南县',
+      411728: '遂平县',
+      411729: '新蔡县',
+      411771: '河南驻马店经济开发区',
+    },
+    419000: {
+      419001: '济源市',
+    },
+    420100: {
+      420102: '江岸区',
+      420103: '江汉区',
+      420104: '硚口区',
+      420105: '汉阳区',
+      420106: '武昌区',
+      420107: '青山区',
+      420111: '洪山区',
+      420112: '东西湖区',
+      420113: '汉南区',
+      420114: '蔡甸区',
+      420115: '江夏区',
+      420116: '黄陂区',
+      420117: '新洲区',
+    },
+    420200: {
+      420202: '黄石港区',
+      420203: '西塞山区',
+      420204: '下陆区',
+      420205: '铁山区',
+      420222: '阳新县',
+      420281: '大冶市',
+    },
+    420300: {
+      420302: '茅箭区',
+      420303: '张湾区',
+      420304: '郧阳区',
+      420322: '郧西县',
+      420323: '竹山县',
+      420324: '竹溪县',
+      420325: '房县',
+      420381: '丹江口市',
+    },
+    420500: {
+      420502: '西陵区',
+      420503: '伍家岗区',
+      420504: '点军区',
+      420505: '猇亭区',
+      420506: '夷陵区',
+      420525: '远安县',
+      420526: '兴山县',
+      420527: '秭归县',
+      420528: '长阳土家族自治县',
+      420529: '五峰土家族自治县',
+      420581: '宜都市',
+      420582: '当阳市',
+      420583: '枝江市',
+    },
+    420600: {
+      420602: '襄城区',
+      420606: '樊城区',
+      420607: '襄州区',
+      420624: '南漳县',
+      420625: '谷城县',
+      420626: '保康县',
+      420682: '老河口市',
+      420683: '枣阳市',
+      420684: '宜城市',
+    },
+    420700: {
+      420702: '梁子湖区',
+      420703: '华容区',
+      420704: '鄂城区',
+    },
+    420800: {
+      420802: '东宝区',
+      420804: '掇刀区',
+      420822: '沙洋县',
+      420881: '钟祥市',
+      420882: '京山市',
+    },
+    420900: {
+      420902: '孝南区',
+      420921: '孝昌县',
+      420922: '大悟县',
+      420923: '云梦县',
+      420981: '应城市',
+      420982: '安陆市',
+      420984: '汉川市',
+    },
+    421000: {
+      421002: '沙市区',
+      421003: '荆州区',
+      421022: '公安县',
+      421024: '江陵县',
+      421071: '荆州经济技术开发区',
+      421081: '石首市',
+      421083: '洪湖市',
+      421087: '松滋市',
+      421088: '监利市',
+    },
+    421100: {
+      421102: '黄州区',
+      421121: '团风县',
+      421122: '红安县',
+      421123: '罗田县',
+      421124: '英山县',
+      421125: '浠水县',
+      421126: '蕲春县',
+      421127: '黄梅县',
+      421171: '龙感湖管理区',
+      421181: '麻城市',
+      421182: '武穴市',
+    },
+    421200: {
+      421202: '咸安区',
+      421221: '嘉鱼县',
+      421222: '通城县',
+      421223: '崇阳县',
+      421224: '通山县',
+      421281: '赤壁市',
+    },
+    421300: {
+      421303: '曾都区',
+      421321: '随县',
+      421381: '广水市',
+    },
+    422800: {
+      422801: '恩施市',
+      422802: '利川市',
+      422822: '建始县',
+      422823: '巴东县',
+      422825: '宣恩县',
+      422826: '咸丰县',
+      422827: '来凤县',
+      422828: '鹤峰县',
+    },
+    429000: {
+      429004: '仙桃市',
+      429005: '潜江市',
+      429006: '天门市',
+      429021: '神农架林区',
+    },
+    430100: {
+      430102: '芙蓉区',
+      430103: '天心区',
+      430104: '岳麓区',
+      430105: '开福区',
+      430111: '雨花区',
+      430112: '望城区',
+      430121: '长沙县',
+      430181: '浏阳市',
+      430182: '宁乡市',
+    },
+    430200: {
+      430202: '荷塘区',
+      430203: '芦淞区',
+      430204: '石峰区',
+      430211: '天元区',
+      430212: '渌口区',
+      430223: '攸县',
+      430224: '茶陵县',
+      430225: '炎陵县',
+      430271: '云龙示范区',
+      430281: '醴陵市',
+    },
+    430300: {
+      430302: '雨湖区',
+      430304: '岳塘区',
+      430321: '湘潭县',
+      430371: '湖南湘潭高新技术产业园区',
+      430372: '湘潭昭山示范区',
+      430373: '湘潭九华示范区',
+      430381: '湘乡市',
+      430382: '韶山市',
+    },
+    430400: {
+      430405: '珠晖区',
+      430406: '雁峰区',
+      430407: '石鼓区',
+      430408: '蒸湘区',
+      430412: '南岳区',
+      430421: '衡阳县',
+      430422: '衡南县',
+      430423: '衡山县',
+      430424: '衡东县',
+      430426: '祁东县',
+      430471: '衡阳综合保税区',
+      430472: '湖南衡阳高新技术产业园区',
+      430473: '湖南衡阳松木经济开发区',
+      430481: '耒阳市',
+      430482: '常宁市',
+    },
+    430500: {
+      430502: '双清区',
+      430503: '大祥区',
+      430511: '北塔区',
+      430522: '新邵县',
+      430523: '邵阳县',
+      430524: '隆回县',
+      430525: '洞口县',
+      430527: '绥宁县',
+      430528: '新宁县',
+      430529: '城步苗族自治县',
+      430581: '武冈市',
+      430582: '邵东市',
+    },
+    430600: {
+      430602: '岳阳楼区',
+      430603: '云溪区',
+      430611: '君山区',
+      430621: '岳阳县',
+      430623: '华容县',
+      430624: '湘阴县',
+      430626: '平江县',
+      430671: '岳阳市屈原管理区',
+      430681: '汨罗市',
+      430682: '临湘市',
+    },
+    430700: {
+      430702: '武陵区',
+      430703: '鼎城区',
+      430721: '安乡县',
+      430722: '汉寿县',
+      430723: '澧县',
+      430724: '临澧县',
+      430725: '桃源县',
+      430726: '石门县',
+      430771: '常德市西洞庭管理区',
+      430781: '津市市',
+    },
+    430800: {
+      430802: '永定区',
+      430811: '武陵源区',
+      430821: '慈利县',
+      430822: '桑植县',
+    },
+    430900: {
+      430902: '资阳区',
+      430903: '赫山区',
+      430921: '南县',
+      430922: '桃江县',
+      430923: '安化县',
+      430971: '益阳市大通湖管理区',
+      430972: '湖南益阳高新技术产业园区',
+      430981: '沅江市',
+    },
+    431000: {
+      431002: '北湖区',
+      431003: '苏仙区',
+      431021: '桂阳县',
+      431022: '宜章县',
+      431023: '永兴县',
+      431024: '嘉禾县',
+      431025: '临武县',
+      431026: '汝城县',
+      431027: '桂东县',
+      431028: '安仁县',
+      431081: '资兴市',
+    },
+    431100: {
+      431102: '零陵区',
+      431103: '冷水滩区',
+      431122: '东安县',
+      431123: '双牌县',
+      431124: '道县',
+      431125: '江永县',
+      431126: '宁远县',
+      431127: '蓝山县',
+      431128: '新田县',
+      431129: '江华瑶族自治县',
+      431171: '永州经济技术开发区',
+      431173: '永州市回龙圩管理区',
+      431181: '祁阳市',
+    },
+    431200: {
+      431202: '鹤城区',
+      431221: '中方县',
+      431222: '沅陵县',
+      431223: '辰溪县',
+      431224: '溆浦县',
+      431225: '会同县',
+      431226: '麻阳苗族自治县',
+      431227: '新晃侗族自治县',
+      431228: '芷江侗族自治县',
+      431229: '靖州苗族侗族自治县',
+      431230: '通道侗族自治县',
+      431271: '怀化市洪江管理区',
+      431281: '洪江市',
+    },
+    431300: {
+      431302: '娄星区',
+      431321: '双峰县',
+      431322: '新化县',
+      431381: '冷水江市',
+      431382: '涟源市',
+    },
+    433100: {
+      433101: '吉首市',
+      433122: '泸溪县',
+      433123: '凤凰县',
+      433124: '花垣县',
+      433125: '保靖县',
+      433126: '古丈县',
+      433127: '永顺县',
+      433130: '龙山县',
+    },
+    440100: {
+      440103: '荔湾区',
+      440104: '越秀区',
+      440105: '海珠区',
+      440106: '天河区',
+      440111: '白云区',
+      440112: '黄埔区',
+      440113: '番禺区',
+      440114: '花都区',
+      440115: '南沙区',
+      440117: '从化区',
+      440118: '增城区',
+    },
+    440200: {
+      440203: '武江区',
+      440204: '浈江区',
+      440205: '曲江区',
+      440222: '始兴县',
+      440224: '仁化县',
+      440229: '翁源县',
+      440232: '乳源瑶族自治县',
+      440233: '新丰县',
+      440281: '乐昌市',
+      440282: '南雄市',
+    },
+    440300: {
+      440303: '罗湖区',
+      440304: '福田区',
+      440305: '南山区',
+      440306: '宝安区',
+      440307: '龙岗区',
+      440308: '盐田区',
+      440309: '龙华区',
+      440310: '坪山区',
+      440311: '光明区',
+    },
+    440400: {
+      440402: '香洲区',
+      440403: '斗门区',
+      440404: '金湾区',
+    },
+    440500: {
+      440507: '龙湖区',
+      440511: '金平区',
+      440512: '濠江区',
+      440513: '潮阳区',
+      440514: '潮南区',
+      440515: '澄海区',
+      440523: '南澳县',
+    },
+    440600: {
+      440604: '禅城区',
+      440605: '南海区',
+      440606: '顺德区',
+      440607: '三水区',
+      440608: '高明区',
+    },
+    440700: {
+      440703: '蓬江区',
+      440704: '江海区',
+      440705: '新会区',
+      440781: '台山市',
+      440783: '开平市',
+      440784: '鹤山市',
+      440785: '恩平市',
+    },
+    440800: {
+      440802: '赤坎区',
+      440803: '霞山区',
+      440804: '坡头区',
+      440811: '麻章区',
+      440823: '遂溪县',
+      440825: '徐闻县',
+      440881: '廉江市',
+      440882: '雷州市',
+      440883: '吴川市',
+    },
+    440900: {
+      440902: '茂南区',
+      440904: '电白区',
+      440981: '高州市',
+      440982: '化州市',
+      440983: '信宜市',
+    },
+    441200: {
+      441202: '端州区',
+      441203: '鼎湖区',
+      441204: '高要区',
+      441223: '广宁县',
+      441224: '怀集县',
+      441225: '封开县',
+      441226: '德庆县',
+      441284: '四会市',
+    },
+    441300: {
+      441302: '惠城区',
+      441303: '惠阳区',
+      441322: '博罗县',
+      441323: '惠东县',
+      441324: '龙门县',
+    },
+    441400: {
+      441402: '梅江区',
+      441403: '梅县区',
+      441422: '大埔县',
+      441423: '丰顺县',
+      441424: '五华县',
+      441426: '平远县',
+      441427: '蕉岭县',
+      441481: '兴宁市',
+    },
+    441500: {
+      441502: '城区',
+      441521: '海丰县',
+      441523: '陆河县',
+      441581: '陆丰市',
+    },
+    441600: {
+      441602: '源城区',
+      441621: '紫金县',
+      441622: '龙川县',
+      441623: '连平县',
+      441624: '和平县',
+      441625: '东源县',
+    },
+    441700: {
+      441702: '江城区',
+      441704: '阳东区',
+      441721: '阳西县',
+      441781: '阳春市',
+    },
+    441800: {
+      441802: '清城区',
+      441803: '清新区',
+      441821: '佛冈县',
+      441823: '阳山县',
+      441825: '连山壮族瑶族自治县',
+      441826: '连南瑶族自治县',
+      441881: '英德市',
+      441882: '连州市',
+    },
+    441900: {
+      44190011: '常平镇',
+      441900003: '东城街道',
+      441900004: '南城街道',
+      441900005: '万江街道',
+      441900006: '莞城街道',
+      441900101: '石碣镇',
+      441900102: '石龙镇',
+      441900103: '茶山镇',
+      441900104: '石排镇',
+      441900105: '企石镇',
+      441900106: '横沥镇',
+      441900107: '桥头镇',
+      441900108: '谢岗镇',
+      441900109: '东坑镇',
+      441900111: '寮步镇',
+      441900112: '樟木头镇',
+      441900113: '大朗镇',
+      441900114: '黄江镇',
+      441900115: '清溪镇',
+      441900116: '塘厦镇',
+      441900117: '凤岗镇',
+      441900118: '大岭山镇',
+      441900119: '长安镇',
+      441900121: '虎门镇',
+      441900122: '厚街镇',
+      441900123: '沙田镇',
+      441900124: '道滘镇',
+      441900125: '洪梅镇',
+      441900126: '麻涌镇',
+      441900127: '望牛墩镇',
+      441900128: '中堂镇',
+      441900129: '高埗镇',
+      441900401: '松山湖',
+      441900402: '东莞港',
+      441900403: '东莞生态园',
+      441900404: '东莞滨海湾新区',
+    },
+    442000: {
+      44200011: '横栏镇',
+      442000001: '石岐街道',
+      442000002: '东区街道',
+      442000003: '中山港街道',
+      442000004: '西区街道',
+      442000005: '南区街道',
+      442000006: '五桂山街道',
+      442000007: '民众街道',
+      442000008: '南朗街道',
+      442000101: '黄圃镇',
+      442000103: '东凤镇',
+      442000105: '古镇镇',
+      442000106: '沙溪镇',
+      442000107: '坦洲镇',
+      442000108: '港口镇',
+      442000109: '三角镇',
+      442000111: '南头镇',
+      442000112: '阜沙镇',
+      442000114: '三乡镇',
+      442000115: '板芙镇',
+      442000116: '大涌镇',
+      442000117: '神湾镇',
+      442000118: '小榄镇',
+    },
+    445100: {
+      445102: '湘桥区',
+      445103: '潮安区',
+      445122: '饶平县',
+    },
+    445200: {
+      445202: '榕城区',
+      445203: '揭东区',
+      445222: '揭西县',
+      445224: '惠来县',
+      445281: '普宁市',
+    },
+    445300: {
+      445302: '云城区',
+      445303: '云安区',
+      445321: '新兴县',
+      445322: '郁南县',
+      445381: '罗定市',
+    },
+    450100: {
+      450102: '兴宁区',
+      450103: '青秀区',
+      450105: '江南区',
+      450107: '西乡塘区',
+      450108: '良庆区',
+      450109: '邕宁区',
+      450110: '武鸣区',
+      450123: '隆安县',
+      450124: '马山县',
+      450125: '上林县',
+      450126: '宾阳县',
+      450181: '横州市',
+    },
+    450200: {
+      450202: '城中区',
+      450203: '鱼峰区',
+      450204: '柳南区',
+      450205: '柳北区',
+      450206: '柳江区',
+      450222: '柳城县',
+      450223: '鹿寨县',
+      450224: '融安县',
+      450225: '融水苗族自治县',
+      450226: '三江侗族自治县',
+    },
+    450300: {
+      450302: '秀峰区',
+      450303: '叠彩区',
+      450304: '象山区',
+      450305: '七星区',
+      450311: '雁山区',
+      450312: '临桂区',
+      450321: '阳朔县',
+      450323: '灵川县',
+      450324: '全州县',
+      450325: '兴安县',
+      450326: '永福县',
+      450327: '灌阳县',
+      450328: '龙胜各族自治县',
+      450329: '资源县',
+      450330: '平乐县',
+      450332: '恭城瑶族自治县',
+      450381: '荔浦市',
+    },
+    450400: {
+      450403: '万秀区',
+      450405: '长洲区',
+      450406: '龙圩区',
+      450421: '苍梧县',
+      450422: '藤县',
+      450423: '蒙山县',
+      450481: '岑溪市',
+    },
+    450500: {
+      450502: '海城区',
+      450503: '银海区',
+      450512: '铁山港区',
+      450521: '合浦县',
+    },
+    450600: {
+      450602: '港口区',
+      450603: '防城区',
+      450621: '上思县',
+      450681: '东兴市',
+    },
+    450700: {
+      450702: '钦南区',
+      450703: '钦北区',
+      450721: '灵山县',
+      450722: '浦北县',
+    },
+    450800: {
+      450802: '港北区',
+      450803: '港南区',
+      450804: '覃塘区',
+      450821: '平南县',
+      450881: '桂平市',
+    },
+    450900: {
+      450902: '玉州区',
+      450903: '福绵区',
+      450921: '容县',
+      450922: '陆川县',
+      450923: '博白县',
+      450924: '兴业县',
+      450981: '北流市',
+    },
+    451000: {
+      451002: '右江区',
+      451003: '田阳区',
+      451022: '田东县',
+      451024: '德保县',
+      451026: '那坡县',
+      451027: '凌云县',
+      451028: '乐业县',
+      451029: '田林县',
+      451030: '西林县',
+      451031: '隆林各族自治县',
+      451081: '靖西市',
+      451082: '平果市',
+    },
+    451100: {
+      451102: '八步区',
+      451103: '平桂区',
+      451121: '昭平县',
+      451122: '钟山县',
+      451123: '富川瑶族自治县',
+    },
+    451200: {
+      451202: '金城江区',
+      451203: '宜州区',
+      451221: '南丹县',
+      451222: '天峨县',
+      451223: '凤山县',
+      451224: '东兰县',
+      451225: '罗城仫佬族自治县',
+      451226: '环江毛南族自治县',
+      451227: '巴马瑶族自治县',
+      451228: '都安瑶族自治县',
+      451229: '大化瑶族自治县',
+    },
+    451300: {
+      451302: '兴宾区',
+      451321: '忻城县',
+      451322: '象州县',
+      451323: '武宣县',
+      451324: '金秀瑶族自治县',
+      451381: '合山市',
+    },
+    451400: {
+      451402: '江州区',
+      451421: '扶绥县',
+      451422: '宁明县',
+      451423: '龙州县',
+      451424: '大新县',
+      451425: '天等县',
+      451481: '凭祥市',
+    },
+    460100: {
+      460105: '秀英区',
+      460106: '龙华区',
+      460107: '琼山区',
+      460108: '美兰区',
+    },
+    460200: {
+      460202: '海棠区',
+      460203: '吉阳区',
+      460204: '天涯区',
+      460205: '崖州区',
+    },
+    460300: {
+      460321: '西沙群岛',
+      460322: '南沙群岛',
+      460323: '中沙群岛的岛礁及其海域',
+    },
+    460400: {
+      4604001: '那大镇',
+      4604005: '华南热作学院',
+      460400101: '和庆镇',
+      460400102: '南丰镇',
+      460400103: '大成镇',
+      460400104: '雅星镇',
+      460400105: '兰洋镇',
+      460400106: '光村镇',
+      460400107: '木棠镇',
+      460400108: '海头镇',
+      460400109: '峨蔓镇',
+      460400111: '王五镇',
+      460400112: '白马井镇',
+      460400113: '中和镇',
+      460400114: '排浦镇',
+      460400115: '东成镇',
+      460400116: '新州镇',
+      460400499: '洋浦经济开发区',
+    },
+    469000: {
+      469001: '五指山市',
+      469002: '琼海市',
+      469005: '文昌市',
+      469006: '万宁市',
+      469007: '东方市',
+      469021: '定安县',
+      469022: '屯昌县',
+      469023: '澄迈县',
+      469024: '临高县',
+      469025: '白沙黎族自治县',
+      469026: '昌江黎族自治县',
+      469027: '乐东黎族自治县',
+      469028: '陵水黎族自治县',
+      469029: '保亭黎族苗族自治县',
+      469030: '琼中黎族苗族自治县',
+    },
+    500100: {
+      500101: '万州区',
+      500102: '涪陵区',
+      500103: '渝中区',
+      500104: '大渡口区',
+      500105: '江北区',
+      500106: '沙坪坝区',
+      500107: '九龙坡区',
+      500108: '南岸区',
+      500109: '北碚区',
+      500110: '綦江区',
+      500111: '大足区',
+      500112: '渝北区',
+      500113: '巴南区',
+      500114: '黔江区',
+      500115: '长寿区',
+      500116: '江津区',
+      500117: '合川区',
+      500118: '永川区',
+      500119: '南川区',
+      500120: '璧山区',
+      500151: '铜梁区',
+      500152: '潼南区',
+      500153: '荣昌区',
+      500154: '开州区',
+      500155: '梁平区',
+      500156: '武隆区',
+    },
+    500200: {
+      500229: '城口县',
+      500230: '丰都县',
+      500231: '垫江县',
+      500233: '忠县',
+      500235: '云阳县',
+      500236: '奉节县',
+      500237: '巫山县',
+      500238: '巫溪县',
+      500240: '石柱土家族自治县',
+      500241: '秀山土家族苗族自治县',
+      500242: '酉阳土家族苗族自治县',
+      500243: '彭水苗族土家族自治县',
+    },
+    510100: {
+      510104: '锦江区',
+      510105: '青羊区',
+      510106: '金牛区',
+      510107: '武侯区',
+      510108: '成华区',
+      510112: '龙泉驿区',
+      510113: '青白江区',
+      510114: '新都区',
+      510115: '温江区',
+      510116: '双流区',
+      510117: '郫都区',
+      510118: '新津区',
+      510121: '金堂县',
+      510129: '大邑县',
+      510131: '蒲江县',
+      510156: '天府新区',
+      510181: '都江堰市',
+      510182: '彭州市',
+      510183: '邛崃市',
+      510184: '崇州市',
+      510185: '简阳市',
+    },
+    510300: {
+      510302: '自流井区',
+      510303: '贡井区',
+      510304: '大安区',
+      510311: '沿滩区',
+      510321: '荣县',
+      510322: '富顺县',
+    },
+    510400: {
+      510402: '东区',
+      510403: '西区',
+      510411: '仁和区',
+      510421: '米易县',
+      510422: '盐边县',
+    },
+    510500: {
+      510502: '江阳区',
+      510503: '纳溪区',
+      510504: '龙马潭区',
+      510521: '泸县',
+      510522: '合江县',
+      510524: '叙永县',
+      510525: '古蔺县',
+    },
+    510600: {
+      510603: '旌阳区',
+      510604: '罗江区',
+      510623: '中江县',
+      510681: '广汉市',
+      510682: '什邡市',
+      510683: '绵竹市',
+    },
+    510700: {
+      510703: '涪城区',
+      510704: '游仙区',
+      510705: '安州区',
+      510722: '三台县',
+      510723: '盐亭县',
+      510725: '梓潼县',
+      510726: '北川羌族自治县',
+      510727: '平武县',
+      510781: '江油市',
+    },
+    510800: {
+      510802: '利州区',
+      510811: '昭化区',
+      510812: '朝天区',
+      510821: '旺苍县',
+      510822: '青川县',
+      510823: '剑阁县',
+      510824: '苍溪县',
+    },
+    510900: {
+      510903: '船山区',
+      510904: '安居区',
+      510921: '蓬溪县',
+      510923: '大英县',
+      510981: '射洪市',
+    },
+    511000: {
+      511002: '市中区',
+      511011: '东兴区',
+      511024: '威远县',
+      511025: '资中县',
+      511071: '内江经济开发区',
+      511083: '隆昌市',
+    },
+    511100: {
+      511102: '市中区',
+      511111: '沙湾区',
+      511112: '五通桥区',
+      511113: '金口河区',
+      511123: '犍为县',
+      511124: '井研县',
+      511126: '夹江县',
+      511129: '沐川县',
+      511132: '峨边彝族自治县',
+      511133: '马边彝族自治县',
+      511181: '峨眉山市',
+    },
+    511300: {
+      511302: '顺庆区',
+      511303: '高坪区',
+      511304: '嘉陵区',
+      511321: '南部县',
+      511322: '营山县',
+      511323: '蓬安县',
+      511324: '仪陇县',
+      511325: '西充县',
+      511381: '阆中市',
+    },
+    511400: {
+      511402: '东坡区',
+      511403: '彭山区',
+      511421: '仁寿县',
+      511423: '洪雅县',
+      511424: '丹棱县',
+      511425: '青神县',
+    },
+    511500: {
+      511502: '翠屏区',
+      511503: '南溪区',
+      511504: '叙州区',
+      511523: '江安县',
+      511524: '长宁县',
+      511525: '高县',
+      511526: '珙县',
+      511527: '筠连县',
+      511528: '兴文县',
+      511529: '屏山县',
+    },
+    511600: {
+      511602: '广安区',
+      511603: '前锋区',
+      511621: '岳池县',
+      511622: '武胜县',
+      511623: '邻水县',
+      511681: '华蓥市',
+    },
+    511700: {
+      511702: '通川区',
+      511703: '达川区',
+      511722: '宣汉县',
+      511723: '开江县',
+      511724: '大竹县',
+      511725: '渠县',
+      511771: '达州经济开发区',
+      511781: '万源市',
+    },
+    511800: {
+      511802: '雨城区',
+      511803: '名山区',
+      511822: '荥经县',
+      511823: '汉源县',
+      511824: '石棉县',
+      511825: '天全县',
+      511826: '芦山县',
+      511827: '宝兴县',
+    },
+    511900: {
+      511902: '巴州区',
+      511903: '恩阳区',
+      511921: '通江县',
+      511922: '南江县',
+      511923: '平昌县',
+      511971: '巴中经济开发区',
+    },
+    512000: {
+      512002: '雁江区',
+      512021: '安岳县',
+      512022: '乐至县',
+    },
+    513200: {
+      513201: '马尔康市',
+      513221: '汶川县',
+      513222: '理县',
+      513223: '茂县',
+      513224: '松潘县',
+      513225: '九寨沟县',
+      513226: '金川县',
+      513227: '小金县',
+      513228: '黑水县',
+      513230: '壤塘县',
+      513231: '阿坝县',
+      513232: '若尔盖县',
+      513233: '红原县',
+    },
+    513300: {
+      513301: '康定市',
+      513322: '泸定县',
+      513323: '丹巴县',
+      513324: '九龙县',
+      513325: '雅江县',
+      513326: '道孚县',
+      513327: '炉霍县',
+      513328: '甘孜县',
+      513329: '新龙县',
+      513330: '德格县',
+      513331: '白玉县',
+      513332: '石渠县',
+      513333: '色达县',
+      513334: '理塘县',
+      513335: '巴塘县',
+      513336: '乡城县',
+      513337: '稻城县',
+      513338: '得荣县',
+    },
+    513400: {
+      513401: '西昌市',
+      513402: '会理市',
+      513422: '木里藏族自治县',
+      513423: '盐源县',
+      513424: '德昌县',
+      513426: '会东县',
+      513427: '宁南县',
+      513428: '普格县',
+      513429: '布拖县',
+      513430: '金阳县',
+      513431: '昭觉县',
+      513432: '喜德县',
+      513433: '冕宁县',
+      513434: '越西县',
+      513435: '甘洛县',
+      513436: '美姑县',
+      513437: '雷波县',
+    },
+    520100: {
+      520102: '南明区',
+      520103: '云岩区',
+      520111: '花溪区',
+      520112: '乌当区',
+      520113: '白云区',
+      520115: '观山湖区',
+      520121: '开阳县',
+      520122: '息烽县',
+      520123: '修文县',
+      520181: '清镇市',
+    },
+    520200: {
+      520201: '钟山区',
+      520203: '六枝特区',
+      520204: '水城区',
+      520281: '盘州市',
+    },
+    520300: {
+      520302: '红花岗区',
+      520303: '汇川区',
+      520304: '播州区',
+      520322: '桐梓县',
+      520323: '绥阳县',
+      520324: '正安县',
+      520325: '道真仡佬族苗族自治县',
+      520326: '务川仡佬族苗族自治县',
+      520327: '凤冈县',
+      520328: '湄潭县',
+      520329: '余庆县',
+      520330: '习水县',
+      520381: '赤水市',
+      520382: '仁怀市',
+    },
+    520400: {
+      520402: '西秀区',
+      520403: '平坝区',
+      520422: '普定县',
+      520423: '镇宁布依族苗族自治县',
+      520424: '关岭布依族苗族自治县',
+      520425: '紫云苗族布依族自治县',
+    },
+    520500: {
+      520502: '七星关区',
+      520521: '大方县',
+      520523: '金沙县',
+      520524: '织金县',
+      520525: '纳雍县',
+      520526: '威宁彝族回族苗族自治县',
+      520527: '赫章县',
+      520581: '黔西市',
+    },
+    520600: {
+      520602: '碧江区',
+      520603: '万山区',
+      520621: '江口县',
+      520622: '玉屏侗族自治县',
+      520623: '石阡县',
+      520624: '思南县',
+      520625: '印江土家族苗族自治县',
+      520626: '德江县',
+      520627: '沿河土家族自治县',
+      520628: '松桃苗族自治县',
+    },
+    522300: {
+      522301: '兴义市',
+      522302: '兴仁市',
+      522323: '普安县',
+      522324: '晴隆县',
+      522325: '贞丰县',
+      522326: '望谟县',
+      522327: '册亨县',
+      522328: '安龙县',
+    },
+    522600: {
+      522601: '凯里市',
+      522622: '黄平县',
+      522623: '施秉县',
+      522624: '三穗县',
+      522625: '镇远县',
+      522626: '岑巩县',
+      522627: '天柱县',
+      522628: '锦屏县',
+      522629: '剑河县',
+      522630: '台江县',
+      522631: '黎平县',
+      522632: '榕江县',
+      522633: '从江县',
+      522634: '雷山县',
+      522635: '麻江县',
+      522636: '丹寨县',
+    },
+    522700: {
+      522701: '都匀市',
+      522702: '福泉市',
+      522722: '荔波县',
+      522723: '贵定县',
+      522725: '瓮安县',
+      522726: '独山县',
+      522727: '平塘县',
+      522728: '罗甸县',
+      522729: '长顺县',
+      522730: '龙里县',
+      522731: '惠水县',
+      522732: '三都水族自治县',
+    },
+    530100: {
+      530102: '五华区',
+      530103: '盘龙区',
+      530111: '官渡区',
+      530112: '西山区',
+      530113: '东川区',
+      530114: '呈贡区',
+      530115: '晋宁区',
+      530124: '富民县',
+      530125: '宜良县',
+      530126: '石林彝族自治县',
+      530127: '嵩明县',
+      530128: '禄劝彝族苗族自治县',
+      530129: '寻甸回族彝族自治县',
+      530181: '安宁市',
+    },
+    530300: {
+      530302: '麒麟区',
+      530303: '沾益区',
+      530304: '马龙区',
+      530322: '陆良县',
+      530323: '师宗县',
+      530324: '罗平县',
+      530325: '富源县',
+      530326: '会泽县',
+      530381: '宣威市',
+    },
+    530400: {
+      530402: '红塔区',
+      530403: '江川区',
+      530423: '通海县',
+      530424: '华宁县',
+      530425: '易门县',
+      530426: '峨山彝族自治县',
+      530427: '新平彝族傣族自治县',
+      530428: '元江哈尼族彝族傣族自治县',
+      530481: '澄江市',
+    },
+    530500: {
+      530502: '隆阳区',
+      530521: '施甸县',
+      530523: '龙陵县',
+      530524: '昌宁县',
+      530581: '腾冲市',
+    },
+    530600: {
+      530602: '昭阳区',
+      530621: '鲁甸县',
+      530622: '巧家县',
+      530623: '盐津县',
+      530624: '大关县',
+      530625: '永善县',
+      530626: '绥江县',
+      530627: '镇雄县',
+      530628: '彝良县',
+      530629: '威信县',
+      530681: '水富市',
+    },
+    530700: {
+      530702: '古城区',
+      530721: '玉龙纳西族自治县',
+      530722: '永胜县',
+      530723: '华坪县',
+      530724: '宁蒗彝族自治县',
+    },
+    530800: {
+      530802: '思茅区',
+      530821: '宁洱哈尼族彝族自治县',
+      530822: '墨江哈尼族自治县',
+      530823: '景东彝族自治县',
+      530824: '景谷傣族彝族自治县',
+      530825: '镇沅彝族哈尼族拉祜族自治县',
+      530826: '江城哈尼族彝族自治县',
+      530827: '孟连傣族拉祜族佤族自治县',
+      530828: '澜沧拉祜族自治县',
+      530829: '西盟佤族自治县',
+    },
+    530900: {
+      530902: '临翔区',
+      530921: '凤庆县',
+      530922: '云县',
+      530923: '永德县',
+      530924: '镇康县',
+      530925: '双江拉祜族佤族布朗族傣族自治县',
+      530926: '耿马傣族佤族自治县',
+      530927: '沧源佤族自治县',
+    },
+    532300: {
+      532301: '楚雄市',
+      532302: '禄丰市',
+      532322: '双柏县',
+      532323: '牟定县',
+      532324: '南华县',
+      532325: '姚安县',
+      532326: '大姚县',
+      532327: '永仁县',
+      532328: '元谋县',
+      532329: '武定县',
+    },
+    532500: {
+      532501: '个旧市',
+      532502: '开远市',
+      532503: '蒙自市',
+      532504: '弥勒市',
+      532523: '屏边苗族自治县',
+      532524: '建水县',
+      532525: '石屏县',
+      532527: '泸西县',
+      532528: '元阳县',
+      532529: '红河县',
+      532530: '金平苗族瑶族傣族自治县',
+      532531: '绿春县',
+      532532: '河口瑶族自治县',
+    },
+    532600: {
+      532601: '文山市',
+      532622: '砚山县',
+      532623: '西畴县',
+      532624: '麻栗坡县',
+      532625: '马关县',
+      532626: '丘北县',
+      532627: '广南县',
+      532628: '富宁县',
+    },
+    532800: {
+      532801: '景洪市',
+      532822: '勐海县',
+      532823: '勐腊县',
+    },
+    532900: {
+      532901: '大理市',
+      532922: '漾濞彝族自治县',
+      532923: '祥云县',
+      532924: '宾川县',
+      532925: '弥渡县',
+      532926: '南涧彝族自治县',
+      532927: '巍山彝族回族自治县',
+      532928: '永平县',
+      532929: '云龙县',
+      532930: '洱源县',
+      532931: '剑川县',
+      532932: '鹤庆县',
+    },
+    533100: {
+      533102: '瑞丽市',
+      533103: '芒市',
+      533122: '梁河县',
+      533123: '盈江县',
+      533124: '陇川县',
+    },
+    533300: {
+      533301: '泸水市',
+      533323: '福贡县',
+      533324: '贡山独龙族怒族自治县',
+      533325: '兰坪白族普米族自治县',
+    },
+    533400: {
+      533401: '香格里拉市',
+      533422: '德钦县',
+      533423: '维西傈僳族自治县',
+    },
+    540100: {
+      540102: '城关区',
+      540103: '堆龙德庆区',
+      540104: '达孜区',
+      540121: '林周县',
+      540122: '当雄县',
+      540123: '尼木县',
+      540124: '曲水县',
+      540127: '墨竹工卡县',
+      540171: '格尔木藏青工业园区',
+      540172: '拉萨经济技术开发区',
+      540173: '西藏文化旅游创意园区',
+      540174: '达孜工业园区',
+    },
+    540200: {
+      540202: '桑珠孜区',
+      540221: '南木林县',
+      540222: '江孜县',
+      540223: '定日县',
+      540224: '萨迦县',
+      540225: '拉孜县',
+      540226: '昂仁县',
+      540227: '谢通门县',
+      540228: '白朗县',
+      540229: '仁布县',
+      540230: '康马县',
+      540231: '定结县',
+      540232: '仲巴县',
+      540233: '亚东县',
+      540234: '吉隆县',
+      540235: '聂拉木县',
+      540236: '萨嘎县',
+      540237: '岗巴县',
+    },
+    540300: {
+      540302: '卡若区',
+      540321: '江达县',
+      540322: '贡觉县',
+      540323: '类乌齐县',
+      540324: '丁青县',
+      540325: '察雅县',
+      540326: '八宿县',
+      540327: '左贡县',
+      540328: '芒康县',
+      540329: '洛隆县',
+      540330: '边坝县',
+    },
+    540400: {
+      540402: '巴宜区',
+      540421: '工布江达县',
+      540422: '米林县',
+      540423: '墨脱县',
+      540424: '波密县',
+      540425: '察隅县',
+      540426: '朗县',
+    },
+    540500: {
+      540502: '乃东区',
+      540521: '扎囊县',
+      540522: '贡嘎县',
+      540523: '桑日县',
+      540524: '琼结县',
+      540525: '曲松县',
+      540526: '措美县',
+      540527: '洛扎县',
+      540528: '加查县',
+      540529: '隆子县',
+      540530: '错那县',
+      540531: '浪卡子县',
+    },
+    540600: {
+      540602: '色尼区',
+      540621: '嘉黎县',
+      540622: '比如县',
+      540623: '聂荣县',
+      540624: '安多县',
+      540625: '申扎县',
+      540626: '索县',
+      540627: '班戈县',
+      540628: '巴青县',
+      540629: '尼玛县',
+      540630: '双湖县',
+    },
+    542500: {
+      542521: '普兰县',
+      542522: '札达县',
+      542523: '噶尔县',
+      542524: '日土县',
+      542525: '革吉县',
+      542526: '改则县',
+      542527: '措勤县',
+    },
+    610100: {
+      610102: '新城区',
+      610103: '碑林区',
+      610104: '莲湖区',
+      610111: '灞桥区',
+      610112: '未央区',
+      610113: '雁塔区',
+      610114: '阎良区',
+      610115: '临潼区',
+      610116: '长安区',
+      610117: '高陵区',
+      610118: '鄠邑区',
+      610122: '蓝田县',
+      610124: '周至县',
+    },
+    610200: {
+      610202: '王益区',
+      610203: '印台区',
+      610204: '耀州区',
+      610222: '宜君县',
+    },
+    610300: {
+      610302: '渭滨区',
+      610303: '金台区',
+      610304: '陈仓区',
+      610305: '凤翔区',
+      610323: '岐山县',
+      610324: '扶风县',
+      610326: '眉县',
+      610327: '陇县',
+      610328: '千阳县',
+      610329: '麟游县',
+      610330: '凤县',
+      610331: '太白县',
+    },
+    610400: {
+      610402: '秦都区',
+      610403: '杨陵区',
+      610404: '渭城区',
+      610422: '三原县',
+      610423: '泾阳县',
+      610424: '乾县',
+      610425: '礼泉县',
+      610426: '永寿县',
+      610428: '长武县',
+      610429: '旬邑县',
+      610430: '淳化县',
+      610431: '武功县',
+      610481: '兴平市',
+      610482: '彬州市',
+    },
+    610500: {
+      610502: '临渭区',
+      610503: '华州区',
+      610522: '潼关县',
+      610523: '大荔县',
+      610524: '合阳县',
+      610525: '澄城县',
+      610526: '蒲城县',
+      610527: '白水县',
+      610528: '富平县',
+      610581: '韩城市',
+      610582: '华阴市',
+    },
+    610600: {
+      610602: '宝塔区',
+      610603: '安塞区',
+      610621: '延长县',
+      610622: '延川县',
+      610625: '志丹县',
+      610626: '吴起县',
+      610627: '甘泉县',
+      610628: '富县',
+      610629: '洛川县',
+      610630: '宜川县',
+      610631: '黄龙县',
+      610632: '黄陵县',
+      610681: '子长市',
+    },
+    610700: {
+      610702: '汉台区',
+      610703: '南郑区',
+      610722: '城固县',
+      610723: '洋县',
+      610724: '西乡县',
+      610725: '勉县',
+      610726: '宁强县',
+      610727: '略阳县',
+      610728: '镇巴县',
+      610729: '留坝县',
+      610730: '佛坪县',
+    },
+    610800: {
+      610802: '榆阳区',
+      610803: '横山区',
+      610822: '府谷县',
+      610824: '靖边县',
+      610825: '定边县',
+      610826: '绥德县',
+      610827: '米脂县',
+      610828: '佳县',
+      610829: '吴堡县',
+      610830: '清涧县',
+      610831: '子洲县',
+      610881: '神木市',
+    },
+    610900: {
+      610902: '汉滨区',
+      610921: '汉阴县',
+      610922: '石泉县',
+      610923: '宁陕县',
+      610924: '紫阳县',
+      610925: '岚皋县',
+      610926: '平利县',
+      610927: '镇坪县',
+      610929: '白河县',
+      610981: '旬阳市',
+    },
+    611000: {
+      611002: '商州区',
+      611021: '洛南县',
+      611022: '丹凤县',
+      611023: '商南县',
+      611024: '山阳县',
+      611025: '镇安县',
+      611026: '柞水县',
+    },
+    620100: {
+      620102: '城关区',
+      620103: '七里河区',
+      620104: '西固区',
+      620105: '安宁区',
+      620111: '红古区',
+      620121: '永登县',
+      620122: '皋兰县',
+      620123: '榆中县',
+      620171: '兰州新区',
+    },
+    620200: {
+      6202011: '新城镇',
+      620201001: '雄关街道',
+      620201002: '钢城街道',
+      620201101: '峪泉镇',
+      620201102: '文殊镇',
+    },
+    620300: {
+      620302: '金川区',
+      620321: '永昌县',
+    },
+    620400: {
+      620402: '白银区',
+      620403: '平川区',
+      620421: '靖远县',
+      620422: '会宁县',
+      620423: '景泰县',
+    },
+    620500: {
+      620502: '秦州区',
+      620503: '麦积区',
+      620521: '清水县',
+      620522: '秦安县',
+      620523: '甘谷县',
+      620524: '武山县',
+      620525: '张家川回族自治县',
+    },
+    620600: {
+      620602: '凉州区',
+      620621: '民勤县',
+      620622: '古浪县',
+      620623: '天祝藏族自治县',
+    },
+    620700: {
+      620702: '甘州区',
+      620721: '肃南裕固族自治县',
+      620722: '民乐县',
+      620723: '临泽县',
+      620724: '高台县',
+      620725: '山丹县',
+    },
+    620800: {
+      620802: '崆峒区',
+      620821: '泾川县',
+      620822: '灵台县',
+      620823: '崇信县',
+      620825: '庄浪县',
+      620826: '静宁县',
+      620881: '华亭市',
+    },
+    620900: {
+      620902: '肃州区',
+      620921: '金塔县',
+      620922: '瓜州县',
+      620923: '肃北蒙古族自治县',
+      620924: '阿克塞哈萨克族自治县',
+      620981: '玉门市',
+      620982: '敦煌市',
+    },
+    621000: {
+      621002: '西峰区',
+      621021: '庆城县',
+      621022: '环县',
+      621023: '华池县',
+      621024: '合水县',
+      621025: '正宁县',
+      621026: '宁县',
+      621027: '镇原县',
+    },
+    621100: {
+      621102: '安定区',
+      621121: '通渭县',
+      621122: '陇西县',
+      621123: '渭源县',
+      621124: '临洮县',
+      621125: '漳县',
+      621126: '岷县',
+    },
+    621200: {
+      621202: '武都区',
+      621221: '成县',
+      621222: '文县',
+      621223: '宕昌县',
+      621224: '康县',
+      621225: '西和县',
+      621226: '礼县',
+      621227: '徽县',
+      621228: '两当县',
+    },
+    622900: {
+      622901: '临夏市',
+      622921: '临夏县',
+      622922: '康乐县',
+      622923: '永靖县',
+      622924: '广河县',
+      622925: '和政县',
+      622926: '东乡族自治县',
+      622927: '积石山保安族东乡族撒拉族自治县',
+    },
+    623000: {
+      623001: '合作市',
+      623021: '临潭县',
+      623022: '卓尼县',
+      623023: '舟曲县',
+      623024: '迭部县',
+      623025: '玛曲县',
+      623026: '碌曲县',
+      623027: '夏河县',
+    },
+    630100: {
+      630102: '城东区',
+      630103: '城中区',
+      630104: '城西区',
+      630105: '城北区',
+      630106: '湟中区',
+      630121: '大通回族土族自治县',
+      630123: '湟源县',
+    },
+    630200: {
+      630202: '乐都区',
+      630203: '平安区',
+      630222: '民和回族土族自治县',
+      630223: '互助土族自治县',
+      630224: '化隆回族自治县',
+      630225: '循化撒拉族自治县',
+    },
+    632200: {
+      632221: '门源回族自治县',
+      632222: '祁连县',
+      632223: '海晏县',
+      632224: '刚察县',
+    },
+    632300: {
+      632301: '同仁市',
+      632322: '尖扎县',
+      632323: '泽库县',
+      632324: '河南蒙古族自治县',
+    },
+    632500: {
+      632521: '共和县',
+      632522: '同德县',
+      632523: '贵德县',
+      632524: '兴海县',
+      632525: '贵南县',
+    },
+    632600: {
+      632621: '玛沁县',
+      632622: '班玛县',
+      632623: '甘德县',
+      632624: '达日县',
+      632625: '久治县',
+      632626: '玛多县',
+    },
+    632700: {
+      632701: '玉树市',
+      632722: '杂多县',
+      632723: '称多县',
+      632724: '治多县',
+      632725: '囊谦县',
+      632726: '曲麻莱县',
+    },
+    632800: {
+      632801: '格尔木市',
+      632802: '德令哈市',
+      632803: '茫崖市',
+      632821: '乌兰县',
+      632822: '都兰县',
+      632823: '天峻县',
+      632857: '大柴旦行政委员会',
+    },
+    640100: {
+      640104: '兴庆区',
+      640105: '西夏区',
+      640106: '金凤区',
+      640121: '永宁县',
+      640122: '贺兰县',
+      640181: '灵武市',
+    },
+    640200: {
+      640202: '大武口区',
+      640205: '惠农区',
+      640221: '平罗县',
+    },
+    640300: {
+      640302: '利通区',
+      640303: '红寺堡区',
+      640323: '盐池县',
+      640324: '同心县',
+      640381: '青铜峡市',
+    },
+    640400: {
+      640402: '原州区',
+      640422: '西吉县',
+      640423: '隆德县',
+      640424: '泾源县',
+      640425: '彭阳县',
+    },
+    640500: {
+      640502: '沙坡头区',
+      640521: '中宁县',
+      640522: '海原县',
+    },
+    650100: {
+      650102: '天山区',
+      650103: '沙依巴克区',
+      650104: '新市区',
+      650105: '水磨沟区',
+      650106: '头屯河区',
+      650107: '达坂城区',
+      650109: '米东区',
+      650121: '乌鲁木齐县',
+    },
+    650200: {
+      650202: '独山子区',
+      650203: '克拉玛依区',
+      650204: '白碱滩区',
+      650205: '乌尔禾区',
+    },
+    650400: {
+      650402: '高昌区',
+      650421: '鄯善县',
+      650422: '托克逊县',
+    },
+    650500: {
+      650502: '伊州区',
+      650521: '巴里坤哈萨克自治县',
+      650522: '伊吾县',
+    },
+    652300: {
+      652301: '昌吉市',
+      652302: '阜康市',
+      652323: '呼图壁县',
+      652324: '玛纳斯县',
+      652325: '奇台县',
+      652327: '吉木萨尔县',
+      652328: '木垒哈萨克自治县',
+    },
+    652700: {
+      652701: '博乐市',
+      652702: '阿拉山口市',
+      652722: '精河县',
+      652723: '温泉县',
+    },
+    652800: {
+      652801: '库尔勒市',
+      652822: '轮台县',
+      652823: '尉犁县',
+      652824: '若羌县',
+      652825: '且末县',
+      652826: '焉耆回族自治县',
+      652827: '和静县',
+      652828: '和硕县',
+      652829: '博湖县',
+      652871: '库尔勒经济技术开发区',
+    },
+    652900: {
+      652901: '阿克苏市',
+      652902: '库车市',
+      652922: '温宿县',
+      652924: '沙雅县',
+      652925: '新和县',
+      652926: '拜城县',
+      652927: '乌什县',
+      652928: '阿瓦提县',
+      652929: '柯坪县',
+    },
+    653000: {
+      653001: '阿图什市',
+      653022: '阿克陶县',
+      653023: '阿合奇县',
+      653024: '乌恰县',
+    },
+    653100: {
+      653101: '喀什市',
+      653121: '疏附县',
+      653122: '疏勒县',
+      653123: '英吉沙县',
+      653124: '泽普县',
+      653125: '莎车县',
+      653126: '叶城县',
+      653127: '麦盖提县',
+      653128: '岳普湖县',
+      653129: '伽师县',
+      653130: '巴楚县',
+      653131: '塔什库尔干塔吉克自治县',
+    },
+    653200: {
+      653201: '和田市',
+      653221: '和田县',
+      653222: '墨玉县',
+      653223: '皮山县',
+      653224: '洛浦县',
+      653225: '策勒县',
+      653226: '于田县',
+      653227: '民丰县',
+    },
+    654000: {
+      654002: '伊宁市',
+      654003: '奎屯市',
+      654004: '霍尔果斯市',
+      654021: '伊宁县',
+      654022: '察布查尔锡伯自治县',
+      654023: '霍城县',
+      654024: '巩留县',
+      654025: '新源县',
+      654026: '昭苏县',
+      654027: '特克斯县',
+      654028: '尼勒克县',
+    },
+    654200: {
+      654201: '塔城市',
+      654202: '乌苏市',
+      654203: '沙湾市',
+      654221: '额敏县',
+      654224: '托里县',
+      654225: '裕民县',
+      654226: '和布克赛尔蒙古自治县',
+    },
+    654300: {
+      654301: '阿勒泰市',
+      654321: '布尔津县',
+      654322: '富蕴县',
+      654323: '福海县',
+      654324: '哈巴河县',
+      654325: '青河县',
+      654326: '吉木乃县',
+    },
+    659000: {
+      659001: '石河子市',
+      659002: '阿拉尔市',
+      659003: '图木舒克市',
+      659004: '五家渠市',
+      659005: '北屯市',
+      659006: '铁门关市',
+      659007: '双河市',
+      659008: '可克达拉市',
+      659009: '昆玉市',
+      659010: '胡杨河市',
+      659011: '新星市',
+    },
+    710100: {
+      710101: '中正区',
+      710102: '大同区',
+      710103: '中山区',
+      710104: '松山区',
+      710105: '大安区',
+      710106: '万华区',
+      710107: '信义区',
+      710108: '士林区',
+      710109: '北投区',
+      710110: '内湖区',
+      710111: '南港区',
+      710112: '文山区',
+      710199: '其它区',
+    },
+    710200: {
+      710201: '新兴区',
+      710202: '前金区',
+      710203: '芩雅区',
+      710204: '盐埕区',
+      710205: '鼓山区',
+      710206: '旗津区',
+      710207: '前镇区',
+      710208: '三民区',
+      710209: '左营区',
+      710210: '楠梓区',
+      710211: '小港区',
+      710241: '苓雅区',
+      710242: '仁武区',
+      710243: '大社区',
+      710244: '冈山区',
+      710245: '路竹区',
+      710246: '阿莲区',
+      710247: '田寮区',
+      710248: '燕巢区',
+      710249: '桥头区',
+      710250: '梓官区',
+      710251: '弥陀区',
+      710252: '永安区',
+      710253: '湖内区',
+      710254: '凤山区',
+      710255: '大寮区',
+      710256: '林园区',
+      710257: '鸟松区',
+      710258: '大树区',
+      710259: '旗山区',
+      710260: '美浓区',
+      710261: '六龟区',
+      710262: '内门区',
+      710263: '杉林区',
+      710264: '甲仙区',
+      710265: '桃源区',
+      710266: '那玛夏区',
+      710267: '茂林区',
+      710268: '茄萣区',
+      710299: '其它区',
+    },
+    710300: {
+      710301: '中西区',
+      710302: '东区',
+      710303: '南区',
+      710304: '北区',
+      710305: '安平区',
+      710306: '安南区',
+      710339: '永康区',
+      710340: '归仁区',
+      710341: '新化区',
+      710342: '左镇区',
+      710343: '玉井区',
+      710344: '楠西区',
+      710345: '南化区',
+      710346: '仁德区',
+      710347: '关庙区',
+      710348: '龙崎区',
+      710349: '官田区',
+      710350: '麻豆区',
+      710351: '佳里区',
+      710352: '西港区',
+      710353: '七股区',
+      710354: '将军区',
+      710355: '学甲区',
+      710356: '北门区',
+      710357: '新营区',
+      710358: '后壁区',
+      710359: '白河区',
+      710360: '东山区',
+      710361: '六甲区',
+      710362: '下营区',
+      710363: '柳营区',
+      710364: '盐水区',
+      710365: '善化区',
+      710366: '大内区',
+      710367: '山上区',
+      710368: '新市区',
+      710369: '安定区',
+      710399: '其它区',
+    },
+    710400: {
+      710401: '中区',
+      710402: '东区',
+      710403: '南区',
+      710404: '西区',
+      710405: '北区',
+      710406: '北屯区',
+      710407: '西屯区',
+      710408: '南屯区',
+      710431: '太平区',
+      710432: '大里区',
+      710433: '雾峰区',
+      710434: '乌日区',
+      710435: '丰原区',
+      710436: '后里区',
+      710437: '石冈区',
+      710438: '东势区',
+      710439: '和平区',
+      710440: '新社区',
+      710441: '潭子区',
+      710442: '大雅区',
+      710443: '神冈区',
+      710444: '大肚区',
+      710445: '沙鹿区',
+      710446: '龙井区',
+      710447: '梧栖区',
+      710448: '清水区',
+      710449: '大甲区',
+      710450: '外埔区',
+      710451: '大安区',
+      710499: '其它区',
+    },
+    710500: {
+      710507: '金沙镇',
+      710508: '金湖镇',
+      710509: '金宁乡',
+      710510: '金城镇',
+      710511: '烈屿乡',
+      710512: '乌坵乡',
+    },
+    710600: {
+      710614: '南投市',
+      710615: '中寮乡',
+      710616: '草屯镇',
+      710617: '国姓乡',
+      710618: '埔里镇',
+      710619: '仁爱乡',
+      710620: '名间乡',
+      710621: '集集镇',
+      710622: '水里乡',
+      710623: '鱼池乡',
+      710624: '信义乡',
+      710625: '竹山镇',
+      710626: '鹿谷乡',
+    },
+    710700: {
+      710701: '仁爱区',
+      710702: '信义区',
+      710703: '中正区',
+      710704: '中山区',
+      710705: '安乐区',
+      710706: '暖暖区',
+      710707: '七堵区',
+      710799: '其它区',
+    },
+    710800: {
+      710801: '东区',
+      710802: '北区',
+      710803: '香山区',
+      710899: '其它区',
+    },
+    710900: {
+      710901: '东区',
+      710902: '西区',
+      710999: '其它区',
+    },
+    711100: {
+      711130: '万里区',
+      711132: '板桥区',
+      711133: '汐止区',
+      711134: '深坑区',
+      711135: '石碇区',
+      711136: '瑞芳区',
+      711137: '平溪区',
+      711138: '双溪区',
+      711139: '贡寮区',
+      711140: '新店区',
+      711141: '坪林区',
+      711142: '乌来区',
+      711143: '永和区',
+      711144: '中和区',
+      711145: '土城区',
+      711146: '三峡区',
+      711147: '树林区',
+      711148: '莺歌区',
+      711149: '三重区',
+      711150: '新庄区',
+      711151: '泰山区',
+      711152: '林口区',
+      711153: '芦洲区',
+      711154: '五股区',
+      711155: '八里区',
+      711156: '淡水区',
+      711157: '三芝区',
+      711158: '石门区',
+    },
+    711200: {
+      711287: '宜兰市',
+      711288: '头城镇',
+      711289: '礁溪乡',
+      711290: '壮围乡',
+      711291: '员山乡',
+      711292: '罗东镇',
+      711293: '三星乡',
+      711294: '大同乡',
+      711295: '五结乡',
+      711296: '冬山乡',
+      711297: '苏澳镇',
+      711298: '南澳乡',
+      711299: '钓鱼台',
+    },
+    711300: {
+      711387: '竹北市',
+      711388: '湖口乡',
+      711389: '新丰乡',
+      711390: '新埔镇',
+      711391: '关西镇',
+      711392: '芎林乡',
+      711393: '宝山乡',
+      711394: '竹东镇',
+      711395: '五峰乡',
+      711396: '横山乡',
+      711397: '尖石乡',
+      711398: '北埔乡',
+      711399: '峨眉乡',
+    },
+    711400: {
+      711414: '中坜区',
+      711415: '平镇区',
+      711417: '杨梅区',
+      711418: '新屋区',
+      711419: '观音区',
+      711420: '桃园区',
+      711421: '龟山区',
+      711422: '八德区',
+      711423: '大溪区',
+      711425: '大园区',
+      711426: '芦竹区',
+      711487: '中坜市',
+      711488: '平镇市',
+      711489: '龙潭乡',
+      711490: '杨梅市',
+      711491: '新屋乡',
+      711492: '观音乡',
+      711493: '桃园市',
+      711494: '龟山乡',
+      711495: '八德市',
+      711496: '大溪镇',
+      711497: '复兴乡',
+      711498: '大园乡',
+      711499: '芦竹乡',
+    },
+    711500: {
+      711520: '头份市',
+      711582: '竹南镇',
+      711583: '头份镇',
+      711584: '三湾乡',
+      711585: '南庄乡',
+      711586: '狮潭乡',
+      711587: '后龙镇',
+      711588: '通霄镇',
+      711589: '苑里镇',
+      711590: '苗栗市',
+      711591: '造桥乡',
+      711592: '头屋乡',
+      711593: '公馆乡',
+      711594: '大湖乡',
+      711595: '泰安乡',
+      711596: '铜锣乡',
+      711597: '三义乡',
+      711598: '西湖乡',
+      711599: '卓兰镇',
+    },
+    711700: {
+      711736: '员林市',
+      711774: '彰化市',
+      711775: '芬园乡',
+      711776: '花坛乡',
+      711777: '秀水乡',
+      711778: '鹿港镇',
+      711779: '福兴乡',
+      711780: '线西乡',
+      711781: '和美镇',
+      711782: '伸港乡',
+      711783: '员林镇',
+      711784: '社头乡',
+      711785: '永靖乡',
+      711786: '埔心乡',
+      711787: '溪湖镇',
+      711788: '大村乡',
+      711789: '埔盐乡',
+      711790: '田中镇',
+      711791: '北斗镇',
+      711792: '田尾乡',
+      711793: '埤头乡',
+      711794: '溪州乡',
+      711795: '竹塘乡',
+      711796: '二林镇',
+      711797: '大城乡',
+      711798: '芳苑乡',
+      711799: '二水乡',
+    },
+    711900: {
+      711982: '番路乡',
+      711983: '梅山乡',
+      711984: '竹崎乡',
+      711985: '阿里山乡',
+      711986: '中埔乡',
+      711987: '大埔乡',
+      711988: '水上乡',
+      711989: '鹿草乡',
+      711990: '太保市',
+      711991: '朴子市',
+      711992: '东石乡',
+      711993: '六脚乡',
+      711994: '新港乡',
+      711995: '民雄乡',
+      711996: '大林镇',
+      711997: '溪口乡',
+      711998: '义竹乡',
+      711999: '布袋镇',
+    },
+    712100: {
+      712180: '斗南镇',
+      712181: '大埤乡',
+      712182: '虎尾镇',
+      712183: '土库镇',
+      712184: '褒忠乡',
+      712185: '东势乡',
+      712186: '台西乡',
+      712187: '仑背乡',
+      712188: '麦寮乡',
+      712189: '斗六市',
+      712190: '林内乡',
+      712191: '古坑乡',
+      712192: '莿桐乡',
+      712193: '西螺镇',
+      712194: '二仑乡',
+      712195: '北港镇',
+      712196: '水林乡',
+      712197: '口湖乡',
+      712198: '四湖乡',
+      712199: '元长乡',
+    },
+    712400: {
+      712451: '崁顶乡',
+      712467: '屏东市',
+      712468: '三地门乡',
+      712469: '雾台乡',
+      712470: '玛家乡',
+      712471: '九如乡',
+      712472: '里港乡',
+      712473: '高树乡',
+      712474: '盐埔乡',
+      712475: '长治乡',
+      712476: '麟洛乡',
+      712477: '竹田乡',
+      712478: '内埔乡',
+      712479: '万丹乡',
+      712480: '潮州镇',
+      712481: '泰武乡',
+      712482: '来义乡',
+      712483: '万峦乡',
+      712484: '莰顶乡',
+      712485: '新埤乡',
+      712486: '南州乡',
+      712487: '林边乡',
+      712488: '东港镇',
+      712489: '琉球乡',
+      712490: '佳冬乡',
+      712491: '新园乡',
+      712492: '枋寮乡',
+      712493: '枋山乡',
+      712494: '春日乡',
+      712495: '狮子乡',
+      712496: '车城乡',
+      712497: '牡丹乡',
+      712498: '恒春镇',
+      712499: '满州乡',
+    },
+    712500: {
+      712584: '台东市',
+      712585: '绿岛乡',
+      712586: '兰屿乡',
+      712587: '延平乡',
+      712588: '卑南乡',
+      712589: '鹿野乡',
+      712590: '关山镇',
+      712591: '海端乡',
+      712592: '池上乡',
+      712593: '东河乡',
+      712594: '成功镇',
+      712595: '长滨乡',
+      712596: '金峰乡',
+      712597: '大武乡',
+      712598: '达仁乡',
+      712599: '太麻里乡',
+    },
+    712600: {
+      712686: '花莲市',
+      712687: '新城乡',
+      712688: '太鲁阁',
+      712689: '秀林乡',
+      712690: '吉安乡',
+      712691: '寿丰乡',
+      712692: '凤林镇',
+      712693: '光复乡',
+      712694: '丰滨乡',
+      712695: '瑞穗乡',
+      712696: '万荣乡',
+      712697: '玉里镇',
+      712698: '卓溪乡',
+      712699: '富里乡',
+    },
+    712700: {
+      712794: '马公市',
+      712795: '西屿乡',
+      712796: '望安乡',
+      712797: '七美乡',
+      712798: '白沙乡',
+      712799: '湖西乡',
+    },
+    712800: {
+      712896: '南竿乡',
+      712897: '北竿乡',
+      712898: '东引乡',
+      712899: '莒光乡',
+    },
+    810100: {
+      810101: '中西区',
+      810102: '湾仔区',
+      810103: '东区',
+      810104: '南区',
+    },
+    810200: {
+      810201: '九龙城区',
+      810202: '油尖旺区',
+      810203: '深水埗区',
+      810204: '黄大仙区',
+      810205: '观塘区',
+    },
+    810300: {
+      810301: '北区',
+      810302: '大埔区',
+      810303: '沙田区',
+      810304: '西贡区',
+      810305: '元朗区',
+      810306: '屯门区',
+      810307: '荃湾区',
+      810308: '葵青区',
+      810309: '离岛区',
+    },
+    820100: {
+      820101: '澳门半岛',
+    },
+    820200: {
+      820201: '离岛',
+    },
+    900100: {
+      900101: '其它区',
+    },
 }

+ 12 - 2
src/views/Home.vue

@@ -62,12 +62,13 @@
                   </template>
                   <el-menu-item
                     v-for="child in item.children"
-                    :index="child.path"
+                    :index="child.path=='etaForum'?null:child.path"
                     :path="child.path"
                     :key="child.path"
                     v-show="!child.hidden"
                   >
-                    <a :href="`/${child.path}`" :style="`display: block;color:${child.path===activePath ? '#FDB863 ' : '#fff'}`" @click="(e) => e.preventDefault() ">
+                    <span v-if="child.path==='etaForum'" :style="`display: block;color:${child.path===activePath ? '#FDB863 ' : '#fff'}`" @click.prevent="linkToOtherMS('ETA_Forum')">{{child.name}}</span>
+                    <a v-else :href="`/${child.path}`" :style="`display: block;color:${child.path===activePath ? '#FDB863 ' : '#fff'}`" @click="(e) => e.preventDefault() ">
                       {{child.name}}
                     </a>
                   </el-menu-item>
@@ -733,6 +734,15 @@ export default {
           href=`${href}?code=${res.Data}`
         }
       }
+      if(key==='ETA_Forum'){
+        const res=await departInterence.getToETAForumCode()
+        if(res.Ret===200){
+          href=`${href}?code=${res.Data}`
+        }else{
+          this.$message.warning(res.Msg)
+          return
+        }
+      }
       window.open(href,'_blank');
     },
     // 切换通知消息类型

+ 19 - 5
src/views/business_ETA_manage/addBusiness.vue

@@ -54,7 +54,7 @@
                     <el-form-item label="社会信用码" prop="creditCode">
                         <el-input disabled placeholder="请输入社会信用码" v-model="firstFormData.creditCode"/>
                     </el-form-item>
-                    <el-form-item label="商家地址" prop="address">
+                    <el-form-item label="商家地址" prop="address" v-if="firstFormData.areaType=='国内'">
                         <el-cascader 
                             v-model="firstFormData.address"
                             :props="locationProps"
@@ -64,6 +64,16 @@
                             placeholder="请选择客户地址" 
                         />
                     </el-form-item>
+                    <el-form-item label="所属国家" prop="nation" v-else>
+                        <el-select v-model="firstFormData.nation" placeholder="请选择所属国家" filterable style="width: 360px;">
+                            <el-option :label="item.cnName" :value="item.cnName" v-for="item in countryData" :key="item.code" >
+                            <div style="display: flex;justify-content: space-between;">
+                                <span>{{ item.cnName }}</span>
+                                <span style="color: #8492a6; font-size: 13px">{{ item.code }}</span>
+                            </div>
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
                 </div>
                 <div class="form-line">
                     <el-form-item label="决策人" prop="decisionMaker">
@@ -174,9 +184,11 @@ import { customInterence,roadshowInterence,businessCustomInterence } from '@/api
 import autocomplete from "@/components/autocomplete.vue";
 import Steps from "./components/Steps.vue";
 import {locationOptions} from "@/views/custom_manage/customList/location"
+import country from "@/utils/countryData"
 export default {
     components: {autocomplete,Steps},
     data() {
+        this.countryData = country
         return {
             /* 城市地址数据 */
             locationOptions,
@@ -221,6 +233,7 @@ export default {
                 name:[{ required: true, message: '请输入商家名称', trigger: 'blur' },],
                 creditCode:[{ required: true, message: '请输入社会信用码', trigger: 'blur' },],
                 address:[{ required: true, message: '请选择商家地址', trigger: 'change' },],
+                nation:[{ required: true, message: '请选择所属国家', trigger: 'change' },],
                 decisionMaker:[{required: true, message: '请输入决策人', trigger: 'blur' },],
                 teamSize:[{required: true, message: '请选择研究团队规模', trigger: 'change' },],
                 industry:[{required: true, message: '请选择所属行业', trigger: 'change' },],
@@ -236,6 +249,7 @@ export default {
                 name:'',
                 creditCode:'',
                 address:'',
+                nation:'',
                 decisionMaker:'',
                 teamSize:'',
                 fundsize:'',
@@ -255,11 +269,11 @@ export default {
                 console.log('watch?',newVal)
                 if(newVal==='海外'){
                     this.firstFormData.creditCode = 'HZ' + new Date().getTime()
-                    this.firstFormData.address = ['海外','其他市']
-                    this.selectRegion(['海外','其他市'])
+                    // this.firstFormData.address = ['海外','其他市']
+                    // this.selectRegion(['海外','其他市'])
                 }else{
                     this.firstFormData.creditCode = ''
-                    this.firstFormData.address = []
+                    // this.firstFormData.address = []
                 }
             }
         }
@@ -278,6 +292,7 @@ export default {
                 RegionType:params.areaType,
                 Province:params.province,
                 City:params.city,
+                Nation:params.nation,
                 SellerId:Number(cascaderNodes[0]?cascaderNodes[0].value:0),
                 SellerName:cascaderNodes[0]?cascaderNodes[0].label:'',
                 Leader:params.decisionMaker,
@@ -302,7 +317,6 @@ export default {
                         if(res.Ret!==200) return 
                         this.step++
                     })
-                    
                 }
             })
         },

+ 14 - 1
src/views/business_ETA_manage/businessDetail.vue

@@ -31,7 +31,7 @@
                                 <el-radio label="海外" border>海外</el-radio>
                             </el-radio-group>
                         </el-form-item>
-                        <el-form-item label="商家地址" prop="address">
+                        <el-form-item label="商家地址" prop="address" v-if="firstFormData.RegionType=='国内'">
                             <el-cascader 
                                 v-model="firstFormData.address"
                                 :props="locationProps"
@@ -41,6 +41,16 @@
                                 placeholder="请选择客户地址" 
                             />
                         </el-form-item>
+                        <el-form-item label="所属国家" prop="Nation" v-else>
+                            <el-select v-model="firstFormData.Nation" placeholder="请选择所属国家" filterable style="width: 360px;">
+                                <el-option :label="item.cnName" :value="item.cnName" v-for="item in countryData" :key="item.code" >
+                                <div style="display: flex;justify-content: space-between;">
+                                    <span>{{ item.cnName }}</span>
+                                    <span style="color: #8492a6; font-size: 13px">{{ item.code }}</span>
+                                </div>
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
                     </div>
                     <div class="form-line">
                         <el-form-item label="社会信用码" prop="CreditCode">
@@ -157,9 +167,11 @@ import { customInterence , businessCustomInterence} from '@/api/api.js'
 import Steps from "./components/Steps.vue";
 import AddRenewal from "./components/AddRenewal";
 import {locationOptions} from "@/views/custom_manage/customList/location"
+import country from "@/utils/countryData"
 export default {
     components: {Steps,AddRenewal},
     data() {
+        this.countryData = country
         return {
             locationOptions,
             locationProps:{
@@ -189,6 +201,7 @@ export default {
                 BusinessName:'',
                 CreditCode:'',
                 Address:'',
+                Nation:'',
                 Leader:'',
                 ResearchTeamSize:'',
                 CapitalScale:'',

+ 70 - 12
src/views/business_ETA_manage/businessEdit.vue

@@ -30,7 +30,7 @@
                                 <el-radio label="海外" border>海外</el-radio>
                             </el-radio-group>
                         </el-form-item>
-                        <el-form-item label="商家地址" prop="address">
+                        <el-form-item label="商家地址" prop="address" v-if="firstFormData.RegionType=='国内'">
                             <el-cascader 
                                 v-model="firstFormData.address"
                                 :props="locationProps"
@@ -40,6 +40,16 @@
                                 placeholder="请选择客户地址" 
                             />
                         </el-form-item>
+                        <el-form-item label="所属国家" prop="Nation" v-else>
+                            <el-select v-model="firstFormData.Nation" placeholder="请选择所属国家" filterable style="width: 360px;">
+                                <el-option :label="item.cnName" :value="item.cnName" v-for="item in countryData" :key="item.code" >
+                                <div style="display: flex;justify-content: space-between;">
+                                    <span>{{ item.cnName }}</span>
+                                    <span style="color: #8492a6; font-size: 13px">{{ item.code }}</span>
+                                </div>
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
                     </div>
                     <div class="form-line">
                         <el-form-item label="社会信用码" prop="CreditCode">
@@ -95,6 +105,7 @@
                 </el-form>
             </div>
             <div class="second-step-form-wrap" v-show="step===2">
+                <el-button type="primary" @click="addRenewalHandle" style="margin-top: 15px;">添加续约</el-button>
                 <el-table :data="recordData" border>
                     <el-table-column
                         v-for="item in tableColOpts"
@@ -104,8 +115,14 @@
                         align="center"
                     >
                     </el-table-column>
+                    <el-table-column label="操作" align="center">
+                        <template slot-scope="scope">
+                            <span class="editsty" @click="editRenewal(scope.row)" style="padding: 0 3px;">编辑</span>
+                            <span class="deletesty" @click="deleteRenewal(scope.row)" style="padding: 0 3px;">删除</span>
+                        </template>
+                    </el-table-column>
                 </el-table>
-                <el-button type="text" @click="showRenewal=true">添加续约</el-button>
+                <!-- <el-button type="text" @click="showRenewal=true">添加续约</el-button> -->
             </div>
         </div>
         <div class="business-other">
@@ -133,7 +150,7 @@
 
         <!-- 添加续约 -->
         <el-dialog
-            title="添加续约"
+            :title="renewalDiaTitle"
             :visible.sync="showRenewal"
             :modal-append-to-body="false"
             :close-on-click-modal="false"
@@ -142,7 +159,8 @@
         >
             <AddRenewal 
                 @addRenewal="handleAddRenewal"
-                @close="showRenewal=false"/>
+                @close="showRenewal=false"
+                :renewalForm="renewalForm"/>
         </el-dialog>
     </div>
 </template>
@@ -152,9 +170,11 @@ import { customInterence , businessCustomInterence} from '@/api/api.js'
 import Steps from "./components/Steps.vue";
 import AddRenewal from "./components/AddRenewal";
 import {locationOptions} from "@/views/custom_manage/customList/location"
+import country from "@/utils/countryData"
 export default {
     components: {Steps,AddRenewal},
     data() {
+        this.countryData = country
         return {
             locationOptions,
             locationProps:{
@@ -184,6 +204,7 @@ export default {
                 BusinessName:'',
                 CreditCode:'',
                 Address:'',
+                Nation:'',
                 Leader:'',
                 ResearchTeamSize:'',
                 CapitalScale:'',
@@ -194,6 +215,7 @@ export default {
                 City:''
             },
             rules:{
+                Nation:[{ required: true, message: '请选择所属国家', trigger: 'change' },],
                 address:[{ required: true, message: '请选择商家地址', trigger: 'change' },],
                 decisionMaker:[{required: true, message: '请输入决策人', trigger: 'blur' },],
                 teamSize:[{required: true, message: '请选择研究团队规模', trigger: 'change' },],
@@ -204,7 +226,7 @@ export default {
             recordData:[],
             tableColOpts:[
                 {
-                    label:'签约时间',
+                    label:'运维时间',
                     key:'SigningTime'
                 },{
                     label:'到期时间',
@@ -216,6 +238,8 @@ export default {
             ],
             activities:[],
             showRenewal:false,
+            renewalDiaTitle:"添加续约",
+            renewalForm:{}
         }
     },
     created() {
@@ -277,13 +301,13 @@ export default {
         // 保存商家
         handleSaveDetail(){
             const {EtaBusinessId,CapitalScale,
-                   address,Leader,IndustryId,
+                   address,Leader,IndustryId,Nation,
                    ResearchTeamSize,UserMax} = this.firstFormData
             const IndustryName = this.tradeArr.find(item=>item.IndustryId===IndustryId).IndustryName
             businessCustomInterence.editBusiness({
                 EtaBusinessId,Leader,
                 IndustryName,CapitalScale,
-                ResearchTeamSize,
+                ResearchTeamSize,Nation,
                 IndustryId:Number(IndustryId),
                 UserMax:Number(UserMax),
                 Province:address[0],
@@ -294,15 +318,49 @@ export default {
                 this.getBusinessDetail()
             })
         },
-        //添加续约
-        handleAddRenewal({signDate,expirationDate}){
-            businessCustomInterence.addNewContract({
+        // 添加续约
+        addRenewalHandle(){
+            this.renewalForm={}
+            this.renewalDiaTitle="添加续约"
+            this.showRenewal=true
+        },
+        // 编辑续约
+        editRenewal(row){
+            this.renewalDiaTitle="编辑续约"
+            this.renewalForm={
+                id:row.EtaBusinessContractId,
+                signDate:row.SigningTime,
+                expirationDate:row.ExpiredTime
+            }
+            this.showRenewal=true
+        },
+        deleteRenewal(row){
+            this.$confirm("是否确认删除该签约信息?", "提示", {
+                type: "warning"
+            }).then(() => {
+                businessCustomInterence.
+                removeContract({EtaBusinessContractId:row.EtaBusinessContractId})
+                .then(res=>{
+                    if(res.Ret == 200){
+                        this.$message.success("删除成功")
+                        this.getTableData(Number(this.$route.query.id))
+                        this.getTimeLineData(Number(this.$route.query.id))
+                    }
+                })
+            }).catch(() => {});
+        },
+        //添加续约-保存
+        handleAddRenewal({signDate,expirationDate,id}){
+            // id-商家合约ID
+            let api = Number(id) ? 'editContract' : 'addNewContract'
+            businessCustomInterence[api]({
                 EtaBusinessId:Number(this.$route.query.id),
+                EtaBusinessContractId:Number(id),
                 SigningTime:signDate,
                 ExpiredTime:expirationDate
             }).then(res=>{
                 if(res.Ret!==200) return 
-                this.$message.success('添加续约成功')
+                this.$message.success(this.renewalDiaTitle+'成功')
                 this.showRenewal=false
                 this.getTableData(Number(this.$route.query.id))
                 this.getTimeLineData(Number(this.$route.query.id))
@@ -345,7 +403,7 @@ export default {
             }
         }
         .el-table{
-            margin-top: 30px;
+            margin-top: 15px;
         }
     }
     .business-other{

+ 17 - 2
src/views/business_ETA_manage/businessList.vue

@@ -57,6 +57,14 @@
                     @change="changeSelectOptions('location')" 
                     placeholder="请选择客户地址" 
                 />
+                <el-select v-model="nation" placeholder="请选择所属国家" filterable clearable @change="changeSelectOptions('nation')">
+                    <el-option :label="item.cnName" :value="item.cnName" v-for="item in countryData" :key="item.code" >
+                        <div style="display: flex;justify-content: space-between;">
+                            <span>{{ item.cnName }}</span>
+                            <span style="color: #8492a6; font-size: 13px">{{ item.code }}</span>
+                        </div>
+                    </el-option>
+                </el-select>
                 <el-select 
                     v-model="signStatus" 
                     placeholder="请选择签约状态" 
@@ -94,6 +102,9 @@
                             <span v-else-if="item.key==='BusinessName'" class="link" @click="handleShowDetail(scope.row)">
                                 {{ scope.row.BusinessName }}
                             </span>
+                            <span v-else-if="item.key==='Address'">
+                                {{ scope.row.RegionType=='海外'?scope.row.Nation || scope.row.Address:scope.row.Address }}
+                            </span>  
                             <span v-else>{{scope.row[item.key]}}</span>
                         </template>
                     </el-table-column>
@@ -175,9 +186,11 @@ import { customInterence ,businessCustomInterence , roadshowInterence} from '@/a
 import {locationOptions} from "@/views/custom_manage/customList/location"
 import AddRenewal from './components/AddRenewal.vue'
 import ModifySaller from './components/ModifySaller.vue'
+import country from "@/utils/countryData"
 export default {
     components:{AddRenewal,ModifySaller},
     data() {
+        this.countryData = country
         return {
             /* dialog */
             showRenewal:false,//显示添加续约
@@ -194,6 +207,7 @@ export default {
             valueLocation:[],
             provinceValue:'',
             cityValue:'',
+            nation:'',
             locationProps:{
                 multiple: true,
                 value:'name',
@@ -234,7 +248,7 @@ export default {
                     key:'BusinessCode'
                 },
                 {
-                    label:'商家地址',
+                    label:'商家地址/所属国家',
                     key:'Address'
                 },
                 {
@@ -246,7 +260,7 @@ export default {
                     key:'SigningStatus'
                 },
                 {
-                    label:'最新签约时间',
+                    label:'运维开始时间',
                     key:'SigningTime',
                     sort:true
                 },
@@ -321,6 +335,7 @@ export default {
                 Province:this.provinceValue,
                 City:this.cityValue,
                 IndustryId:Number(this.trade),
+                Nation:this.nation,
                 PageSize:this.pageSize,
                 CurrentIndex:this.page,
                 SortParam:this.sortParam,

+ 30 - 10
src/views/business_ETA_manage/components/AddRenewal.vue

@@ -7,7 +7,7 @@
             label-width="100px" 
             class="demo-ruleForm"
         >
-            <el-form-item label="签约时间" prop="signDate">
+            <el-form-item label="运维时间" prop="signDate">
                 <el-date-picker
                     v-model="ruleForm.signDate"
                     type="date"
@@ -33,13 +33,34 @@
 
 <script>
 export default {
+    props:{
+        renewalForm:{
+            type:Object,
+            default:()=>{
+                return {}
+            }
+        }
+    },
+    watch:{
+        renewalForm:{
+            handler:function(value){
+                if(value.id){
+                    this.ruleForm.id = value.id || 0
+                    this.ruleForm.signDate = value.signDate || ''
+                    this.ruleForm.expirationDate = value.expirationDate || ''
+                }
+            },
+            immediate:true
+        }
+    },
     data() {
         return {
             rules:{
-                signDate:[{required: true, message: '请选择签署日期', trigger: 'change' },],
-                expirationDate:[{required: true, message: '请选择签署日期', trigger: 'change' },],
+                signDate:[{required: true, message: '请选择运维时间', trigger: 'change' },],
+                expirationDate:[{required: true, message: '请选择到期时间', trigger: 'change' },],
             },
             ruleForm:{
+                id:0,
                 signDate:'',
                 expirationDate:''
             }
@@ -51,7 +72,7 @@ export default {
                 if(valid){
                     const flag=this.$moment(this.ruleForm.signDate).isBefore(this.ruleForm.expirationDate);
                     if(!flag){
-                        this.$message.warning('到期时间不得早于签约时间')
+                        this.$message.warning('到期时间不得早于运维时间')
                         return
                     }
                     this.$emit('addRenewal',this.ruleForm)
@@ -60,9 +81,12 @@ export default {
             })
         },
         initForm(){
+            this.ruleForm.id = 0
             this.ruleForm.signDate = ''
             this.ruleForm.expirationDate = ''
-            this.$refs.ruleForm.resetFields();
+            this.$nextTick(()=>{
+                this.$refs.ruleForm.clearValidate();
+            })
         },
         handleClose(){
             this.initForm()
@@ -70,8 +94,4 @@ export default {
         }
     },
 }
-</script>
-
-<style>
-
-</style>
+</script>

+ 134 - 0
src/views/contract_manage/components/tableColums.js

@@ -0,0 +1,134 @@
+//表格列
+export const tableColums = (type) => {
+  return type == 1
+    ? [
+        {
+          label: "订单号",
+          key: "OrderCode",
+          widthsty: 190,
+        },
+        {
+          label: "姓名",
+          key: "RealName",
+          widthsty: 80,
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+          widthsty: 110,
+        },
+        {
+          label: "公司名称",
+          key: "CompanyName",
+        },
+        {
+          label: "所属销售",
+          key: "SellerName",
+          widthsty: 100,
+        },
+        {
+          label: "推荐人",
+          key: "InviteName",
+          widthsty: 100,
+        },
+        {
+          label: "金额",
+          key: "OrderMoney",
+          widthsty: 80,
+        },
+        {
+          label: "创建时间",
+          key: "CreateTime",
+        },
+        {
+          label: "畅读卡类型",
+          key: "PaymentProject",
+          widthsty: 100,
+        },
+        {
+          label: "支付渠道",
+          key: "PaymentTypeText",
+        },
+        {
+          label: "有效期",
+          key: "StartDate",
+        },
+        {
+          label: "付款对象",
+          key: "SourceTitle",
+        },
+        {
+          label: "状态",
+          key: "OrderStatusText",
+          widthsty: 90,
+        },
+        {
+          label: "支付时间",
+          key: "PayTime",
+        },
+       
+      ]
+    : type == 2
+    ? [
+        {
+          label: "订单号",
+          key: "OrderCode",
+          widthsty: 190,
+        },
+        {
+          label: "姓名",
+          key: "RealName",
+          widthsty: 80,
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+          widthsty: 110,
+        },
+        {
+          label: "公司名称",
+          key: "CompanyName",
+        },
+        {
+          label: "所属销售",
+          key: "SellerName",
+          widthsty: 100,
+        },
+        {
+          label: "推荐人",
+          key: "InviteName",
+          widthsty: 100,
+        },
+        {
+          label: "金额",
+          key: "OrderMoney",
+          widthsty: 80,
+        },
+        {
+          label: "创建时间",
+          key: "CreateTime",
+        },
+        {
+          label: "付款项目",
+          key: "PaymentProject",
+        },
+        {
+          label: "支付渠道",
+          key: "PaymentTypeText",
+        },
+        {
+          label: "标题",
+          key: "SourceTitle",
+        },
+        {
+          label: "状态",
+          key: "OrderStatusText",
+          widthsty: 90,
+        },
+        {
+          label: "支付时间",
+          key: "PayTime",
+        },
+      ]
+    : [];
+};

+ 326 - 0
src/views/contract_manage/paymentRecords.vue

@@ -0,0 +1,326 @@
+<template>
+  <div class="container payment-records-container">
+    <div class="dataReport-top">
+      <span v-for="item in tabsList" :key="item.key" :class="tabs_index == item.key ? 'tab_active' : ''" @click="tabActive(item)">{{ item.lable }}</span>
+    </div>
+    <el-card>
+      <div class="select-box">
+        <el-date-picker
+          style="margin-bottom: 20px; margin-right: 20px; width: 300px"
+          v-model="timeRange"
+          type="daterange"
+          @change="handleSelectChange"
+          value-format="yyyy-MM-dd"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        >
+        </el-date-picker>
+        <el-cascader
+          v-model="sales"
+          placeholder="所属销售"
+          style="width: 220px; margin: 0 20px 20px 0"
+          :options="salesArr"
+          :props="defaultSalesProps"
+          :show-all-levels="false"
+          collapse-tags
+          clearable
+          filterable
+          @change="handleSelectChange"
+        >
+        </el-cascader>
+
+        <el-select v-if="tabs_index != 1" @change="handleSelectChange" style="margin-right: 20px; width: 220px" v-model="payInfo" placeholder="付款项目" clearable>
+          <el-option v-for="item in paymentProjectList" :key="item" :label="item" :value="item"> </el-option>
+        </el-select>
+        <el-select v-if="tabs_index == 1" @change="handleSelectChange" style="margin-right: 20px; width: 220px" v-model="vipType" placeholder="会员类型" clearable>
+          <el-option v-for="item in vipTypeList" :key="item.key" :label="item.lable" :value="item.key"> </el-option>
+        </el-select>
+        <el-select @change="handleSelectChange" style="margin-right: 20px; width: 220px" v-model="paymentType" placeholder="支付渠道" clearable>
+          <el-option v-for="item in paymentTypeList" :key="item.key" :label="item.lable" :value="item.key"> </el-option>
+        </el-select>
+
+        <el-cascader
+          v-model="salesRai"
+          placeholder="推荐人"
+          style="width: 220px; margin: 0 20px 20px 0"
+          :options="salesArrRai"
+          :props="defaultSalesProps"
+          :show-all-levels="false"
+          collapse-tags
+          clearable
+          filterable
+          @change="handleSelectChange"
+        >
+        </el-cascader>
+
+        <el-select @change="handleSelectChange" style="margin-right: 20px; width: 220px" v-model="payStatus" placeholder="支付状态" clearable>
+          <el-option v-for="item in payStatusList" :key="item.key" :label="item.lable" :value="item.key"> </el-option>
+        </el-select>
+        <el-input @input="handleSelectChange" style="margin-right: 20px; width: 220px; margin-bottom: 20px" prefix-icon="el-icon-search" v-model="orderNumber" placeholder="请输入订单号" />
+
+        <el-input @input="handleSelectChange" style="width: 220px; margin-bottom: 20px" prefix-icon="el-icon-search" v-model="keyWord" placeholder="请输入姓名/手机号" />
+      </div>
+      <el-table :data="tableOrderData" style="width: 100%" border>
+        <el-table-column align="center" v-for="item in tableColums" :key="item.key" :prop="item.key" :label="item.label" :width="item.widthsty">
+          <template slot-scope="{ row }">
+            <span @click="handleRowClick(row, item.key)" :style="handleRowStyle(row, item.key)">{{ handleRowContent(row, item.key) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" width="80">
+          <template slot-scope="{ row }">
+            <span v-if="row.OrderStatus == 2" class="editsty" @click="refundHandler(row)">退款</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- 页数选择器 -->
+      <m-page :page_no="page_no" :pageSize="page_size" :total="total" style="margin: 20px 0" @handleCurrentChange="pageChange" />
+    </el-card>
+
+    <el-dialog center v-dialogDrag title="退款" :visible.sync="dialogVisible" append-to-body width="30%" :before-close="handleClose">
+      <div>
+        <el-input type="textarea" :autosize="{ minRows: 6, maxRows: 8 }" placeholder="请输入退款原因" v-model="refundTextarea"> </el-input>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">取 消</el-button>
+        <el-button type="primary" @click="refundDialogHandlerVisible">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { contractInterface, customInterence } from "@/api/api.js";
+import { tableColums } from "./components/tableColums.js";
+import mPage from "@/components/mPage.vue";
+
+export default {
+  name: "",
+  components: {
+    mPage,
+  },
+  props: {},
+  data() {
+    return {
+      tabsList: [
+        { lable: "畅读卡订单", key: 1 },
+        { lable: "单场付费订单", key: 2 },
+      ],
+      paymentProjectList: ["上市公司小范围", "专家调研", "买方交流"],
+      payStatusList: [
+        { lable: "已取消", key: 0 },
+        { lable: "待支付", key: 1 },
+        { lable: "已支付", key: 2 },
+        { lable: "转入退款", key: 3 },
+      ],
+      paymentType: "",
+      paymentTypeList: [
+        { lable: "小程序", key: 1 },
+        { lable: "PC", key: 2 },
+        { lable: "H5", key: 3 },
+      ],
+      tabs_index: 1,
+      timeRange: [], // 时间筛选
+      sales: [],
+      salesArr: [], //销售
+      salesRai: [],
+      salesArrRai: [], //销售
+
+      defaultSalesProps: {
+        multiple: true,
+        label: "RealName",
+        children: "ChildrenList",
+        value: "AdminId",
+      }, //销售级联配置
+      payStatus: "", //支付状态
+      payInfo: "", //付款项目
+      orderNumber: "", //订单号
+      keyWord: "",
+      tableColums: [],
+      tableOrderData: [],
+      total: 0,
+      page_no: 1,
+      page_size: 10,
+      dialogVisible: false, // 退款的弹框
+      refundTextarea: "", // 退款原因
+      orderRefundCode: "",
+      vipType: "",
+      vipTypeList: [
+        { lable: "日卡", key: "日卡" },
+        { lable: "月卡", key: "月卡" },
+      ],
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {
+    this.getSale();
+    this.getSaleRai();
+    this.getOrderList();
+    this.tableColums = tableColums(1);
+  },
+  methods: {
+    /* 获取权益销售 */
+    getSaleRai() {
+      customInterence.getSalesRaiData().then((res) => {
+        if (res.Ret === 200) {
+          this.salesArrRai = res.Data.List;
+        }
+      });
+    },
+    // 修改页码
+    pageChange(page_no) {
+      this.page_no = page_no;
+      this.getOrderList();
+    },
+    /* 获取销售 */
+    getSale() {
+      customInterence.getSale().then((res) => {
+        if (res.Ret === 200) {
+          this.salesArr = res.Data.List;
+        }
+      });
+    },
+    // 获取数据
+    async getOrderList() {
+      let salesArr = [];
+      if (this.sales.length) {
+        salesArr = this.sales.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      let salesArrRai = [];
+      if (this.salesRai.length) {
+        salesArrRai = this.salesRai.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      const res = await contractInterface.getOrderList({
+        PageSize: this.page_size,
+        CurrentIndex: this.page_no,
+        AdminId: salesArr.join(","),
+        StartDate: this.timeRange && this.timeRange.length ? this.timeRange[0] : "",
+        EndDate: this.timeRange && this.timeRange.length ? this.timeRange[1] : "",
+        OrderType: this.tabs_index,
+        PaymentProject: this.payInfo,
+        OrderCode: this.orderNumber,
+        KeyWord: this.keyWord,
+        OrderStatus: this.payStatus,
+        ShareId: salesArrRai.join(","),
+        PaymentType: this.paymentType,
+        UserCardType: this.vipType,
+      });
+      if (res.Ret === 200) {
+        this.tableOrderData = res.Data.List;
+        this.total = res.Data.Paging.Totals || 0;
+      }
+    },
+    tabActive(item) {
+      if (this.tabs_index == item.key) return;
+      this.vipType = "";
+      this.tableColums = tableColums(item.key);
+      this.tabs_index = item.key;
+      this.handleSelectChange();
+    },
+    // 所有筛选的改变
+    handleSelectChange() {
+      this.page_no = 1;
+      this.getOrderList();
+    },
+
+    // 表格三件套
+    // 表格点击了
+    handleRowClick(row, key) {
+      if (key == "CompanyName" && row.CompanyId != 1) {
+        this.$router.replace({
+          path: "/customDetail",
+          query: {
+            id: row.CompanyId,
+          },
+        });
+      } else if (key == "SourceTitle") {
+        window.open(row.HttpUrl, "_blank");
+      }
+    },
+    // 表格样式
+    handleRowStyle(row, key) {
+      let styleColor = {
+        Title: "color: #409eff; cursor: pointer",
+        CompanyName: row.CompanyId == 1 ? "" : "color: #409eff; cursor: pointer",
+        SourceTitle: "color: #409eff; cursor: pointer",
+      };
+      return styleColor[key] ? styleColor[key] : "";
+    },
+    // 文本是否需要处理
+    handleRowContent(row, key) {
+      if (key == "StartDate") return `${row["StartDate"]} ~ ${row["EndDate"]}`;
+      if (key == "OrderStatus") return row[key] == 0 ? "已取消" : row[key] == 1 ? "待支付" : row[key] == 2 ? "已支付" : row[key] == 3 ? "转入退款" : "";
+      return row[key];
+    },
+    // 点击了退款按钮
+    refundHandler(row) {
+      this.orderRefundCode = row.OrderCode;
+      this.dialogVisible = true;
+    },
+    // 关闭了退款弹框
+    handleClose() {
+      this.refundTextarea = "";
+      this.dialogVisible = false;
+    },
+    // 退款的确认弹框
+    async refundDialogHandlerVisible() {
+      if (!this.refundTextarea) return this.$message.warning("退款原因不能为空");
+      const res = await contractInterface.orderRefund({
+        OrderCode: this.orderRefundCode,
+        Remark: this.refundTextarea,
+      });
+      if (res.Ret === 200) {
+        this.$message.success("已提交退款");
+        this.handleClose();
+        this.getOrderList();
+      }
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.payment-records-container {
+  .dataReport-top {
+    display: flex;
+    align-items: center;
+    border: 1px solid #ececec;
+    padding: 20px 30px;
+    background: #fff;
+    border-radius: 4px;
+    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+    margin-bottom: 20px;
+    .tab_active {
+      background-color: #409eff;
+      color: #fff;
+    }
+    span {
+      display: inline-block;
+      box-sizing: border-box;
+      padding: 0 24px;
+      line-height: 38px;
+      height: 40px;
+      background: #ecf5ff;
+      border: 1px solid #b3d8ff;
+      opacity: 1;
+      font-weight: 500;
+      font-size: 16px;
+      color: #409eff;
+      border-radius: 4px;
+      margin-right: 30px;
+      cursor: pointer;
+    }
+  }
+
+  .select-box {
+    /deep/ .el-input {
+      margin-bottom: 20px !important;
+    }
+  }
+}
+</style>

+ 335 - 0
src/views/contract_manage/refundRecord.vue

@@ -0,0 +1,335 @@
+<template>
+  <div class="container payment-records-container">
+    <div class="dataReport-top">
+      <span v-for="item in tabsList" :key="item.key" :class="tabs_index == item.key ? 'tab_active' : ''" @click="tabActive(item)">{{ item.lable }}</span>
+    </div>
+    <el-card>
+      <div class="select-box">
+        <el-date-picker
+          style="margin-bottom: 20px; margin-right: 20px; width: 300px"
+          v-model="timeRange"
+          type="daterange"
+          @change="handleSelectChange"
+          value-format="yyyy-MM-dd"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        >
+        </el-date-picker>
+        <el-cascader
+          v-model="sales"
+          placeholder="所属销售"
+          style="width: 220px; margin: 0 20px 20px 0"
+          :options="salesArr"
+          :props="defaultSalesProps"
+          :show-all-levels="false"
+          collapse-tags
+          clearable
+          filterable
+          @change="handleSelectChange"
+        >
+        </el-cascader>
+
+        <el-select @change="handleSelectChange" style="margin-right: 20px; width: 220px" v-model="payInfo" placeholder="付款项目" clearable>
+          <el-option v-for="item in paymentProjectList" :key="item" :label="item" :value="item"> </el-option>
+        </el-select>
+
+        <el-select @change="handleSelectChange" style="margin-right: 20px; width: 220px" v-model="paymentType" placeholder="支付渠道" clearable>
+          <el-option v-for="item in paymentTypeList" :key="item.key" :label="item.lable" :value="item.key"> </el-option>
+        </el-select>
+
+        <el-cascader
+          v-model="salesRai"
+          placeholder="推荐人"
+          style="width: 220px; margin: 0 20px 20px 0"
+          :options="salesArrRai"
+          :props="defaultSalesProps"
+          :show-all-levels="false"
+          collapse-tags
+          clearable
+          filterable
+          @change="handleSelectChange"
+        >
+        </el-cascader>
+        <el-select @change="handleSelectChange" style="margin-right: 20px; width: 220px" v-model="payStatus" placeholder="退款状态" clearable>
+          <el-option v-for="item in payStatusList" :key="item.key" :label="item.lable" :value="item.key"> </el-option>
+        </el-select>
+        <el-input @input="handleSelectChange" style="margin-right: 20px; width: 220px; margin-bottom: 20px" prefix-icon="el-icon-search" v-model="orderNumber" placeholder="请输入退款单号" />
+
+        <el-input @input="handleSelectChange" style="width: 220px; margin-bottom: 20px" prefix-icon="el-icon-search" v-model="keyWord" placeholder="请输入姓名/手机号" />
+      </div>
+      <el-table :data="tableOrderData" style="width: 100%" border>
+        <el-table-column align="center" v-for="item in tableColums" :key="item.key" :prop="item.key" :label="item.label" :width="item.widthsty">
+          <template slot-scope="{ row }">
+            <span @click="handleRowClick(row, item.key)" :style="handleRowStyle(row, item.key)">{{ handleRowContent(row, item.key) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" width="80">
+          <template slot-scope="{ row }">
+            <span class="editsty" v-if="row.OrderStatus == 2" @click="closeRefundHandler(row)">关闭退款</span>
+            <span class="editsty" v-if="row.RefundRemark" @click="refundHandler(row)">退款原因</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- 页数选择器 -->
+      <m-page :page_no="page_no" :pageSize="page_size" :total="total" style="margin: 20px 0" @handleCurrentChange="pageChange" />
+    </el-card>
+
+    <el-dialog center v-dialogDrag title="退款原因" :visible.sync="dialogVisible" append-to-body width="30%" :before-close="handleClose">
+      <div style="margin-bottom: 30px">
+        {{ refundTextarea }}
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { contractInterface, customInterence } from "@/api/api.js";
+import { tableColums } from "./components/tableColums.js";
+import mPage from "@/components/mPage.vue";
+
+export default {
+  name: "",
+  components: {
+    mPage,
+  },
+  props: {},
+  data() {
+    return {
+      tabsList: [
+        { lable: "畅读卡订单", key: 1 },
+        { lable: "单场付费订单", key: 2 },
+      ],
+      paymentProjectList: ["上市公司小范围", "专家调研", "买方交流"],
+      tabs_index: 1,
+      timeRange: [], // 时间筛选
+      sales: [],
+      payStatusList: [
+        { lable: "退款异常", key: 5 },
+        { lable: "退款成功", key: 3 },
+        { lable: "退款处理中", key: 4 },
+        { lable: "退款关闭", key: 6 },
+      ],
+      salesArr: [], //销售
+
+      salesRai: [],
+      salesArrRai: [], //销售
+      paymentType: "",
+      paymentTypeList: [
+        { lable: "小程序", key: 1 },
+        { lable: "PC", key: 2 },
+        { lable: "H5", key: 3 },
+      ],
+      defaultSalesProps: {
+        multiple: true,
+        label: "RealName",
+        children: "ChildrenList",
+        value: "AdminId",
+      }, //销售级联配置
+      payStatus: "", //支付状态
+      payInfo: "", //付款项目
+      orderNumber: "", //订单号
+      keyWord: "",
+      tableColums: [],
+      tableOrderData: [],
+      total: 0,
+      page_no: 1,
+      page_size: 10,
+      dialogVisible: false, // 退款的弹框
+      refundTextarea: "", // 退款原因
+      orderRefundCode: "",
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {
+    this.getSale();
+    this.getSaleRai();
+    this.getOrderRefundList();
+    this.tableColums = tableColums(1);
+  },
+  methods: {
+    /* 获取权益销售 */
+    getSaleRai() {
+      customInterence.getSalesRaiData().then((res) => {
+        if (res.Ret === 200) {
+          this.salesArrRai = res.Data.List;
+        }
+      });
+    },
+    // 修改页码
+    pageChange(page_no) {
+      this.page_no = page_no;
+      this.getOrderRefundList();
+    },
+    /* 获取销售 */
+    getSale() {
+      customInterence.getSale().then((res) => {
+        if (res.Ret === 200) {
+          this.salesArr = res.Data.List;
+        }
+      });
+    },
+    // 获取数据
+    async getOrderRefundList() {
+      let salesArr = [];
+      if (this.sales.length) {
+        salesArr = this.sales.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      let salesArrRai = [];
+      if (this.salesRai.length) {
+        salesArrRai = this.salesRai.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      const res = await contractInterface.orderRefundList({
+        PageSize: this.page_size,
+        CurrentIndex: this.page_no,
+        AdminId: salesArr.join(","),
+        StartDate: this.timeRange && this.timeRange.length ? this.timeRange[0] : "",
+        EndDate: this.timeRange && this.timeRange.length ? this.timeRange[1] : "",
+        OrderType: this.tabs_index,
+        PaymentProject: this.payInfo,
+        OrderCode: this.orderNumber,
+        KeyWord: this.keyWord,
+        OrderStatus: this.payStatus,
+        ShareId: salesArrRai.join(","),
+        PaymentType: this.paymentType,
+      });
+      if (res.Ret === 200) {
+        this.tableOrderData = res.Data.List;
+        this.total = res.Data.Paging.Totals || 0;
+      }
+    },
+    tabActive(item) {
+      if (this.tabs_index == item.key) return;
+      this.tableColums = tableColums(item.key);
+      this.tabs_index = item.key;
+      this.handleSelectChange();
+    },
+    // 所有筛选的改变
+    handleSelectChange() {
+      this.page_no = 1;
+      this.getOrderRefundList();
+    },
+
+    // 表格三件套
+    // 表格点击了
+    handleRowClick(row, key) {
+      if (key == "CompanyName" && row.CompanyId != 1) {
+        this.$router.replace({
+          path: "/customDetail",
+          query: {
+            id: row.CompanyId,
+          },
+        });
+      } else if (key == "SourceTitle") {
+        window.open(row.HttpUrl, "_blank");
+      }
+    },
+    // 表格样式
+    handleRowStyle(row, key) {
+      let styleColor = {
+        Title: "color: #409eff; cursor: pointer",
+        CompanyName: row.CompanyId == 1 ? "" : "color: #409eff; cursor: pointer",
+        SourceTitle: "color: #409eff; cursor: pointer",
+      };
+      return styleColor[key] ? styleColor[key] : "";
+    },
+    // 文本是否需要处理
+    handleRowContent(row, key) {
+      if (key == "StartDate") return `${row["StartDate"]} ~ ${row["EndDate"]}`;
+      if (key == "OrderStatus") return row[key] == 0 ? "已取消" : row[key] == 1 ? "待支付" : row[key] == 2 ? "已支付" : row[key] == 3 ? "已退款" : "";
+      return row[key];
+    },
+    // 点击了退款按钮
+    refundHandler(row) {
+      this.refundTextarea = row.RefundRemark;
+      this.dialogVisible = true;
+    },
+    // 关闭了退款弹框
+    handleClose() {
+      this.refundTextarea = "";
+      this.dialogVisible = false;
+    },
+    // 关闭退款
+    closeRefundHandler(row) {
+      this.$confirm("确定要关闭这笔退款吗?", "关闭退款", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          contractInterface
+            .refundRevokeOrder({
+              OrderCode: row.OrderCode,
+            })
+            .then(() => {
+              this.getOrderRefundList();
+              this.$message({
+                type: "success",
+                message: "操作成功!",
+              });
+            });
+        })
+        .catch(() => {});
+    },
+    // 退款的确认弹框
+    async refundDialogHandlerVisible() {
+      if (!this.refundTextarea) return this.$message.warning("退款原因不能为空");
+      // 等待接口
+      const res = await contractInterface.orderRefund({
+        OrderCode: this.orderRefundCode,
+        Remark: this.refundTextarea,
+      });
+      if (res.Ret === 200) {
+        this.$message.success("操作成功");
+        this.handleClose();
+      }
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.payment-records-container {
+  .dataReport-top {
+    display: flex;
+    align-items: center;
+    border: 1px solid #ececec;
+    padding: 20px 30px;
+    background: #fff;
+    border-radius: 4px;
+    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+    margin-bottom: 20px;
+    .tab_active {
+      background-color: #409eff;
+      color: #fff;
+    }
+    span {
+      display: inline-block;
+      box-sizing: border-box;
+      padding: 0 24px;
+      line-height: 38px;
+      height: 40px;
+      background: #ecf5ff;
+      border: 1px solid #b3d8ff;
+      opacity: 1;
+      font-weight: 500;
+      font-size: 16px;
+      color: #409eff;
+      border-radius: 4px;
+      margin-right: 30px;
+      cursor: pointer;
+    }
+  }
+
+  .select-box {
+    /deep/ .el-input {
+      margin-bottom: 20px;
+    }
+  }
+}
+</style>

+ 2 - 2
src/views/custom_manage/customList/applyTurn.vue

@@ -281,7 +281,7 @@ export default {
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.Item.PermissionList.length&&res.Data.Item.PermissionList.forEach(item => {
 						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032,52,53,54].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032,52,53,54,138,62].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {
@@ -325,7 +325,7 @@ export default {
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.List.length&&res.Data.List.forEach(item => {
 						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032,52,53,54].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032,52,53,54,138,62].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {

+ 1 - 2
src/views/custom_manage/customList/components/raiPermissionbox.vue

@@ -42,7 +42,7 @@
         <el-checkbox-group v-model="data.CheckList" style="height: unset;">
           <div class="rai-checkbox-upS-box" >
             <el-checkbox :label="itP.ChartPermissionId" v-for="(itP,inP) in data.ItemsPrivate" 
-            :key="itP.ChartPermissionId" :disabled="itP.disabled" :style="{'height':hasNoChild?'48px':'95px','width':itemsPrivateWidth[inP]}"
+            :key="itP.ChartPermissionId" :disabled="itP.disabled" :style="{'height':hasNoChild?'48px':'95px','width':itP.ChartPermissionId == 52 && data.CheckList.includes(52)? '220px' : itP.PermissionName.includes('研选')?'130px':'84px'}"
             class="rai-checkbox-item upS-item" @change="e => handlePrivateChecked(e,itP,data)">
             {{ itP.PermissionName }}
             <p v-if="itP.ChartPermissionId == 31" class="checkbox-text">(30000元/年)</p>
@@ -65,7 +65,6 @@
   export default {
     name:'raiPermissionbox',
     data() {
-		  this.itemsPrivateWidth=['84px','146px','260px','84px']
       return {
         minus_sign_val:''
       }

+ 1 - 0
src/views/custom_manage/customList/customDetail.vue

@@ -235,6 +235,7 @@
 							<span :class="{'isShared':scope.row.IsShared}">{{scope.row.RealName}}</span>
 						</template>
 					</el-table-column>
+					<el-table-column prop="Position" label="职位" align="center" min-width="80px"></el-table-column>
 					<el-table-column
 					prop="Mobile"
 					label="手机号"

+ 6 - 0
src/views/custom_manage/customList/customShareList.vue

@@ -1042,6 +1042,12 @@ export default {
 	created() {
 		this.getSale()
 		this.getoriginalSale()
+		//权益销售和权益销售组长,默认选中【已分配】,权益管理员默认选中【待分配】
+		if(localStorage.getItem('RoleType')==='权益'){
+			if(!this.roleType.includes('admin')){
+				this.status = 1
+			}
+		}
 		this.getTableData()
 	}
 }

+ 2 - 5
src/views/custom_manage/customList/editCustom.vue

@@ -257,6 +257,7 @@
 							<span>{{scope.row.RealName}}</span>
 						</template>
 					</el-table-column>
+					<el-table-column prop="Position" label="职位" align="center" min-width="80px"></el-table-column>
 					<el-table-column
 					prop="Mobile"
 					label="手机号"
@@ -1230,10 +1231,6 @@ export default {
 		},
 		/* 导入联系人打开弹窗 */
 		async importHandle() {
-			// this.isShowImportDia = true;
-			// let have_card = this.userTable.some(item => {
-			// 	return item.BusinessCardUrl;
-			// })
 			let totalRes=await customInterence.companyUserTotal({CompanyId:this.companyId})
 			if(totalRes.Ret===200){
 				if(totalRes.Data.Total>=1) {
@@ -1354,11 +1351,11 @@ export default {
 	mounted() {
 		this.getDetail();
 		this.getSale();
-		this.getuserTable();
 		this.getCustomerSourceList()
 		this.getIndustry('ficc')
 		this.getIndustry('权益')
 		this.roleDepart = localStorage.getItem('RoleType') || '';
+		this.getuserTable();
 	},
 }
 </script>

+ 1 - 1
src/views/custom_manage/customList/mixins/quartersMixin.js

@@ -84,7 +84,7 @@ export default {
   watch: {
     selectedQuarters(newValue, oldValue) {
       if (!newValue.length) return;
-      if (!this.isConsecutiveSelection() && this.showAlert) {
+      if (!this.isConsecutiveSelection() && this.showAlert && this.isXClassCustom) {
         this.showAlert = false;
         this.selectedQuarters.pop();
         this.$message.error("只能选择相邻的季度");

+ 2 - 2
src/views/custom_manage/customList/updateServe.vue

@@ -433,7 +433,7 @@ export default {
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.Item.PermissionList.length&&res.Data.Item.PermissionList.forEach(item => {
 						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,52,20031,20032,53,54].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,52,20031,20032,53,54,138,62].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {
@@ -509,7 +509,7 @@ export default {
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.List.length&&res.Data.List.forEach(item => {
 						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,52,20031,20032,53,54].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,52,20031,20032,53,54,138,62].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {

+ 1 - 0
src/views/custom_manage/points/AddNewEntries.vue

@@ -200,6 +200,7 @@ export default {
     },
     // 输入框的限制
     restrictInput(item) {
+      if (this.tabsPitchon == 1) return;
       if (item.Proportion) if (item.Proportion > 100) return (item.Proportion = 100);
       if (item.Proportion < -100) return (item.Proportion = -100);
     },

+ 12 - 1
src/views/custom_manage/points/EntryRecords.vue

@@ -27,7 +27,7 @@
       </el-cascader>
       <el-button type="primary" @click="$router.push('AddNewEntries')"> 新增</el-button>
       <a :href="exportUser" download>
-        <el-button type="primary" style="width: 80px;margin-left:15px">导出</el-button>
+        <el-button type="primary" style="width: 80px; margin-left: 15px">导出</el-button>
       </a>
     </div>
 
@@ -61,12 +61,17 @@
           </template>
         </el-table-column>
       </el-table>
+      <!-- 分页 -->
+      <el-col :span="24" class="toolbar">
+        <m-page :total="total" :page_no="page_no" :pageSize="pageSize" @handleCurrentChange="handleCurrentChange" />
+      </el-col>
     </div>
   </div>
 </template>
 
 <script>
 import { customInterence, xClassCustomApi } from "@/api/api.js";
+import mPage from "@/components/mPage.vue";
 export default {
   name: "EntryRecords",
   props: {
@@ -75,6 +80,7 @@ export default {
       default: "",
     },
   },
+  components: { mPage },
   computed: {
     exportUser() {
       let baseUrl = process.env.API_ROOT + "/cygx/enterScore/list";
@@ -222,6 +228,11 @@ export default {
       this.page_no = 1;
       this.getDataList();
     },
+    //分页
+    handleCurrentChange(page) {
+      this.page_no = page;
+      this.getDataList();
+    },
   },
 };
 </script>

+ 2 - 2
src/views/ficc_manage/chapterVariety.vue

@@ -113,7 +113,7 @@
               size="small"
               name="file3"
               @change="fileSelected(3)"
-              id="file6"
+              id="file3"
               class="true-file"
               style="display: none"
             />
@@ -143,7 +143,7 @@
               size="small"
               name="file4"
               @change="fileSelected(4)"
-              id="file6"
+              id="file4"
               class="true-file"
               style="display: none"
             />

+ 0 - 1
src/views/interaction_manage/bannerStatistics.vue

@@ -12,7 +12,6 @@
         </thead>
         <tbody v-for="item in tableData" :key="item.ViewHistoryID">
           <tr v-for="(_item, index) in item.SourceList" :key="_item.LastUpdatedTime">
-            <!-- <td class="thead-rs" :rowspan="item.SourceList.length" v-if="index == 0"> <img :src="item.BannerUrl" class="table-img" alt="" /></td> -->
             <td class="thead-rs" :rowspan="item.SourceList.length" v-if="index == 0">{{ item.Remark }}</td>
             <td class="thead-rs" :rowspan="item.SourceList.length" v-if="index == 0">{{ item.StartDate }} -- {{ item.EndDate }}</td>
             <td class="thead-rs" :rowspan="item.SourceList.length" v-if="index == 0">{{ item.Pv }}</td>

+ 7 - 2
src/views/interaction_manage/components/connectiveReportDialog.vue

@@ -61,11 +61,15 @@ export default {
     isShow:{
       type:Boolean,
       default:false
+    },
+    reportId:{
+      type:Number,
+      default:0
     }
   },
   data() {
     return {
-      ReportId:'',
+      ReportId:0,
       searchTitle:'',
       searchType:'',
       reportTypeList:[],
@@ -75,7 +79,7 @@ export default {
   watch:{
     isShow(val){
       if(val){
-        this.ReportId=''
+        this.ReportId=this.reportId
         this.searchTitle=''
         this.searchType=''
         this.getTableData()
@@ -109,6 +113,7 @@ export default {
     saveHandle(){
       //检查该报告是否已关联视频
       const item = this.reportList.find(i=>i.ReportId==this.ReportId)
+      if(!item) return 
       if(item.BindVideo){
         this.$message.error(`该报告已关联${item.BindVideoTitle},请重新选择`)
         return 

+ 104 - 0
src/views/interaction_manage/components/moneyDetailsChart.vue

@@ -0,0 +1,104 @@
+<template>
+  <div class="bar-chart" ref="moneyChart" style="height: 400px"></div>
+</template>
+
+<script>
+export default {
+  name: "",
+  props: {
+    title: {
+      type: String,
+    },
+    chartData: {
+      type: Array,
+      default: [],
+    },
+  },
+  data() {
+    return {
+      dateList: "",
+    };
+  },
+  watch: {
+    chartData: {
+      handler(newChart) {
+        if (newChart.length == 2) {
+          this.drawChart();
+        }
+      },
+    },
+  },
+  methods: {
+    drawChart() {
+      const chart = this.$refs.moneyChart;
+      const transformedData = this.chartData.map((item) => ({
+        name: item.Name, // 将 Name 转换为 name
+        value: item.Percentage, // 将 Percentage 转换为 value
+        details: {
+          Count: item.Count,
+          Amount: item.Amount,
+        },
+      }));
+      if (chart) {
+        const myChart = echarts.init(chart);
+        const option = {
+          tooltip: {
+            show: true,
+            trigger: "item",
+            formatter: function (params) {
+              return `${params.name}${params.value}%`;
+            },
+          },
+          legend: {
+            // top: "0%",
+            left: "center",
+          },
+          color: ["#409EFF", "#BDD7F1"],
+          series: [
+            {
+              name: "",
+              type: "pie",
+              radius: "70%",
+              avoidLabelOverlap: false,
+              label: {
+                show: true,
+                position: "outside",
+                //position: "inner",
+                formatter(params) {
+                  const details = params.data.details;
+                  console.log(params);
+                  let str = details.Amount ? `付款金额:${details.Amount || ""}元` : "";
+                  return `人数:${details.Count}人\n${str}`;
+                },
+                rich: {
+                  title: {},
+                  value: {},
+                  detail: {},
+                },
+              },
+              labelLine: {},
+              data: transformedData,
+            },
+          ],
+        };
+        myChart.setOption(option);
+        window.addEventListener("resize", function () {
+          myChart.resize();
+        });
+      }
+      this.$on("hook:destroyed", () => {
+        window.removeEventListener("resize", function () {
+          myChart.resize();
+        });
+      });
+    },
+  },
+  created() {},
+  mounted() {
+    // this.$nextTick(() => {
+    //   this.drawChart();
+    // });
+  },
+};
+</script>
+<style lang="scss" scoped></style>

+ 155 - 0
src/views/interaction_manage/registrationDetails.vue

@@ -0,0 +1,155 @@
+<template>
+  <div class="container registration-details">
+    <div class="content">
+      <div>
+        <el-table :data="tableData" show-summary style="width: 538px" border>
+          <el-table-column align="center" prop="RealName" label="分享人">
+            <template slot-scope="{ row }">
+              <span>{{ row.RealName }}({{ row.CompanyName }})</span>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="Count" label="报名数量" width="196">
+            <template slot-scope="{ row }">
+              <span class="editsty" @click="numberHandler(row)">{{ row.Count }}</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div class="chart-content">
+        <moneyDetailsChart :chartData="chartData" />
+      </div>
+    </div>
+    <!-- 点击量详情 -->
+    <el-dialog :visible.sync="showDetails" :modal-append-to-body="false" v-dialogDrag width="65vw" @close="cancelHandle">
+      <div slot="title">{{ shareInfo.RealName }}-报名详情</div>
+      <div style="margin-bottom: 118px">
+        <el-table :data="detailsList" style="width: 100%; margin: 20px 0 30px" ref="clickNumberRef" border @sort-change="detailSortChange">
+          <el-table-column prop="CustomCompanyName" label="公司名称" align="center"> </el-table-column>
+          <el-table-column prop="CustomName" label="姓名" align="center"> </el-table-column>
+          <el-table-column prop="CustomMobile" label="手机号" align="center"> </el-table-column>
+          <el-table-column prop="CreateTime" label="报名时间" align="center" min-width="140"> </el-table-column>
+          <el-table-column prop="Amount" label="付款金额(元)" align="center" min-width="140">
+            <template slot-scope="scope">
+              <div v-if="scope.row.Enable == 1">
+                <!-- 如果数据不为空,则双击后显示输入框 -->
+                <div v-if="scope.row.isInput" @dblclick="handleDoubleClick(scope.$index, scope.row)">
+                  <span class="editsty" v-if="scope.row.isInput">
+                    {{ scope.row.Amount }}
+                  </span>
+                </div>
+                <!-- 如果数据为空,则默认显示输入框 -->
+                <div v-else>
+                  <el-input style="width: 90%" type="number" @input="handleInput(scope.row)" v-model.number="scope.row.Amount" @blur="handleBlur(scope.$index, scope.row)"></el-input>
+                </div>
+              </div>
+              <span v-else>{{ scope.row.Amount }}</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { departInterence } from "@/api/api.js";
+
+import moneyDetailsChart from "./components/moneyDetailsChart.vue";
+export default {
+  data() {
+    return {
+      tableData: [],
+      showDetails: false,
+      detailsList: [],
+      chartData: [],
+      shareInfo: {},
+    };
+  },
+  components: { moneyDetailsChart },
+  mounted() {
+    this.getDataList();
+  },
+  methods: {
+    // 点击了数量
+    numberHandler(row) {
+      this.showDetails = true;
+      this.shareInfo = row;
+      this.getdetailsDataList(row);
+    },
+    // 关闭了弹框
+    cancelHandle() {
+      this.detailsList = [];
+      this.showDetails = false;
+      this.shareInfo = {};
+    },
+    // 双击切换输入框
+    handleDoubleClick(index, row) {
+      row.isInput = false;
+    },
+    // 失去焦点后的请求
+    handleBlur(index, row) {
+      // 可能需要更新tableData来反映新输入的值
+      this.editAmount(row);
+      // 完成编辑,隐藏输入框
+      row.isInputBol = row.Amount && row.Amount > 0 ? true : false;
+    },
+    // 输入框的值
+    handleInput(row) {
+      row.Amount = row.Amount ? row.Amount : 0;
+    },
+    // 获取数据
+    async getDataList() {
+      const res = await departInterence.getResearchStatisticsItem({
+        BannerId: +this.$route.query.id,
+      });
+      if (res.Ret === 200) {
+        this.tableData = res.Data.List || [];
+        this.chartData = [res.Data.HasPayed, res.Data.NoPay];
+      }
+    },
+    // 获取数据
+    async getdetailsDataList(row) {
+      const res = await departInterence.getResearchStatisticsDetail({
+        Mobile: row.Mobile,
+        BannerId: row.BannerId,
+      });
+      if (res.Ret === 200) {
+        const arr = res.Data || [];
+        this.detailsList = arr.map((item) => {
+          return {
+            ...item,
+            isInput: item.Amount && item.Amount > 0 ? true : false,
+          };
+        });
+      }
+    },
+    // 修改金额
+    async editAmount(row) {
+      const res = await departInterence.getResearchStatisticsAmount({
+        YbResearchSignupStatisticsId: row.YbResearchSignupStatisticsId,
+        Amount: row.Amount,
+      });
+      if (res.Ret === 200) {
+        this.$message.success("修改成功");
+      }
+    },
+  },
+  beforeRouteEnter(to, from, next) {
+    if (to.query.name) {
+      to.matched[1].name = to.query.name + "报名详情";
+    }
+    next();
+  },
+};
+</script>
+<style scoped lang="scss">
+.registration-details {
+  .content {
+    display: flex;
+    .chart-content {
+      flex: 1;
+      flex-shrink: 0;
+    }
+  }
+}
+</style>

+ 98 - 0
src/views/interaction_manage/researchStatistics.vue

@@ -0,0 +1,98 @@
+<template>
+  <div class="container research-statistics-content">
+    <p class="lable-txt">进行中</p>
+    <div class="progress-box">
+      <div class="progress-item" v-for="item in ongoingList" :key="item.BannerId" @click="goDetailHandler(item)">
+        <p class="title">{{ item.Remark }}</p>
+        <p class="time">{{ item.StartDate }}~{{ item.EndDate }}</p>
+        <p class="num">报名人数:{{ item.Count }}</p>
+      </div>
+    </div>
+    <p class="lable-txt">已结束</p>
+    <div class="progress-box">
+      <div class="progress-item item-end" v-for="item in overList" :key="item.BannerId" @click="goDetailHandler(item)">
+        <p class="title">{{ item.Remark }}</p>
+        <p class="time">{{ item.StartDate }}~{{ item.EndDate }}</p>
+        <p class="num">报名人数:{{ item.Count }}</p>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { departInterence } from "@/api/api.js";
+
+export default {
+  name: "",
+  components: {},
+  props: {},
+  data() {
+    return {
+      ongoingList: [],
+      overList: [],
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {
+    this.getDataList();
+  },
+  methods: {
+    // 获取数据
+    async getDataList() {
+      const res = await departInterence.getResearchStatistics();
+      if (res.Ret === 200) {
+        this.ongoingList = res.Data.OngoingList || [];
+        this.overList = res.Data.OverList || [];
+      }
+    },
+    // 跳转详情
+    goDetailHandler(item) {
+      this.$router.push({
+        path: "registrationDetails",
+        query: {
+          id: item.BannerId,
+          name:item.Remark
+        },
+      });
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.research-statistics-content {
+  .lable-txt {
+    margin-bottom: 20px;
+  }
+  .progress-box {
+    display: flex;
+    flex-wrap: wrap;
+    .progress-item {
+      width: 292px;
+      height: 126px;
+      padding: 20px;
+      color: #409eff;
+      border-radius: 4px;
+      border: 1px solid #b3d8ff;
+      background-color: #ecf5ff;
+      margin: 0 20px 20px 0;
+      box-sizing: border-box;
+      cursor: pointer;
+      display: flex;
+      flex-direction: column;
+      justify-content: space-between;
+    }
+    .item-end {
+      color: #666666;
+      border: 1px solid #c0c4cc;
+      background-color: #f2f6fa;
+      &:hover {
+        color: #409eff;
+        border: 1px solid #b3d8ff;
+        background-color: #ecf5ff;
+      }
+    }
+  }
+}
+</style>

+ 30 - 6
src/views/interaction_manage/videoManage.vue

@@ -12,7 +12,7 @@
             <el-input
                 placeholder="关键词搜索"
                 v-model="keyword"
-                style="maxWidth:520px"
+                style="max-width:520px"
                 @input="searchHandle"
                 clearable
                 v-if="navType!==2"
@@ -212,6 +212,7 @@
                             v-model="popData.permission"
                             collapse-tags
                             placeholder="请选择品种"
+                            :disabled="!!reportId && isReportHasPermission"
                         ></el-cascader>
                     </el-form-item>
                     <el-form-item label="视频" prop="videoUrl">
@@ -234,7 +235,11 @@
                     </el-form-item>
                     <el-form-item label="关联报告" prop="reportUrl" v-if="navType==3">
                         <div style="display:flex">
-                        <el-input readonly v-model="popData.reportUrl" placeholder="请选择关联报告"></el-input>
+                        <el-input readonly v-model="popData.reportUrl" placeholder="请选择关联报告">
+                            <template slot='suffix' v-if="!!popData.reportUrl">
+                                <i class="el-icon-circle-close" style="cursor: pointer;margin-right: 5px;" @click="reportRemove"></i>
+                            </template>
+                        </el-input>
                         <el-button type="primary" style="margin-left:10px;" @click="showReportDialog">关联报告</el-button>
                         </div>
                     </el-form-item>
@@ -424,6 +429,7 @@
         <!-- 关联报告弹窗 -->
         <connective-report-dialog
           :isShow="isShowReportDialog"
+          :reportId="this.reportId"
           @reportChange="setReportUrl"
           @cancel="isShowReportDialog=false"
         />
@@ -534,7 +540,9 @@ export default {
             previewVideoUrl:"",
             
             isShowReportDialog:false,//关联报告弹窗
-            reportId:0
+            reportId:0,
+            // 报告是否关联品种
+            isReportHasPermission:false
         }
     },
     created() {
@@ -621,6 +629,10 @@ export default {
             if(res.Ret===200){
                 const arr=res.Data.List||[]
                 this.perList=arr.map(item => {
+                    if(!(item && item.List)){
+                        // 无(子)品种
+                        return null
+                    }
                     let obj={}
                     obj.value=item.ClassifyName
                     obj.label=item.ClassifyName
@@ -628,7 +640,7 @@ export default {
                         return {value:_item.ChartPermissionID,label:_item.ChartPermissionName}
                     })
                     return obj
-                })
+                }).filter(Boolean)
             }
         },
 
@@ -643,6 +655,7 @@ export default {
             this.popData.VideoId=0
             this.popData.permission=''
             this.popData.reportUrl=''
+            this.isReportHasPermission=false
             if(!item){
                 this.popData.type='添加视频'
             }else{
@@ -654,9 +667,12 @@ export default {
                 this.popData.VideoSeconds=item.VideoSeconds
                 this.popData.VideoId=item.CommunityVideoId
                 if(this.navType===3){
-                    this.popData.permission=item.ChartPermissionIds.split(',')
+                    this.$nextTick(()=>{
+                        this.popData.permission=item.ChartPermissionIds.split(',').map(it => +it)
+                    })
                     this.popData.VideoId=item.RoadVideoId
-                    item.ReportId&&this.setReportUrl({ReportId:item.ReportId,Title:item.ReportTitle})
+                    this.setReportUrl({ReportId:item.ReportId || 0,Title:item.ReportTitle || '',
+                                        PermissionIds:item.ChartPermissionIds?item.ChartPermissionIds.split(','):[]})
                 }
             }
             this.showPop=true
@@ -1072,6 +1088,12 @@ export default {
         endingPreview(){
             this.$refs.previewVideo && this.$refs.previewVideo.pause()
         },
+        // 删除关联的报告
+        reportRemove(){
+            this.popData.reportUrl=''
+            this.reportId = 0
+            this.popData.permission=''
+        },
         //打开关联报告弹窗
         showReportDialog(){
           this.isShowReportDialog = true
@@ -1080,6 +1102,8 @@ export default {
         setReportUrl(item){
           this.reportId = item.ReportId
           this.popData.reportUrl = item.Title
+          this.popData.permission=item.PermissionIds
+          this.isReportHasPermission = item.PermissionIds && item.PermissionIds.length>0
           this.isShowReportDialog = false
         }
     },

+ 1 - 1
src/views/rai_manage/activityManage/activityManage.vue

@@ -8,7 +8,7 @@
           <span v-for="(item, index) in listTitle" :key="item.ChartPermissionId" @click="tabsBoxBtn(item, index)" :class="index == tabsPitchon ? 'pitch' : ''">{{ item.PermissionName }}</span>
         </div>
         <div style="display: flex; align-items: center">
-          <el-upload style="height: 40px" ref="imgUpload" action="#" :http-request="handleUploadImg" :show-file-list="false" accept="image/*">
+          <el-upload v-if="isResearch" style="height: 40px" ref="imgUpload" action="#" :http-request="handleUploadImg" :show-file-list="false" accept="image/*">
             <el-button style="height: 40px" type="primary">识图建会</el-button>
           </el-upload>
           <el-button style="margin-left: 20px; height: 40px" type="primary" @click="$router.push(!isResearch ? '/addActivity' : '/addPurchaserActivity')">添加活动</el-button>

+ 0 - 1
src/views/rai_manage/components/addSummary.vue

@@ -134,7 +134,6 @@
 import { raiInterface } from "@/api/api.js";
 import VueFroala from "vue-froala-wysiwyg";
 import Clipboard from "clipboard";
-import chartDialogVue from "../../dataEntry_manage/components/chartDialog.vue";
 import AddIndustryMark from "../components/addIndustryMark.vue";
 import RichTextMixins from "./reportComponents/RichTextMixins";
 export default {

+ 14 - 9
src/views/rai_manage/reportManage/yanXuanSpecial.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="container yanxuan-special_container">
-    <el-card style="margin-bottom: 20px">
+    <el-card style="margin-bottom: 20px" v-if="topLableList.length">
       <span @click="tlableClickHandler(item)" :class="['top-table-item', item.value == topLableActive && 'top-table-item-active']" v-for="item in topLableList" :key="item.value">{{ item.name }}</span>
     </el-card>
-    <el-card>
+    <el-card v-if="topLableList.length">
       <template v-if="topLableActive == 1">
         <div class="report-stuts-content">
           <span
@@ -75,7 +75,7 @@
                 <span v-if="item.label != 'PV/UV'" @click="handleRowClick(row, item.key)" :style="handleRowStyle(item.key)">{{ handleRowContent(row, item.key) }}</span>
                 <div class="pv-uv-download" v-else>
                   <span>{{ row.Pv }} / {{ row.Uv }}</span>
-                  <a :href="exportPvUv(row.Id)" download>
+                  <a :href="exportPvUv(row.Id)" download v-if="Role == 'rai_admin' || Role == 'admin'">
                     <img src="~@/assets/img/rai_m/pvuv_download.png" alt="" />
                   </a>
                 </div>
@@ -163,8 +163,10 @@ export default {
     };
   },
   computed: {
-    // 头部lable
-
+    Role() {
+      let role = localStorage.getItem("Role") || "";
+      return role;
+    },
     // 文章的状态
     reportStutsList() {
       return ReportStutsList;
@@ -336,11 +338,14 @@ export default {
     async getYanxuanShowButton() {
       const res = await raiInterface.getYanxuanShowButton();
       if (res.Ret === 200) {
-        let { IsShowSpecialAuthor } = res.Data;
-        if (IsShowSpecialAuthor) {
-          this.topLableList = TopLableList;
-        } else {
+        let { IsShowSpecialAuthor, IsShowYanXuanSpecial } = res.Data;
+        if (IsShowSpecialAuthor && !IsShowYanXuanSpecial) {
+          this.topLableList = [TopLableList[1]];
+          this.topLableActive = 2;
+        } else if (!IsShowSpecialAuthor && IsShowYanXuanSpecial) {
           this.topLableList = [TopLableList[0]];
+        } else if (IsShowSpecialAuthor && IsShowYanXuanSpecial) {
+          this.topLableList = TopLableList;
         }
       }
     },

+ 40 - 41
src/views/report_manage/dayilyNews.vue

@@ -66,8 +66,13 @@
           label-width="80px">
           <el-form-item prop="classify" label="报告分类">
             <el-cascader
+              ref="cascaderRef"
               :options="classifyArr"
               v-model="configForm.classify"
+              :props="{
+                label:'ClassifyName',
+                children:'Child'
+              }"
               placeholder="类型筛选"
               size="medium"
               style="width: 70%"
@@ -236,30 +241,28 @@ export default {
     },
 
     getClassify() {
-      let params={CurrentIndex:0,PageSize:1000,KeyWord:''};
-			reportEnInterface.classifyList(params).then((res) => {
-				if( res.Ret==200&&Array.isArray(res.Data.List) ){
-					res.Data.List.forEach(item=>{
-						let newitem={label:item.ClassifyName,value: JSON.stringify({
-              name: item.ClassifyName,
-              id: item.Id
-            })};
-						if( item.Child ){
-							let childnode=[];
-							item.Child.forEach(itemchild=>{
-								childnode.push({label:itemchild.ClassifyName,value:JSON.stringify({
-                  name: itemchild.ClassifyName,
-                  id: itemchild.Id
-                })});
-							});
-							newitem.children=childnode;
-						}
-						this.classifyArr.push(newitem);
-					});
-
-          // this.configForm.classify =  [this.classifyArr[0].value,this.classifyArr[0].children[0].value]
-				}
-			});
+        reportEnInterface.classifyList().then((res) => {
+            if(res.Ret!==200) return 
+            this.classifyArr = res.Data.List||[]
+            this.formatClassifyArr({Child:this.classifyArr})
+        });
+    },
+    formatClassifyArr(tree){
+        function dfs(node,level){
+            node.value = JSON.stringify({id:node.Id,name:node.ClassifyName})
+            if(!node.Child&&level<3){
+                node.disabled = true
+            }
+            if(Array.isArray(node.Child)){
+                for(let n of node.Child){
+                    dfs(n,level+1)
+                }
+                if(!node.Child.length){
+                    node.disabled = true
+                }
+            }
+        }
+        dfs(tree,0)
     },
 
     /* 生成报告 */
@@ -267,18 +270,6 @@ export default {
       if(!this.newsList.length) return this.$message.warning('暂无内容')
       const { classify,title,abstract,author,frequency,overview } = this.configForm;
       if(!classify || !title || !abstract||!overview) this.$message.warning('请先设置默认值')
-      
-/*       const params = {
-        ClassifyIdFirst: Number(JSON.parse(classify[0]).id),
-        ClassifyNameFirst: JSON.parse(classify[0]).name,
-        ClassifyIdSecond: classify.length>1 ? Number(JSON.parse(classify[1]).id) : 0,
-        ClassifyNameSecond: classify.length>1 ? JSON.parse(classify[1]).name : '',
-        Title:title,
-        Abstract: abstract,
-        Author: author,
-        Frequency: frequency,
-        Overview:overview
-      } */
 
       dayApi.translateReport(/* params */).then(res => {
         if(res.Ret !== 200) return
@@ -309,15 +300,21 @@ export default {
           Title,
           ClassifyIdFirst,
           ClassifyIdSecond,
+          ClassifyIdThird,
           ClassifyNameFirst,
           ClassifyNameSecond,
+          ClassifyNameThird,
           Author,
           Frequency,
           Overview
         } = res.Data;
-        let val_first = ClassifyIdFirst ? JSON.stringify({name: ClassifyNameFirst,id: ClassifyIdFirst}) : '';
-        let val_second = ClassifyIdSecond ? JSON.stringify({name: ClassifyNameSecond,id: ClassifyIdSecond}) : '';
-        this.configForm.classify =  val_second ? [val_first,val_second] : val_first ? [val_first] : []
+
+        this.configForm.classify = [
+            JSON.stringify({id:ClassifyIdFirst||0,name:ClassifyNameFirst||''}),
+            JSON.stringify({id:ClassifyIdSecond||0,name:ClassifyNameSecond||''}),
+            JSON.stringify({id:ClassifyIdThird||0,name:ClassifyNameThird||''})
+        ]
+        
         this.configForm.title = Title;
         this.configForm.abstract = Abstract;
         this.configForm.author = Author;
@@ -344,8 +341,10 @@ export default {
       const params = {
         ClassifyIdFirst: Number(JSON.parse(classify[0]).id),
         ClassifyNameFirst: JSON.parse(classify[0]).name,
-        ClassifyIdSecond: classify.length>1 ? Number(JSON.parse(classify[1]).id) : 0,
-        ClassifyNameSecond: classify.length>1 ? JSON.parse(classify[1]).name : '',
+        ClassifyIdSecond: Number(JSON.parse(classify[1]).id),
+        ClassifyNameSecond: JSON.parse(classify[1]).name,
+        ClassifyIdThird:Number(JSON.parse(classify[2]).id),
+        ClassifyNameThird:JSON.parse(classify[2]).name,
         Title:title,
         Abstract: abstract,
         Author: author,

+ 17 - 2
src/views/research_manage/shareRecord.vue

@@ -3,12 +3,21 @@
     <el-card>
       <div class="share-record-top">
         <div>
-          <el-date-picker v-model="selectTime" type="daterange" value-format="yyyy-MM-dd" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="handleListChange">
+          <el-date-picker
+            v-model="selectTime"
+            style="width: 260px"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            @change="handleListChange"
+          >
           </el-date-picker>
           <el-cascader
             v-model="sales"
             placeholder="请选择分享人"
-            style="width: 200px; margin-left: 20px"
+            style="width: 200px; margin: 0 20px"
             :options="salesArr"
             :props="defaultSalesProps"
             :show-all-levels="false"
@@ -18,6 +27,9 @@
             @change="handleListChange"
           >
           </el-cascader>
+          <el-select v-model="actionVal" placeholder="用户行为" @change="handleListChange" clearable>
+            <el-option v-for="item in actionOptions" :key="item" :label="item" :value="item"> </el-option>
+          </el-select>
         </div>
         <div>
           <el-input placeholder="请输入姓名/手机号" v-model="keyword" style="width: 300px" @input="handleListChange" clearable>
@@ -78,6 +90,8 @@ export default {
       }, //销售级联配置
       selectTime: [],
       tableData: [],
+      actionVal: "",
+      actionOptions: ["注册", "查看专栏", "查看报告", "查看活动"],
     };
   },
   computed: {},
@@ -136,6 +150,7 @@ export default {
         KeyWord: this.keyword,
         StartDate: this.selectTime && this.selectTime[0] ? this.selectTime[0] : "",
         EndDate: this.selectTime && this.selectTime[1] ? this.selectTime[1] : "",
+        Action: this.actionVal,
       });
       if (res.Ret === 200) {
         this.tableData = res.Data.List || [];

+ 93 - 43
src/views/roadshow_manage/compononts/addActivityBtnDia.vue

@@ -20,7 +20,6 @@
             v-model="formData.activityType"
             placeholder="请选择活动类型"
             @change="activityTypeChange"
-            :disabled="edit_id"
           >
             <el-option
               v-for="(type, index) in permission.activityTypeList"
@@ -52,34 +51,37 @@
                 :options="telTypeList">
             </el-cascader>
         </el-form-item>
-        <el-form-item
-          label="路演形式"
-          v-if="formData.activityType === '路演'"
-          prop="roadshowType"
-        >
-          <el-select
-            v-model="formData.roadshowType"
-            placeholder="请先选择路演形式"
+         <el-form-item
+            :label="`${formData.activityType}形式`"
+            v-if="formData.activityType === '路演' || formData.activityType === '沙龙'"
+            prop="roadshowType"
+            :rules="{ required: true, message: `请选择${formData.activityType}形式`, trigger: 'change' }"
           >
-            <el-option value="线上"></el-option>
-            <el-option value="线下"></el-option>
-          </el-select>
+            <el-select
+              v-model="formData.roadshowType"
+              :placeholder="`请先选择${formData.activityType}形式`"
+            >
+              <el-option value="线上"></el-option>
+              <el-option value="线下"></el-option>
+            </el-select>
         </el-form-item>
         <el-form-item
-          label="路演平台"
-          v-if="formData.roadshowType === '线上' && formData.activityType === '路演'"
+          :label="`${formData.activityType}平台`"
+          v-if="formData.roadshowType === '线上' && (formData.activityType === '路演' || formData.activityType === '沙龙')"
           prop="roadshowPlatform"
+          :rules="{ required: true, message: `请选择${formData.activityType}平台`, trigger: blur }"
         >
           <el-input
             v-model="formData.roadshowPlatform"
-            placeholder="请输入路演平台(eg:进门财经、腾讯会议)"
+            :placeholder="`请输入${formData.activityType}平台(eg:进门财经、腾讯会议)`"
           >
           </el-input>
         </el-form-item>
         <el-form-item
-          label="路演城市"
-          v-if="formData.roadshowType === '线下' && formData.activityType === '路演'"
+          :label="`${formData.activityType}城市`"
+          v-if="formData.roadshowType === '线下' && (formData.activityType === '路演' || formData.activityType === '沙龙')"
           prop="roadshowCity"
+          :rules="{ required: true, message: `请选择${formData.activityType}城市`, trigger: blur }"
         >
           <!-- <v-distpicker 
             ref="roadshowCity"
@@ -93,6 +95,8 @@
           <search-dist-picker 
             :provinceInfo="formData.roadshowCity[0]"
             :cityInfo="formData.roadshowCity[1]"
+            :areaInfo="formData.District||''"
+            :showArea="isRaiRole"
             @selected="onChangeCity($event,'roadshow')"/>
         </el-form-item>
         <el-form-item
@@ -123,16 +127,26 @@
             companyInfo
           "
         >
-          <template v-if="companyInfo.EnglishCompany===1">
-            <p>所属国家:{{companyInfo.EnglishCountry}}</p>
-            <p>累计点击量:{{companyInfo.EnglishViewTotal}}</p>
-          </template>
-          <template v-else>
-            <p>客户状态:{{ companyInfo.Status }}</p>
-            <p>所属行业:{{ companyInfo.IndustryName }}</p>
-            <p>开通品种:{{ companyInfo.PermissionName }}</p>
-            <p>累计报告阅读次数:{{ companyInfo.ReportReadTotal }}</p> 
-          </template>
+        <!-- ficc角色看ficc信息 -->
+        <template v-if="!isRaiRole">
+            <template v-if="companyInfo.EnglishCompany===1">
+                <p>所属国家:{{companyInfo.EnglishCountry}}</p>
+                <p>累计点击量:{{companyInfo.EnglishViewTotal}}</p>
+            </template>
+            <template v-else>
+                <p>客户状态:{{ companyInfo.Status }}</p>
+                <p>所属行业:{{ companyInfo.IndustryName }}</p>
+                <p>开通品种:{{ companyInfo.PermissionName }}</p>
+                <p>累计报告阅读次数:{{ companyInfo.ReportReadTotal }}</p> 
+            </template>
+        </template>
+        <!-- 权益角色看权益信息 -->
+        <template v-else>
+            <p>客户状态:{{companyInfo.Status}}</p>
+            <p>所属行业:{{companyInfo.IndustryName}}</p>
+            <p>行业权限:{{companyInfo.PermissionName}}</p>
+            <p>累计互动次数:{{companyInfo.ReportReadTotal}}</p>
+        </template>
         </div>
         <el-form-item
           label="会议形式"
@@ -174,7 +188,7 @@
         </el-form-item>
         <el-form-item
           label="会议主题"
-          v-if="formData.activityType === '公开会议'"
+          v-if="formData.activityType === '公开会议' || formData.activityType === '沙龙'"
           prop="meetingTheme"
         >
           <el-input
@@ -420,7 +434,7 @@
 
 <script>
 import { roadshowInterence, ficcManageInterface } from '@/api/api.js';
-import { activityBtnDiaConfig, confirmDiaLink } from '../roleConfig';
+import { activityBtnDiaConfig, confirmDiaLink,confirmDiaRai } from '../roleConfig';
 import publicMixins from '../roleConfig/mixins';
 //自定义省市数据
 //import{province_sorce,city_sorce} from '@/utils/distpicker'; 
@@ -486,6 +500,9 @@ export default {
     isShow(newval) {
       newval && this.getResearcherList();
       newval && this.getTypeList();
+      if(this.isRaiRole){
+        this.formData.activityType = "路演"
+      }
     },
     start_date(value){
       this.formData.selectResearchers[0].startDate = activityBtnDiaConfig.defaultStartTime(value)
@@ -495,7 +512,6 @@ export default {
     },
     initData(val){
       this.formData={...this.formData,...val}
-      console.log(this.formData)
     }
   },
   computed: {
@@ -583,15 +599,16 @@ export default {
       await this.$refs.form.validate();
 
       if(this.formData.companyName && !this.formData.companyId) return this.$message.warning('请选择客户');
+      if(this.isRaiRole&&this.formData.roadshowType==='线下'&&!this.formData.District) return this.$message.warning('请选择路演城市')
       
       let parmas;
 
-      const param_research = ['公开会议', '路演'].includes(
+      const param_research = ['公开会议', '路演','沙龙'].includes(
         this.formData.activityType
       )
         ? this.formData.selectResearchers.map((item) => ({
             ResearcherId: Number(item.researcherId),
-            ResearcherName: this.findName(item.researcherId),
+            ResearcherName: this.findResearcherName(item.researcherId),
             StartDate: this.$moment(item.startDate).format('YYYY-MM-DD'),
             EndDate: this.$moment(item.endDate).format('YYYY-MM-DD'),
             StartTime: this.$moment(item.startTime).format('HH:mm:ss'),
@@ -601,7 +618,7 @@ export default {
           }))
         : this.formData.selectResearchers[0].researcherId.map((item) => ({
             ResearcherId: Number(item),
-            ResearcherName: item === 99 ? 'ficc全体' : this.findName(item),
+            ResearcherName: item === 99 ? 'ficc全体' : this.findResearcherName(item),
             StartDate: this.$moment(
               this.formData.selectResearchers[0].startDate
             ).format('YYYY-MM-DD'),
@@ -625,22 +642,24 @@ export default {
       const dynaic_city_param = {
         公开会议: this.formData.meetingCity,
         路演: this.formData.roadshowCity,
+        '沙龙': this.formData.roadshowCity,
       };
 
       parmas = {
         ActivityType: this.formData.activityType,
         ActivityCategory: this.formData.activityClass[this.formData.activityClass.length-1],
-        City: ['公开会议', '路演'].includes(this.formData.activityType)
+        City: ['公开会议', '路演','沙龙'].includes(this.formData.activityType)
           ? dynaic_city_param[this.formData.activityType][1]
           : '',
-        Province: ['公开会议', '路演'].includes(this.formData.activityType)
+        Province: ['公开会议', '路演','沙龙'].includes(this.formData.activityType)
           ? dynaic_city_param[this.formData.activityType][0]
           : '',
+        District:this.formData.District||'',
         CooperationName: this.formData.partnersName,
         Theme: this.formData.meetingTheme,
-        RoadshowType: this.formData.activityType === '路演' ?
+        RoadshowType:['路演','沙龙'].includes(this.formData.activityType) ?
           this.formData.roadshowType : this.formData.meetingType,
-        RoadshowPlatform: this.formData.activityType === '路演' ?
+        RoadshowPlatform:['路演','沙龙'].includes(this.formData.activityType) ?
           this.formData.roadshowPlatform : this.formData.meetingPlatform,
         CompanyId: this.formData.companyId || 0,
         CompanyName: this.formData.companyName || '',
@@ -648,8 +667,6 @@ export default {
         EnglishCompany:this.formData.englishCompany
       };
 
-      console.log(parmas);
-
       const res =  this.edit_id
       ? await roadshowInterence.editRoadshow({
           ...parmas,
@@ -659,11 +676,36 @@ export default {
         }) : await roadshowInterence.addRoadshow(parmas);
 
       if (res.Ret !== 200) return;
-
       const { text, content, query } = this.setDynamicLink(
         this.formData.activityType
       );
-      this.edit_id ? this.$message.warning('提交成功') : confirmDiaLink(text, content, query);
+      //this.edit_id ? this.$message.warning('提交成功') : confirmDiaLink(text, content, query);
+      if(this.edit_id){
+        this.$message.warning('提交成功')
+      }else{
+        if(this.formData.activityType!=='路演'&& this.formData.activityType!=='沙龙' ){
+            confirmDiaLink(text, content, query)
+            this.$emit('ensureCallback');
+            this.cancel();
+            return 
+        }
+        //判断所选研究员是否有权益
+        const ResearcherIds = this.formData.selectResearchers.map(i=>i.researcherId)
+        const ResearcherTypes = ResearcherIds.map(i=>this.findType(i))
+        //既有权益研究员的路演,又有ficc研究员路演时,提示弹窗
+        if(ResearcherTypes.includes('rai')&&ResearcherTypes.includes('ficc')){
+            const { text, content, query } = this.setDynamicLink(
+                'ficc&rai路演'
+            );
+            confirmDiaLink(text, content, query)
+        //只提交权益研究员的路演时,提示弹窗:
+        }else if(ResearcherTypes.includes('rai')){
+            confirmDiaRai()
+        //只提交ficc研究员的路演时,提示弹窗:(维持原来的不变)
+        }else{
+            confirmDiaLink(text, content, query)
+        } 
+      }
 
       this.$emit('ensureCallback');
       this.cancel();
@@ -675,7 +717,15 @@ export default {
       const res = await roadshowInterence.getResearcherList();
       if (res.Ret === 200) {
         // this.researcherList=res.Data
-        this.researcherList = this.formatResearcherList(res.Data);
+        const ficcList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='ficc').ResearcherList||[]);
+        const raiList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='权益').ResearcherList||[]);
+        this.researcherList = [{
+            label:'ficc',
+            ResearcherList:ficcList
+        },{
+            label:'权益',
+            ResearcherList:raiList
+        }]
       }
     },
     // 对获取到的研究员列表做处理
@@ -697,6 +747,7 @@ export default {
       });
       return list;
     },
+
     // 选择的研究员发生改变
     removeResearchersChange(val) {
       this.formData.selectResearchers[0].researcherId = this.formData.selectResearchers[0].researcherId.filter(item => item !== val)
@@ -750,7 +801,6 @@ export default {
       });
       if (res.Ret === 200) {
         let arr = res.Data || [];
-        console.log(arr);
         if (!arr.length) {
           cb([{ nodata: true }]);
         } else {

+ 100 - 35
src/views/roadshow_manage/compononts/addActivityCellDia.vue

@@ -117,7 +117,6 @@
             v-model="formData.activityType"
             placeholder="请选择活动类型"
             @change="activityTypeChange"
-            :disabled="edit_id"
           >
             <el-option
               v-for="(type, index) in permission.activityTypeList"
@@ -128,33 +127,36 @@
           </el-select>
         </el-form-item>
         <el-form-item
-          label="路演形式"
-          v-if="formData.activityType === '路演'"
+          :label="`${formData.activityType}形式`"
+          v-if="formData.activityType === '路演' || formData.activityType === '沙龙'"
           prop="roadshowType"
+          :rules="{ required: true, message: `请选择${formData.activityType}形式`, trigger: 'change' }"
         >
           <el-select
             v-model="formData.roadshowType"
-            placeholder="请先选择路演形式"
+            :placeholder="`请先选择${formData.activityType}形式`"
           >
             <el-option value="线上"></el-option>
             <el-option value="线下"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item
-          label="路演平台"
-          v-if="formData.roadshowType === '线上' && formData.activityType === '路演'"
+          :label="`${formData.activityType}平台`"
+          v-if="formData.roadshowType === '线上' && (formData.activityType === '路演' || formData.activityType === '沙龙')"
           prop="roadshowPlatform"
+          :rules="{ required: true, message: `请选择${formData.activityType}平台`, trigger: blur }"
         >
           <el-input
             v-model="formData.roadshowPlatform"
-            placeholder="请输入路演平台(eg:进门财经、腾讯会议)"
+            :placeholder="`请输入${formData.activityType}平台(eg:进门财经、腾讯会议)`"
           >
           </el-input>
         </el-form-item>
         <el-form-item
-          label="路演城市"
-          v-if="formData.roadshowType === '线下' && formData.activityType === '路演'"
+          :label="`${formData.activityType}城市`"
+          v-if="formData.roadshowType === '线下' && (formData.activityType === '路演' || formData.activityType === '沙龙')"
           prop="roadshowCity"
+          :rules="{ required: true, message: `请选择${formData.activityType}城市`, trigger: blur }"
         >
           <!-- <v-distpicker
             ref="roadshowCity"
@@ -164,6 +166,7 @@
             hide-area
           ></v-distpicker> -->
           <search-dist-picker 
+            :showArea="isRaiRole"
             @selected="onChangeCity($event,'roadshow')"/>
         </el-form-item>
         <el-form-item
@@ -190,16 +193,26 @@
         </el-form-item>
         <!-- 客户信息 -->
         <div class="company-info" v-if="formData.activityType === '路演' && formData.companyId && companyInfo">
-          <template v-if="companyInfo.EnglishCompany===1">
-            <p>所属国家:{{companyInfo.EnglishCountry}}</p>
-            <p>累计点击量:{{companyInfo.EnglishViewTotal}}</p>
-          </template>
-          <template v-else>
-            <p>客户状态:{{ companyInfo.Status }}</p>
-            <p>所属行业:{{ companyInfo.IndustryName }}</p>
-            <p>开通品种:{{ companyInfo.PermissionName }}</p>
-            <p>累计报告阅读次数:{{ companyInfo.ReportReadTotal }}</p> 
-          </template>
+            <!-- ficc角色看ficc信息 -->
+            <template v-if="!isRaiRole">
+                <template v-if="companyInfo.EnglishCompany===1">
+                    <p>所属国家:{{companyInfo.EnglishCountry}}</p>
+                    <p>累计点击量:{{companyInfo.EnglishViewTotal}}</p>
+                </template>
+                <template v-else>
+                    <p>客户状态:{{ companyInfo.Status }}</p>
+                    <p>所属行业:{{ companyInfo.IndustryName }}</p>
+                    <p>开通品种:{{ companyInfo.PermissionName }}</p>
+                    <p>累计报告阅读次数:{{ companyInfo.ReportReadTotal }}</p> 
+                </template>
+            </template>
+            <!-- 权益角色看权益信息 -->
+            <template v-else>
+                <p>客户状态:{{companyInfo.Status}}</p>
+                <p>所属行业:{{companyInfo.IndustryName}}</p>
+                <p>行业权限:{{companyInfo.PermissionName}}</p>
+                <p>累计互动次数:{{companyInfo.ReportReadTotal}}</p>
+            </template>
         </div>
         <el-form-item
           label="会议形式"
@@ -239,7 +252,7 @@
         </el-form-item>
         <el-form-item
           label="会议主题"
-          v-if="formData.activityType === '公开会议'"
+          v-if="formData.activityType === '公开会议' || formData.activityType === '沙龙'"
           prop="meetingTheme"
         >
           <el-input
@@ -396,7 +409,7 @@
 </template>
 
 <script>
-import { activityCellDiaConfig,confirmDiaLink } from "../roleConfig";
+import { activityCellDiaConfig,confirmDiaLink,confirmDiaRai } from "../roleConfig";
 import { roadshowInterence,ficcManageInterface } from "@/api/api.js";
 import publicMixins from '../roleConfig/mixins';
 import { constrainPoint } from "@fullcalendar/common";
@@ -495,7 +508,7 @@ export default {
       const res = await roadshowInterence.getResearcherList();
       if (res.Ret === 200) {
 
-        this.researcherList =  res.Data && res.Data.filter(item => item.GroupName !== 'ficc全体').map(group => ({
+        /* this.researcherList =  res.Data && res.Data.filter(item => item.GroupName !== 'ficc全体').map(group => ({
           ...group,
           label: group.GroupName,
           ResearcherList: group.ResearcherList ? group.ResearcherList.map(child => ({
@@ -503,12 +516,21 @@ export default {
             label: child.RealName,
             value: child.AdminId
           })) : []
-        }))
+        })) */
+        const ficcList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='ficc').ResearcherList||[]);
+        const raiList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='权益').ResearcherList||[]);
+        this.researcherList = [{
+            label:'ficc',
+            ResearcherList:ficcList
+        },{
+            label:'权益',
+            ResearcherList:raiList
+        }]
       }
     },
     // 对获取到的研究员列表做处理
     formatResearcherList(list) {
-      this.researcherList =  list && list.filter(item => item.GroupName !== 'ficc全体').map(group => ({
+      /* this.researcherList =  list && list.filter(item => item.GroupName !== 'ficc全体').map(group => ({
         ...group,
         label:group.GroupName,
         ResearcherList: group.ResearcherList && group.ResearcherList.map(child => ({
@@ -516,7 +538,23 @@ export default {
           label: child.RealName,
           value: child.AdminId
         }))
-      }))
+      })) */
+      list.forEach((group) => {
+        // 对组做处理
+        group.label = group.GroupName;
+        // 如果有列表
+        if (group.ResearcherList) {
+          group.ResearcherList.forEach((item) => {
+            // 对研究员做处理
+            item.label = item.RealName;
+            item.value = item.AdminId;
+          });
+        } else {
+          // 没有列表
+          group.value = group.GroupId;
+        }
+      });
+      return list.filter((group) => group.GroupName !== "ficc全体");
 
     },
     // 取消按钮
@@ -536,12 +574,13 @@ export default {
       await this.$refs.form.validate();
 
       if(this.formData.companyName && !this.formData.companyId) return this.$message.warning('请选择客户');
+      if(this.isRaiRole&&this.formData.roadshowType==='线下'&&!this.formData.District) return this.$message.warning('请选择路演城市')
       // 设置参数
       let parmas = null;
 
       const param_research = this.formData.selectResearchers.map(item=>({
         ResearcherId: item.researcherId,
-        ResearcherName: this.findResearcherById(item.researcherId),
+        ResearcherName: this.findResearcherName(item.researcherId),
         StartDate:this.$moment(item.startDate).format('YYYY-MM-DD'),
         EndDate: this.$moment(item.endDate).format('YYYY-MM-DD'),
         StartTime: this.$moment(item.startTime).format('HH:mm:ss'),
@@ -553,17 +592,19 @@ export default {
       const dynaic_city_param = {
         '公开会议': this.formData.meetingCity,
         '路演': this.formData.roadshowCity,
+        '沙龙': this.formData.roadshowCity,
       }
 
       parmas = {
         ActivityType: this.formData.activityType,
         ActivityCategory: this.formData.activityClass[this.formData.activityClass.length-1],
-        City: ['公开会议','路演'].includes(this.formData.activityType) ? dynaic_city_param[this.formData.activityType][1] : '',
-        Province: ['公开会议','路演'].includes(this.formData.activityType) ? dynaic_city_param[this.formData.activityType][0] : '',
+        City: ['公开会议','路演','沙龙'].includes(this.formData.activityType) ?  dynaic_city_param[this.formData.activityType][1] : '',
+        Province: ['公开会议','路演','沙龙'].includes(this.formData.activityType) ? dynaic_city_param[this.formData.activityType][0] : '',
+        District:this.formData.District||'',
         CooperationName: this.formData.partnersName,
         Theme: this.formData.meetingTheme,
-        RoadshowType: this.formData.activityType === '路演' ? this.formData.roadshowType : this.formData.meetingType,
-        RoadshowPlatform: this.formData.activityType === '路演' ? this.formData.roadshowPlatform : this.formData.meetingPlatform,
+        RoadshowType: ['路演','沙龙'].includes(this.formData.activityType) ? this.formData.roadshowType : this.formData.meetingType,
+        RoadshowPlatform: ['路演','沙龙'].includes(this.formData.activityType) ? this.formData.roadshowPlatform : this.formData.meetingPlatform,
         CompanyId: this.formData.companyId || 0,
         CompanyName: this.formData.companyName || '',
         ResearcherList: param_research,
@@ -582,8 +623,33 @@ export default {
       if (res.Ret !== 200) return
       const { text,content,query } = this.setDynamicLink(this.formData.activityType);
 
-      this.edit_id ? this.$message.warning('提交成功') : confirmDiaLink(text, content, query);
-
+      //this.edit_id ? this.$message.warning('提交成功') : confirmDiaLink(text, content, query);
+      if(this.edit_id){
+        this.$message.warning('提交成功')
+      }else{
+        if(this.formData.activityType!=='路演' && this.formData.activityType!=='沙龙'){
+            confirmDiaLink(text, content, query)
+            this.$emit('ensureCallback');
+            this.cancel();
+            return 
+        }
+        //判断所选研究员是否有权益
+        const ResearcherIds = this.formData.selectResearchers.map(i=>i.researcherId)
+        const ResearcherTypes = ResearcherIds.map(i=>this.findType(i))
+        //既有权益研究员的路演,又有ficc研究员路演时,提示弹窗
+        if(ResearcherTypes.includes('rai')&&ResearcherTypes.includes('ficc')){
+            const { text, content, query } = this.setDynamicLink(
+                'ficc&rai路演'
+            );
+            confirmDiaLink(text, content, query)
+        //只提交权益研究员的路演时,提示弹窗:
+        }else if(ResearcherTypes.includes('rai')){
+            confirmDiaRai()
+        //只提交ficc研究员的路演时,提示弹窗:(维持原来的不变)
+        }else{
+            confirmDiaLink(text, content, query)
+        } 
+      }
       this.$emit('ensureCallback');
       this.cancel();
 
@@ -641,7 +707,6 @@ export default {
         });
         if (res.Ret === 200) {
           let arr = res.Data || [];
-          console.log(arr);
           if (!arr.length) {
             cb([{ nodata: true }]);
           } else {
@@ -664,10 +729,10 @@ export default {
       this.companyInfo = Data;
 
     },
-    // 研究员id查找研究员名
+    /* // 研究员id查找研究员名
     findResearcherById(id){
       return this.allResearcher.find(researcher => researcher.AdminId===id).RealName
-    }
+    } */
   },
   created() {
     this.permission = activityCellDiaConfig[localStorage.getItem("Role")];

+ 208 - 0
src/views/roadshow_manage/compononts/addParticipateDia.vue

@@ -0,0 +1,208 @@
+<template>
+    <el-dialog
+        title="提交参会名单"
+        :visible.sync="isAddParticipateShow"
+        width="500px"
+        append-to-body
+        @close="$emit('close')"
+    >
+        <div class="partic-dialog-container">
+            <div class="inline" v-for="(item, index) in dynamicItem" :key="index">
+                <div class="inline-content">
+                    <el-autocomplete
+                        class="inline-input"
+                        v-model.trim="item.name"
+                        :fetch-suggestions="callbackHandle"
+                        placeholder="请输入姓名"
+                        @input="getCompany(item.name)"
+                        @select="selectCompany(item, index)"
+                        @blur="focusCompany(item.name)"
+                        :trigger-on-focus="false"
+                        clearable
+                    ></el-autocomplete>
+                    <img
+                        @click="deleteItem(index)"
+                        src="~@/assets/img/icons/delete-Item.png"
+                        :class="index == 0 ? 'defaultyi' : ''"
+                        alt=""
+                    />
+                </div>
+                <p v-if="item.isShow">
+                    系统中无此人,请先将其添加到对应公司的联系人列表下
+                </p>
+            </div>
+            <div @click="addItem" class="add-box">
+                <img :src="$icons.addblue" alt="" />
+                <span>添加</span>
+            </div>
+        </div>
+        <div slot="footer" class="dialog-footer" style="text-align: center;">
+            <el-button type="primary" @click="confirmPerson">确定</el-button>
+            <el-button @click="$emit('close')">取消</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+import { raiInterface,roadshowInterence } from "@/api/api.js";
+export default {
+    props:{
+        isAddParticipateShow:{
+            type:Boolean,
+            default:false
+        },
+        RsCalendarId:{
+            type:Number,
+            default:0
+        }
+    },
+    watch:{
+        isAddParticipateShow(newval){
+            if(newval){
+                this.dynamicItem = [{name:'',isShow:false}]
+            }
+        }
+    },
+    data() {
+        return {
+            dynamicItem:[{name:'',isShow:false}],
+            companyList:[],
+            timeout:0,
+            warningIsShow:false
+        };
+    },
+    methods: {
+        getCompany(query){
+            if (query.includes(",")) return;
+            if (query) {
+                raiInterface
+                .activitySignupUserList({
+                    KeyWord: query,
+                })
+                .then((res) => {
+                    if (res.Ret === 200) {
+                    let arr = [];
+                    res.Data.List &&
+                        res.Data.List.forEach((item) => {
+                        let obj = {
+                            ...item,
+                            value: item.RealName + " , " + item.Mobile + " , " + item.CompanyName,
+                        };
+                        arr.push(obj);
+                        });
+                    this.companyList = arr;
+                    }
+                });
+            } else {
+                this.companyList = [];
+            }
+        },
+        callbackHandle(data,cb){
+            let results = data
+                ? this.companyList.filter((item) => {
+                    return item.value.includes(data);
+                })
+                : this.companyList;
+            clearTimeout(this.timeout);
+            this.timeout = setTimeout(() => {
+                cb(results);
+            }, 300);
+            if (results.length == 0) {
+                this.warningIsShow = true;
+            } else {
+                this.warningIsShow = false;
+            }
+        },
+        selectCompany(val, index) {
+            this.companyList.forEach((item) => {
+                if (item.value == val.name) {
+                this.dynamicItem.splice(index, 1, { name: val.name, isShow: false, id: item.UserId});
+                }
+            });
+        },
+        focusCompany(name){
+            if ((name.length && this.companyList.length == 0) || this.warningIsShow) {
+                this.dynamicItem.forEach((item) => {
+                    if (item.name == name) {
+                        item.isShow = true;
+                    }
+                });
+            } else {
+                this.dynamicItem.forEach((item) => {
+                    if (item.name == name) {
+                        item.isShow = false;
+                    }
+                });
+            }
+        },
+        deleteItem(index){
+            this.dynamicItem.splice(index, 1);
+        },
+        addItem(){
+            this.dynamicItem.push({name:'',isShow:false})
+        },
+        confirmPerson(){
+            //校验
+            const useId = this.dynamicItem.map(i=>i.id).filter(i=>i)
+            if(!useId.length) return this.$message.error('请输入姓名')
+            roadshowInterence.addMeetingUser({
+                RsCalendarId:this.RsCalendarId,
+                UserId:useId
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.$message.success('提交成功')
+                this.$emit('confirm')
+            })
+        },
+    },
+};
+</script>
+
+<style lang="scss">
+.partic-dialog-container{
+    .inline {
+        margin-bottom: 20px;
+        width: 100%;
+        .inline-input {
+            width: 392px !important;
+        }
+        p {
+            padding-top: 5px;
+            font-size: 14px;
+            font-family: PingFang SC;
+            font-weight: 500;
+            line-height: 20px;
+            color: #ef5858;
+            opacity: 1;
+        }
+        .inline-content {
+            padding-right: 20px;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            img {
+                width: 14px;
+                height: 14px;
+                cursor: pointer;
+            }
+        }
+        .defaultyi {
+            display: none !important;
+        }
+        .el-input {
+            width: 392px !important;
+        }
+    }
+    .add-box {
+        display: flex;
+        align-items: center;
+        color: #5882ef;
+        cursor: pointer;
+        img {
+            width: 16px;
+            height: 16px;
+            margin-right: 10px;
+        }
+    }
+}
+</style>

+ 113 - 0
src/views/roadshow_manage/compononts/showParticipateListDia.vue

@@ -0,0 +1,113 @@
+<template>
+    <el-dialog
+        title="查看参会名单"
+        :visible.sync="isParticipateShow"
+        width="700px"
+        append-to-body
+        @close="$emit('close')"
+    >
+        <div class="partic-list-dialog-container">
+            <el-table :data="tableData" border>
+                <el-table-column align="center"
+                    prop="RealName" label="姓名"
+                ></el-table-column>
+                <el-table-column align="center"
+                    prop="Position" label="职位"
+                ></el-table-column>
+                <el-table-column label="操作" align="center">
+                    <template slot-scope="{ row }" >
+                        <span
+                        class="deletesty"
+                        @click="deleteItem(row)">
+                            删除</span>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <div @click="addItem" class="add-box">
+                <img :src="$icons.addblue" alt="" />
+                <span>添加</span>
+            </div>
+        </div>
+        <div slot="footer" class="dialog-footer" style="text-align: center;">
+            <el-button type="primary" @click="$emit('close')">确定</el-button>
+            <el-button @click="$emit('close')">取消</el-button>
+        </div>
+        <addParticipateDia 
+            :isAddParticipateShow="isAddShow"
+            :RsCalendarId="RsCalendarId"
+            @close="isAddShow=false;"
+            @confirm="getTableData();isAddShow=false;"
+        />
+    </el-dialog>
+</template>
+
+<script>
+import { roadshowInterence } from "@/api/api.js";
+import addParticipateDia from "./addParticipateDia.vue";
+export default {
+    props: {
+        isParticipateShow: {
+            type: Boolean,
+            default: false
+        },
+        RsCalendarId: {
+            type: Number,
+            default: 0
+        }
+    },
+    data() {
+        return {
+            tableData: [],
+            isAddShow:false
+        };
+    },
+    watch: {
+        isParticipateShow(newval) {
+            if (newval) {
+                this.getTableData();
+            }
+        },
+    },
+    methods: {
+        getTableData() {
+            roadshowInterence.getMeetingUserList({
+                RsCalendarId: this.RsCalendarId
+            }).then(res => {
+                if (res.Ret !== 200)
+                    return;
+                this.tableData = res.Data.List;
+            });
+        },
+        addItem() {
+            this.isAddShow = true
+        },
+        deleteItem(row){
+            roadshowInterence.deleteMeetingUser({
+                RsCalendarMeetingUserId:row.RsCalendarMeetingUserId
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.$message.success('删除成功')
+                this.getTableData()
+            })
+        },
+    },
+    components: { addParticipateDia }
+};
+</script>
+
+<style scoped lang="scss">
+.partic-list-dialog-container{
+    .add-box {
+        margin-top:15px;
+        display: flex;
+        align-items: center;
+        color: #5882ef;
+        cursor: pointer;
+        img {
+            width: 16px;
+            height: 16px;
+            margin-right: 10px;
+        }
+    }
+}
+</style>

+ 13 - 6
src/views/roadshow_manage/feedbackList.vue

@@ -185,12 +185,19 @@ export default {
 
 		// 获取研究员列表
     getResearcherList() {
-      roadshowInterence.getResearcherList().then(res=> {
-				if (res.Ret !== 200) return
-
-				this.researcherList = this.formatResearcherList(res.Data);
-
-			});
+        roadshowInterence.getResearcherList().then(res=> {
+            if (res.Ret !== 200) return
+            //this.researcherList = this.formatResearcherList(res.Data);
+            const ficcList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='ficc').ResearcherList||[]);
+            const raiList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='权益').ResearcherList||[]);
+            this.researcherList = [{
+                label:'ficc',
+                ResearcherList:ficcList
+            },{
+                label:'权益',
+                ResearcherList:raiList
+            }]
+            });
     },
 
 		// 对获取到的研究员列表做处理

+ 58 - 15
src/views/roadshow_manage/myCalendar.vue

@@ -36,7 +36,7 @@
 
               <!-- 活动形式 -->
               <span v-else-if="item.key === 'RoadshowType'">
-                {{row.RoadshowType}} {{ row.RoadshowType === '线上' ? `(${row.RoadshowPlatform}  )` : `(${row.Province}${row.City})`}}
+                {{row.RoadshowType}} {{ row.RoadshowType === '线上' ? `(${row.RoadshowPlatform}  )` : `(${row.Province}${row.City}${row.District})`}}
               </span>
 
               <!-- 状态 -->
@@ -53,20 +53,30 @@
 
               <!-- 客户拼接 -->
               <span v-else-if="item.key === 'company'">
-                {{ row.CooperationName || row.CompanyName }}
+                {{ row.CooperationName || row.CompanyName || '——'}}
 
                 <el-tooltip effect="dark" placement="top-start" v-if="row.CompanyId"  @mouseenter.native="getCompanyInfo(row)" popper-class="company-tip-poper">
                   <i class="el-icon-info"/>
                   <div slot="content" v-if="companyInfo">
-                    <template v-if="companyInfo.EnglishCompany===1">
-                      <p style="margin: 6px 0;">所属国家:{{companyInfo.EnglishCountry}}</p>
-                      <p style="margin: 6px 0;">累计点击量:{{companyInfo.EnglishViewTotal}}</p>
+                    <!-- 权益客户 -->
+                    <template v-if="Role.includes('rai')">
+                        <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
+                        <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
+                        <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">行业权限:{{companyInfo.PermissionName}}</p>
+                        <p style="margin: 6px 0;">累计互动次数:{{companyInfo.ReportReadTotal}}</p>
                     </template>
+                    <!-- ficc客户分国内海外 -->
                     <template v-else>
-                      <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
-                      <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
-                      <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">开通品种:{{companyInfo.PermissionName}}</p>
-                      <p style="margin: 6px 0;">累计报告阅读次数:{{companyInfo.ReportReadTotal}}</p>
+                        <template v-if="companyInfo.EnglishCompany===1">
+                            <p style="margin: 6px 0;">所属国家:{{companyInfo.EnglishCountry}}</p>
+                            <p style="margin: 6px 0;">累计点击量:{{companyInfo.EnglishViewTotal}}</p>
+                        </template>
+                        <template v-else>
+                            <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
+                            <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
+                            <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">开通品种:{{companyInfo.PermissionName}}</p>
+                            <p style="margin: 6px 0;">累计报告阅读次数:{{companyInfo.ReportReadTotal}}</p>
+                        </template>
                     </template>
                   </div>
                 </el-tooltip>
@@ -143,7 +153,20 @@
                   v-if="!row.ButtonAuth.RemoveDisabled"
                   >删除</span>
             </template>
-
+            <!-- 提交/查看参会名单 按钮由后端控制 -->
+            <template v-if="default_tab===2">
+                  <span 
+                    class="deletesty"
+                    v-if="row.SubmitButton"
+                    @click="currentRsCalendarId=row.RsCalendarId;isAddParticipateShow=true;"
+                  >提交参会名单</span>
+                  <span
+                    class="editsty"
+                    v-if="row.ViewButton"
+                    @click="currentRsCalendarId=row.RsCalendarId;isParticipateShow=true;"
+                  >查看参会名单
+                  </span>
+            </template>
 
             </template>
           </el-table-column>
@@ -269,6 +292,19 @@
             </div>
         </div>
     </el-dialog>
+    <!-- 提交参会名单弹窗 -->
+    <addParticipateDia 
+        :isAddParticipateShow="isAddParticipateShow"
+        :RsCalendarId="currentRsCalendarId"
+        @close="isAddParticipateShow=false"
+        @confirm="getCalendarList();isAddParticipateShow=false;"
+    />
+    <!-- 查看参会名单弹窗 -->
+    <showParticipateListDia 
+        :isParticipateShow="isParticipateShow"
+        :RsCalendarId="currentRsCalendarId"
+        @close="isParticipateShow=false"
+    />
   </div>
 </template>
 
@@ -279,7 +315,9 @@ import { getTabs,tableColums,handleArr,ENUM_RESEARCHLIST,sellerList } from "./ro
 import addMatterDia from "./compononts/addMatterDia.vue";
 import addActivityCellDia from "./compononts/addActivityCellDia.vue";
 import addActivityBtnDia from "./compononts/addActivityBtnDia.vue";
+import addParticipateDia from "./compononts/addParticipateDia.vue";
 import mPage from "@/components/mPage.vue";
+import showParticipateListDia from "./compononts/showParticipateListDia.vue";
 
 export default {
   components: {
@@ -287,8 +325,10 @@ export default {
     addMatterDia,
     mPage,
     addActivityBtnDia,
-    addActivityCellDia
-  },
+    addActivityCellDia,
+    addParticipateDia,
+    showParticipateListDia
+},
   watch: {
     default_tab(newval) {
       this.tableColums = tableColums(newval);
@@ -328,6 +368,11 @@ export default {
       isRefuseDiaShow: false,
       // 删除弹窗显示
       isDeleteDiaShow: false,
+      //添加参会名单弹窗显示
+      isAddParticipateShow:false,
+      //查看参会名单弹窗显示
+      isParticipateShow:false,
+      currentRsCalendarId:0,//当前选择的路演id
       // 当前行信息
       rowInfo: null,
       // 拒绝理由
@@ -401,7 +446,7 @@ export default {
     },
     
     /* 获取客户信息 */
-    async getCompanyInfo({CompanyId,EnglishCompany}) {
+    async getCompanyInfo({CompanyId,EnglishCompany,ActivityType,ResearcherId}) {
       const { Data }  = await roadshowInterence.componyDetail({ CompanyId,EnglishCompany });
       this.companyInfo = Data;
     },
@@ -688,8 +733,6 @@ export default {
       this.default_tab = this.$route.query.act_tab ? this.$route.query.act_tab : this.Role === 'admin' ? 3 : 1;
       this.tableColums = tableColums(this.default_tab);
       this.handleArr = handleArr(this.default_tab);
-
-      console.log(this.tableColums,this.handleArr)
     }
 
   },

+ 10 - 1
src/views/roadshow_manage/researcherBusinessTrip.vue

@@ -104,7 +104,16 @@ export default {
       // 发送请求
       const res = await roadshowInterence.getResearcherList();
       if (res.Ret === 200) {
-        this.researcherList = this.formatResearcherList(res.Data);
+        //this.researcherList = this.formatResearcherList(res.Data);
+        const ficcList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='ficc').ResearcherList||[]);
+        const raiList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='权益').ResearcherList||[]);
+        this.researcherList = [{
+            label:'ficc',
+            ResearcherList:ficcList
+        },{
+            label:'权益',
+            ResearcherList:raiList
+        }]
       }
     },
     // 对获取到的研究员列表做处理

+ 9 - 1
src/views/roadshow_manage/researcherCalendar.vue

@@ -138,7 +138,15 @@ export default {
       const res = await roadshowInterence.getResearcherList();
       if (res.Ret === 200) {
         // this.researcherList=res.Data
-        this.researcherList = this.formatResearcherList(res.Data);
+        const ficcList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='ficc').ResearcherList||[]);
+        const raiList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='权益').ResearcherList||[]);
+        this.researcherList = [{
+            label:'ficc',
+            ResearcherList:ficcList
+        },{
+            label:'权益',
+            ResearcherList:raiList
+        }]
       }
     },
     

+ 9 - 4
src/views/roadshow_manage/roleConfig/activityBtnDiaConfig.js

@@ -3,7 +3,11 @@ const seller_obj = {
     defaultActivityType: '内部会议',
     activityTypeList:['路演','内部会议','公开会议'],
 }
-
+//销售
+const seller_obj_rai = {
+    defaultActivityType: '内部会议',
+    activityTypeList:['路演','沙龙'],
+}
 //研究员 ficc管理员
 const researcher_obj = {
     defaultActivityType: '内部会议',
@@ -21,11 +25,11 @@ export default {
     // ficc销售权限
     ficc_seller: seller_obj,
     // 权益销售权限
-    rai_seller: seller_obj,
+    rai_seller: seller_obj_rai,
     // ficc组长权限
     ficc_group: seller_obj,
     // 权益组长权限
-    rai_group: seller_obj,
+    rai_group: seller_obj_rai,
     // ficc管理员权限
     ficc_admin: researcher_obj,
     // 权益管理员权限
@@ -33,7 +37,8 @@ export default {
     // ficc研究员权限
     ficc_researcher: researcher_obj,
     // ficc研究员(最早定义)权限
-    researcher: researcher_obj,
+    researcher: researcher_obj,//增加rai_研究员
+    rai_researcher: researcher_obj,
     // admin,中级管理者,普通管理者权限
     admin: admin_obj,
     // 默认的开始时间为 日历开始日期 的15.30 时间间隔一小时

+ 11 - 6
src/views/roadshow_manage/roleConfig/activityCellDiaConfig.js

@@ -1,9 +1,13 @@
 //销售
-const seller_obj = {
+const seller_obj_ficc = {
     defaultActivityType: '路演',
     activityTypeList:['路演','内部会议','公开会议'],
 }
-
+//销售
+const seller_obj_rai = {
+    defaultActivityType: '路演',
+    activityTypeList:['路演','沙龙'],
+}
 //研究员 ficc管理员
 const researcher_obj = {
     defaultActivityType: '内部会议',
@@ -19,13 +23,13 @@ const admin_obj = {
 // 单元格添加活动弹窗权限
 export default {
     // ficc销售权限
-    ficc_seller: seller_obj,
+    ficc_seller: seller_obj_ficc,
     // 权益销售权限
-    rai_seller: seller_obj,
+    rai_seller: seller_obj_rai,
     // ficc组长权限
-    ficc_group: seller_obj,
+    ficc_group: seller_obj_ficc,
     // 权益组长权限
-    rai_group: seller_obj,
+    rai_group: seller_obj_rai,
     // ficc管理员权限
     ficc_admin: researcher_obj,
     // 权益管理员权限
@@ -34,6 +38,7 @@ export default {
     ficc_researcher: researcher_obj,
     // ficc研究员(最早定义)权限
     researcher: researcher_obj,
+    rai_researcher: researcher_obj, //增加rai_研究员
     // admin,中级管理者,普通管理者权限
     admin: admin_obj
 }

+ 14 - 1
src/views/roadshow_manage/roleConfig/index.js

@@ -24,5 +24,18 @@ export const confirmDiaLink = (sub_msg,message,query) => {
 		cancelButtonText: '关闭',
 	}).then(action => {
 		router.push({path:'/myCalendar',query})
-	});
+	}).catch(()=>{});
+}
+//给权益研究员添加的日历 确认弹窗 需要停留在原先页面
+export const confirmDiaRai = ()=>{
+    bus.$msgbox({
+		title: '添加活动成功',
+		message: `<span>研究员日程已添加成功</span><p>可前往【研究员日历】查看</p>`,
+		dangerouslyUseHTMLString:true,
+		showCancelButton: true,
+		confirmButtonText: '前去查看',
+		cancelButtonText: '关闭',
+	}).then(action => {
+		//什么也不做
+	}).catch(()=>{});
 }

+ 53 - 9
src/views/roadshow_manage/roleConfig/mixins.js

@@ -6,15 +6,15 @@ export default {
 				activityType: [
 					{ required: true, message: "请选择活动类型", trigger: "change" },
 				],
-				roadshowType: [
-					{ required: true, message: "请选择路演形式", trigger: "change" },
-				],
-				roadshowPlatform: [
-					{ required: true, message: "请选择路演平台", trigger: "blur" },
-				],
-				roadshowCity: [
-					{ required: true, message: "请选择路演城市", trigger: "blur" },
-				],
+				// roadshowType: [
+				// 	{ required: true, message: "请选择路演形式", trigger: "change" },
+				// ],
+				// roadshowPlatform: [
+				// 	{ required: true, message: "请选择路演平台", trigger: "blur" },
+				// ],
+				// roadshowCity: [
+				// 	{ required: true, message: "请选择路演城市", trigger: "blur" },
+				// ],
 				companyName: [
 					{ required: true, message: "请选择客户", trigger: "blur" },
 				],
@@ -69,6 +69,20 @@ export default {
           query: {
             act_tab: 1
           },
+        }
+		case '沙龙' : return {
+			text: '研究员日程已添加成功',
+			content: `可前往【研究员日历】查看`,
+			query: {
+			  act_tab: 1
+			},
+		  }
+        case 'ficc&rai路演' : return {
+            text: '权益研究员日历已添加成功,ficc研究员日历已发送申请,请等待处理',
+            content: `可前往【我的日历】`,
+            query: {
+              act_tab: 1
+            },
         }
         case '公开会议' : return {
           text: '活动申请已提交,请等待研究员处理',
@@ -98,12 +112,29 @@ export default {
 			console.log(val)
 			if (type === "roadshow") {
 				this.formData.roadshowCity = [val.province.value,val.city.value];
+				this.formData.District = val.area.value
 				this.$refs.form.clearValidate(['roadshowCity'])
 			} else if (type === "meeting") {
 				this.formData.meetingCity = [val.province.value, val.city.value];
 				this.$refs.form.clearValidate(['meetingCity'])
 			}
 		},
+		findType(id){
+			const isFicc = this.findResearcherById(id,'ficc')
+			const isRai = this.findResearcherById(id,'rai')
+			return isFicc?'ficc':isRai?'rai':''
+
+		},
+		findResearcherById(id,type='ficc'){
+			const list = type==='ficc'?this.ficcReasearcherList:this.raiReasercherList
+			const flatList = list.map(item=>item.ResearcherList||[]).flat(Infinity)
+			return flatList.find(user=>user.AdminId===id)
+		},
+		findResearcherName(id){
+			const isFicc = this.findResearcherById(id,'ficc')
+			const isRai = this.findResearcherById(id,'rai')
+			return isFicc?isFicc.RealName:isRai?isRai.RealName:''
+		}
 	},
 	watch: {
     'formData.companyName'(val) {
@@ -121,5 +152,18 @@ export default {
 				this.$refs.form && this.$refs.form.clearValidate(['meetingPlatform','meetingCity'])
 			}
 		}
+	},
+	computed:{
+		isRaiRole(){//是否为权益角色
+			return localStorage.getItem('Role').includes('rai')
+		},
+		//ficc研究员列表
+		ficcReasearcherList(){
+			return (this.researcherList.find(i=>i.label==='ficc')||{}).ResearcherList||[]
+		},
+		//rai研究员列表
+		raiReasercherList(){
+			return (this.researcherList.find(i=>i.label==='权益')||{}).ResearcherList||[]
+		}
 	}
 }

+ 10 - 1
src/views/roadshow_manage/statistics/specialSeller.vue

@@ -149,7 +149,16 @@ export default {
       const res = await roadshowInterence.getResearcherList();
       if (res.Ret === 200) {
         // this.researcherList=res.Data
-        this.researcherList = this.formatResearcherList(res.Data);
+        //this.researcherList = this.formatResearcherList(res.Data);
+        const ficcList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='ficc').ResearcherList||[]);
+        const raiList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='权益').ResearcherList||[]);
+        this.researcherList = [{
+            label:'ficc',
+            ResearcherList:ficcList
+        },{
+            label:'权益',
+            ResearcherList:raiList
+        }]
       }
     },
     // 对获取到的研究员列表做处理