diff --git a/api/businessApi.js b/api/businessApi.js
new file mode 100644
index 0000000..29de5d6
--- /dev/null
+++ b/api/businessApi.js
@@ -0,0 +1,191 @@
+import { req } from '@/common/js/index.js';
+import { unwrapClinicRes } from '@/api/clinicAdmin.js';
+
+/**
+ * 按前缀生成业务 API(订单/对账/提现/仓库等)
+ */
+export function createBusinessApi(prefix, headerFlag) {
+ const headerKey = headerFlag || '_businessAdmin';
+ function bizRequest(options) {
+ return req.request({
+ ...options,
+ header: {
+ ...(options.header || {}),
+ [headerKey]: '1',
+ },
+ }).then((res) => {
+ const data = unwrapClinicRes(res);
+ const ok = res && (res.code === 0 || (res.errcode != null && Number(res.errcode) !== -1));
+ return { res, data, ok };
+ });
+ }
+
+ return {
+ prefix,
+ getMyInfo() {
+ return bizRequest({ url: `${prefix}-auth/my-info`, method: 'GET' });
+ },
+ getInputStats() {
+ return bizRequest({ url: `${prefix}-auth/input-stats`, method: 'GET' });
+ },
+ getMyBalance() {
+ return bizRequest({ url: `${prefix}-account/my-balance`, method: 'GET' });
+ },
+ getMyCard() {
+ return bizRequest({ url: `${prefix}-account/my-card`, method: 'GET' });
+ },
+ saveMyCard(data) {
+ return bizRequest({ url: `${prefix}-account/save-card`, method: 'POST', data });
+ },
+ getLedgerLogList(params) {
+ return bizRequest({ url: `${prefix}-settlement/ledger-log-list`, method: 'GET', data: params });
+ },
+ getLedgerDetail(params) {
+ return bizRequest({ url: `${prefix}-settlement/ledger-detail`, method: 'GET', data: params });
+ },
+ getAccountChangeLogList(params) {
+ return bizRequest({ url: `${prefix}-account-change-log/list`, method: 'GET', data: params });
+ },
+ getWithdrawalList(params) {
+ return bizRequest({ url: `${prefix}-withdrawal/list`, method: 'GET', data: params });
+ },
+ getWithdrawalAuditList(params) {
+ return bizRequest({ url: `${prefix}-withdrawal/audit-list`, method: 'GET', data: params });
+ },
+ getWithdrawalDetail(id) {
+ return bizRequest({ url: `${prefix}-withdrawal/detail`, method: 'GET', data: { id } });
+ },
+ submitWithdrawal(data) {
+ return bizRequest({ url: `${prefix}-withdrawal/withdrawal`, method: 'POST', data });
+ },
+ passWithdrawal(data) {
+ return bizRequest({ url: `${prefix}-withdrawal/pass-application`, method: 'POST', data });
+ },
+ refuseWithdrawal(data) {
+ return bizRequest({ url: `${prefix}-withdrawal/refuse-application`, method: 'POST', data });
+ },
+ getReconciliationList(params) {
+ return bizRequest({ url: `${prefix}-reconciliation/list`, method: 'GET', data: params });
+ },
+ getReconciliationDrugList(params) {
+ return bizRequest({ url: `${prefix}-reconciliation/drug-list`, method: 'GET', data: params });
+ },
+ getReconciliationDrugOptions(params) {
+ return bizRequest({ url: `${prefix}-reconciliation/drug-options`, method: 'GET', data: params });
+ },
+ getReconciliationOrderOptions(params) {
+ return bizRequest({ url: `${prefix}-reconciliation/order-options`, method: 'GET', data: params });
+ },
+ getOrderSaleAmount(params) {
+ return bizRequest({ url: `${prefix}-order/sale-amount`, method: 'GET', data: params });
+ },
+ getPrescriptionDetail(id) {
+ return bizRequest({ url: `${prefix}-prescription/detail`, method: 'GET', data: { id } });
+ },
+ getOrderList(params) {
+ return bizRequest({ url: `${prefix}-order/list`, method: 'GET', data: params });
+ },
+ getOrderStatusOption() {
+ return bizRequest({ url: `${prefix}-order/status-option`, method: 'GET' });
+ },
+ getOrderDetail(id) {
+ return bizRequest({ url: `${prefix}-order/detail`, method: 'GET', data: { id } });
+ },
+ getOrderTrace(params) {
+ return bizRequest({ url: `${prefix}-order/trace`, method: 'GET', data: params });
+ },
+ getOrderLedgerDetail(params) {
+ return bizRequest({ url: `${prefix}-order/ledger-detail`, method: 'GET', data: params });
+ },
+ getOrderReconciliationDetail(params) {
+ return bizRequest({ url: `${prefix}-order/reconciliation-detail`, method: 'GET', data: params });
+ },
+ refundOrder(data) {
+ return bizRequest({ url: `${prefix}-order/refund`, method: 'POST', data });
+ },
+ wareSendOrder(data) {
+ return bizRequest({ url: `${prefix}-order/ware-send`, method: 'POST', data });
+ },
+ getExpressDetailByOrderId(orderId) {
+ return bizRequest({
+ url: `${prefix}-express-detail/detail-by-order`,
+ method: 'POST',
+ data: { order_id: orderId },
+ });
+ },
+ getWarehouseList(params) {
+ return bizRequest({ url: `${prefix}-warehouse/list`, method: 'GET', data: params });
+ },
+ getWarehouseDetail(id) {
+ return bizRequest({ url: `${prefix}-warehouse/detail`, method: 'GET', data: { id } });
+ },
+ updateWarehouseStatus(id) {
+ return bizRequest({ url: `${prefix}-warehouse/update-status`, method: 'GET', data: { id } });
+ },
+ updateWarehousePrice(data) {
+ return bizRequest({ url: `${prefix}-warehouse/update`, method: 'POST', data });
+ },
+ getWarehouseProductTypeOptions() {
+ return bizRequest({ url: `${prefix}-warehouse/product-type-options`, method: 'GET' });
+ },
+ getStoreOption() {
+ return bizRequest({ url: `${prefix}-store/option`, method: 'GET' });
+ },
+ getStoreInputList(params) {
+ return bizRequest({ url: `${prefix}-store-input/list`, method: 'GET', data: params });
+ },
+ getStoreInputDetail(id) {
+ return bizRequest({ url: `${prefix}-store-input/detail`, method: 'GET', data: { id } });
+ },
+ getPromoterOptions() {
+ return bizRequest({ url: `${prefix}-store-input/promoter-options`, method: 'GET' });
+ },
+ getStoreInputOption() {
+ return bizRequest({ url: `${prefix}-store-input/option`, method: 'GET' });
+ },
+ createStoreInput(data) {
+ return bizRequest({ url: `${prefix}-store-input/create`, method: 'POST', data });
+ },
+ updateStoreInput(data) {
+ return bizRequest({ url: `${prefix}-store-input/update`, method: 'POST', data });
+ },
+ auditStoreInput(data) {
+ return bizRequest({ url: `${prefix}-store-input/audit`, method: 'POST', data });
+ },
+ getDoctorInputList(params) {
+ return bizRequest({ url: `${prefix}-doctor-input/list`, method: 'GET', data: params });
+ },
+ getDoctorInputDetail(id) {
+ return bizRequest({ url: `${prefix}-doctor-input/detail`, method: 'GET', data: { id } });
+ },
+ createDoctorInput(data) {
+ return bizRequest({ url: `${prefix}-doctor-input/create`, method: 'POST', data });
+ },
+ updateDoctorInput(data) {
+ return bizRequest({ url: `${prefix}-doctor-input/update`, method: 'POST', data });
+ },
+ auditDoctorInput(data) {
+ return bizRequest({ url: `${prefix}-doctor-input/audit`, method: 'POST', data });
+ },
+ getDoctorTitleOption() {
+ return bizRequest({
+ url: `${prefix}-pharmacist/title-option`,
+ method: 'GET',
+ data: { type: 1 },
+ });
+ },
+ getDepartOption() {
+ return bizRequest({ url: `${prefix}-doctor/depart-option`, method: 'GET' });
+ },
+ };
+}
+
+export const platformAdminApi = createBusinessApi('/newApi/platform-admin', '_platformAdmin');
+export const salespersonApi = createBusinessApi('/newApi/salesperson', '_salesperson');
+
+export function getActiveBusinessApi() {
+ const mode = uni.getStorageSync('loginMode');
+ if (mode === 'platform_admin') return platformAdminApi;
+ if (mode === 'salesperson') return salespersonApi;
+ return null;
+}
diff --git a/api/clinicAdmin.js b/api/clinicAdmin.js
index 347bf9a..d117dd4 100644
--- a/api/clinicAdmin.js
+++ b/api/clinicAdmin.js
@@ -47,6 +47,10 @@ export function getClinicAdminMyInfo() {
return clinicRequest({ url: `${PREFIX}-auth/my-info`, method: 'GET' });
}
+export function getClinicAdminStoreQr() {
+ return clinicRequest({ url: `${PREFIX}-auth/store-qr`, method: 'GET' });
+}
+
export function getClinicAdminBalance() {
return clinicRequest({ url: `${PREFIX}-account/my-balance`, method: 'GET' });
}
@@ -59,6 +63,10 @@ export function saveClinicAdminCard(data) {
return clinicRequest({ url: `${PREFIX}-account/save-card`, method: 'POST', data });
}
+export const getMyBalance = getClinicAdminBalance;
+export const getMyCard = getClinicAdminCard;
+export const saveMyCard = saveClinicAdminCard;
+
export function getLedgerLogList(params) {
return clinicRequest({ url: `${PREFIX}-settlement/ledger-log-list`, method: 'GET', data: params });
}
diff --git a/api/clinicSalesperson.js b/api/clinicSalesperson.js
new file mode 100644
index 0000000..3c407ed
--- /dev/null
+++ b/api/clinicSalesperson.js
@@ -0,0 +1,39 @@
+import { req } from '@/common/js/index.js';
+import { unwrapClinicRes } from '@/api/clinicAdmin.js';
+
+const PREFIX = '/newApi/clinic-salesperson-self';
+const AUTH_PREFIX = '/newApi/clinic-salesperson-auth';
+
+function clinicSalespersonRequest(options) {
+ return req.request({
+ ...options,
+ header: {
+ ...(options.header || {}),
+ _clinicSalesperson: '1',
+ },
+ }).then((res) => {
+ const data = unwrapClinicRes(res);
+ const ok = res && (res.code === 0 || (res.errcode != null && Number(res.errcode) !== -1));
+ return { res, data, ok };
+ });
+}
+
+export function getClinicSalespersonMyInfo() {
+ return clinicSalespersonRequest({ url: `${AUTH_PREFIX}/my-info`, method: 'GET' });
+}
+
+export function getClinicSalespersonCommissionList(params) {
+ return clinicSalespersonRequest({ url: `${PREFIX}/commission-list`, method: 'GET', data: params });
+}
+
+export function getClinicSalespersonSettlementList(params) {
+ return clinicSalespersonRequest({ url: `${PREFIX}/settlement-list`, method: 'GET', data: params });
+}
+
+export function getClinicSalespersonSettlementDetail(id) {
+ return clinicSalespersonRequest({ url: `${PREFIX}/settlement-detail`, method: 'GET', data: { id } });
+}
+
+export function getClinicSalespersonUserBindList(params) {
+ return clinicSalespersonRequest({ url: `${PREFIX}/user-bind-list`, method: 'GET', data: params });
+}
diff --git a/api/platformAdmin.js b/api/platformAdmin.js
new file mode 100644
index 0000000..8d6bfbc
--- /dev/null
+++ b/api/platformAdmin.js
@@ -0,0 +1,5 @@
+import { platformAdminApi } from '@/api/businessApi.js';
+
+export { platformAdminApi };
+export const getPlatformAdminMyInfo = () => platformAdminApi.getMyInfo();
+export default platformAdminApi;
diff --git a/api/salesperson.js b/api/salesperson.js
new file mode 100644
index 0000000..d7e37cf
--- /dev/null
+++ b/api/salesperson.js
@@ -0,0 +1,5 @@
+import { salespersonApi } from '@/api/businessApi.js';
+
+export const getSalespersonMyInfo = salespersonApi.getMyInfo.bind(salespersonApi);
+export const getSalespersonInputStats = salespersonApi.getInputStats.bind(salespersonApi);
+export default salespersonApi;
diff --git a/api/upload.js b/api/upload.js
new file mode 100644
index 0000000..5258f31
--- /dev/null
+++ b/api/upload.js
@@ -0,0 +1,95 @@
+import { req } from '@/common/js/index.js';
+
+const SALESPERSON_PREFIX = '/newApi/salesperson-upload/';
+const PLATFORM_PREFIX = '/newApi/platform-admin-upload/';
+
+function uploadChatFileByPrefix(prefix, headerKey, params) {
+ return req.request({
+ url: `${prefix}upload-chat-file`,
+ type: 'upload',
+ method: 'POST',
+ filePath: params.filePath,
+ name: params.name || 'file',
+ formData: params.formData || {},
+ header: {
+ [headerKey]: '1',
+ },
+ });
+}
+
+/**
+ * 业务员录入/聊天同款:服务端转存 OSS,返回 url
+ */
+export function uploadSalespersonChatFileApi(params) {
+ return uploadChatFileByPrefix(SALESPERSON_PREFIX, '_salesperson', params);
+}
+
+/**
+ * 平台管理员录入上传(与业务员对称)
+ */
+export function uploadPlatformAdminChatFileApi(params) {
+ return uploadChatFileByPrefix(PLATFORM_PREFIX, '_platformAdmin', params);
+}
+
+/**
+ * 按当前 loginMode 选择上传接口
+ */
+export function uploadBusinessChatFileApi(params) {
+ const mode = uni.getStorageSync('loginMode');
+ if (mode === 'platform_admin') {
+ return uploadPlatformAdminChatFileApi(params);
+ }
+ return uploadSalespersonChatFileApi(params);
+}
+
+function unwrapUploadResult(res) {
+ if (res == null) return null;
+ if (res.result !== undefined && res.result !== null) return res.result;
+ if (res.data && res.data.result !== undefined) return res.data.result;
+ return res.data != null ? res.data : res;
+}
+
+export function extractUploadUrl(res) {
+ const inner = unwrapUploadResult(res);
+ if (!inner) return null;
+ return inner.url || inner.path || null;
+}
+
+const LEGACY_ADMIN_UPLOAD_URL = 'https://api.xiaokang88.com/open-api/upload/old-admin-img';
+
+/**
+ * 录入/管理端旧版图片上传(与 d-upload、select-avatar-image 一致)
+ */
+export function uploadLegacyAdminImage(params) {
+ const { filePath, name = 'file', formData = { store_id: '11001' } } = params || {};
+ return new Promise((resolve, reject) => {
+ uni.uploadFile({
+ url: LEGACY_ADMIN_UPLOAD_URL,
+ filePath,
+ name,
+ formData,
+ header: {
+ authorization: `Bearer ${uni.getStorageSync('token')}`,
+ },
+ success: (uploadRes) => {
+ try {
+ const data =
+ typeof uploadRes.data === 'string' ? JSON.parse(uploadRes.data) : uploadRes.data;
+ if (![200, 201, 204].includes(uploadRes.statusCode)) {
+ reject(new Error((data && data.msg) || '上传失败'));
+ return;
+ }
+ const url = data && data.data && data.data.url;
+ if (!url) {
+ reject(new Error('上传失败'));
+ return;
+ }
+ resolve(url);
+ } catch (e) {
+ reject(e);
+ }
+ },
+ fail: reject,
+ });
+ });
+}
diff --git a/common/js/handwriting.js b/common/js/handwriting.js
index 92ae57d..7efab8e 100644
--- a/common/js/handwriting.js
+++ b/common/js/handwriting.js
@@ -366,18 +366,24 @@ export default class {
return new Promise((resolve, rej) => {
uni.canvasToTempFilePath({
canvasId: this.canvasName,
+ fileType: 'png',
+ quality: 1,
success: (res) => {
uni.getFileSystemManager().readFile({
filePath: res.tempFilePath,
encoding: 'base64',
- success: r => {
- resolve(r.data);
- }
- })
+ success: (r) => {
+ resolve({
+ base64: r.data,
+ tempFilePath: res.tempFilePath,
+ });
+ },
+ fail: (err) => rej(err),
+ });
},
- fail: function(err) {
+ fail: (err) => {
rej(err);
- }
+ },
}, _this)
})
}
diff --git a/common/js/index.js b/common/js/index.js
index 9c3a726..4b45c8b 100644
--- a/common/js/index.js
+++ b/common/js/index.js
@@ -17,7 +17,8 @@ const arr = [
'patient_mobile',
'id_card',
'idcard',
- 'password'
+ 'password',
+ 'phone'
]
// 敏感数据(解密后做脱敏;需与下方 switch 分支一致)
@@ -26,7 +27,8 @@ const sensitiveData = [
'idcard',
'mobile',
'express_mobile',
- 'patient_mobile'
+ 'patient_mobile',
+ 'phone'
]
/**
* 请求拦截器
@@ -43,22 +45,50 @@ const reqInterceptor = async (options) => {
const skipToken = options.header.isToken === false
const isClinicAdminReq = options.header._clinicAdmin === '1'
|| (options.url && String(options.url).indexOf('clinic-admin') !== -1)
+ const isPlatformAdminReq = options.header._platformAdmin === '1'
+ || (options.url && String(options.url).indexOf('platform-admin') !== -1)
+ const isSalespersonReq = options.header._salesperson === '1'
+ || (options.url && String(options.url).indexOf('salesperson-') !== -1)
+ const isClinicSalespersonReq = options.header._clinicSalesperson === '1'
+ || (options.url && String(options.url).indexOf('clinic-salesperson-') !== -1)
const isDoctorWxAuthReq = options.url && String(options.url).indexOf('doctor-wx-auth') !== -1
// 内部控制位,不得作为 HTTP 头发出
delete options.header.isToken
delete options.header._clinicAdmin
+ delete options.header._platformAdmin
+ delete options.header._salesperson
+ delete options.header._clinicSalesperson
const clinicToken = uni.getStorageSync('clinic_admin_token')
+ const platformToken = uni.getStorageSync('platform_admin_token')
+ const salespersonToken = uni.getStorageSync('salesperson_token')
+ const clinicSalespersonToken = uni.getStorageSync('clinic_salesperson_token')
const doctorToken = uni.getStorageSync('token')
const loginMode = uni.getStorageSync('loginMode')
if (!skipToken) {
if (isDoctorWxAuthReq) {
- if (loginMode === 'clinic_admin' && clinicToken) {
+ if (loginMode === 'platform_admin' && platformToken) {
+ options.header['authorization'] = `Bearer ${platformToken}`
+ } else if (loginMode === 'salesperson' && salespersonToken) {
+ options.header['authorization'] = `Bearer ${salespersonToken}`
+ } else if (loginMode === 'clinic_salesperson' && clinicSalespersonToken) {
+ options.header['authorization'] = `Bearer ${clinicSalespersonToken}`
+ } else if (loginMode === 'clinic_admin' && clinicToken) {
options.header['authorization'] = `Bearer ${clinicToken}`
} else if (doctorToken) {
options.header['authorization'] = `Bearer ${doctorToken}`
+ } else if (platformToken) {
+ options.header['authorization'] = `Bearer ${platformToken}`
+ } else if (salespersonToken) {
+ options.header['authorization'] = `Bearer ${salespersonToken}`
} else if (clinicToken) {
options.header['authorization'] = `Bearer ${clinicToken}`
}
+ } else if (isPlatformAdminReq && platformToken) {
+ options.header['authorization'] = `Bearer ${platformToken}`
+ } else if (isSalespersonReq && salespersonToken) {
+ options.header['authorization'] = `Bearer ${salespersonToken}`
+ } else if (isClinicSalespersonReq && clinicSalespersonToken) {
+ options.header['authorization'] = `Bearer ${clinicSalespersonToken}`
} else if (isClinicAdminReq && clinicToken) {
options.header['authorization'] = `Bearer ${clinicToken}`
} else if (doctorToken) {
@@ -109,8 +139,20 @@ const resInterceptor = (response, conf = {}) => {
icon: 'error',
title: response['msg'] || response['message'] || errorCode[statusCode]
})
- const isClinic = uni.getStorageSync('loginMode') === 'clinic_admin'
- if (isClinic) {
+ const loginMode = uni.getStorageSync('loginMode')
+ if (loginMode === 'platform_admin') {
+ uni.removeStorageSync('platform_admin_token')
+ uni.removeStorageSync('platform_admin_user')
+ uni.removeStorageSync('loginMode')
+ } else if (loginMode === 'salesperson') {
+ uni.removeStorageSync('salesperson_token')
+ uni.removeStorageSync('salesperson_user')
+ uni.removeStorageSync('loginMode')
+ } else if (loginMode === 'clinic_salesperson') {
+ uni.removeStorageSync('clinic_salesperson_token')
+ uni.removeStorageSync('clinic_salesperson_user')
+ uni.removeStorageSync('loginMode')
+ } else if (loginMode === 'clinic_admin') {
uni.removeStorageSync('clinic_admin_token')
uni.removeStorageSync('clinic_admin_user')
uni.removeStorageSync('loginMode')
@@ -182,6 +224,7 @@ function getRes(obj, isDecode = true) {
} else {
// 判断obj[key]是否在arr中
if (arr.indexOf(key) !== -1) {
+ if (obj[key] == null || obj[key] === '') continue
let aseFile = ''
if (isDecode === true) {
aseFile = customBase64Decode(obj[key])
@@ -207,6 +250,7 @@ function getRes(obj, isDecode = true) {
break;
case 'mobile':
case 'express_mobile':
+ case 'phone':
// 保留前三位和后四位,中间用星号代替
aseFile = aseFile.slice(0, 3).padEnd(aseFile.length - 4, '*') + aseFile.slice(-4);
break;
@@ -233,6 +277,7 @@ function getRes(obj, isDecode = true) {
}
function customBase64Decode(data) {
+ if (data == null || data === '') return data
// return data
try {
// 第一次Base64解码
diff --git a/components/d-handwritten/d-handwritten.vue b/components/d-handwritten/d-handwritten.vue
index de548b8..f9fad74 100644
--- a/components/d-handwritten/d-handwritten.vue
+++ b/components/d-handwritten/d-handwritten.vue
@@ -1,112 +1,310 @@
+
-
+
+
+
+
+
+
+
+
签字确认
+
+
+
+
+
重写
+
- 确定
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages.json b/pages.json
index de4be4d..82fe7c2 100644
--- a/pages.json
+++ b/pages.json
@@ -453,6 +453,56 @@
"style": { "navigationBarTitleText": "药品详情", "navigationStyle": "custom" }
}
]
+ }, {
+ "root": "subPackages/sub_business_shared",
+ "pages": [
+ { "path": "order/index", "style": { "navigationBarTitleText": "商品订单", "navigationStyle": "custom" } },
+ { "path": "order/detail", "style": { "navigationBarTitleText": "订单详情", "navigationStyle": "custom" } },
+ { "path": "order/trace/index", "style": { "navigationBarTitleText": "订单追溯", "navigationStyle": "custom" } },
+ { "path": "reconciliation/index", "style": { "navigationBarTitleText": "对账单", "navigationStyle": "custom" } },
+ { "path": "withdrawal/index", "style": { "navigationBarTitleText": "提现管理", "navigationStyle": "custom" } },
+ { "path": "withdrawal/apply", "style": { "navigationBarTitleText": "申请提现", "navigationStyle": "custom" } },
+ { "path": "withdrawal/card-edit", "style": { "navigationBarTitleText": "编辑账户", "navigationStyle": "custom" } },
+ { "path": "withdrawal/record-detail", "style": { "navigationBarTitleText": "提现详情", "navigationStyle": "custom" } },
+ { "path": "withdrawal/settlement/index", "style": { "navigationBarTitleText": "结算记录", "navigationStyle": "custom" } },
+ { "path": "withdrawal/settlement/detail", "style": { "navigationBarTitleText": "结算明细", "navigationStyle": "custom" } },
+ { "path": "withdrawal/account-change/index", "style": { "navigationBarTitleText": "资金变动", "navigationStyle": "custom" } },
+ { "path": "warehouse/index", "style": { "navigationBarTitleText": "仓库管理", "navigationStyle": "custom" } },
+ { "path": "warehouse/detail", "style": { "navigationBarTitleText": "药品详情", "navigationStyle": "custom" } }
+ ]
+ }, {
+ "root": "subPackages/sub_platform_admin",
+ "pages": [
+ { "path": "home/index", "style": { "navigationBarTitleText": "工作台", "navigationStyle": "custom" } },
+ { "path": "my/index", "style": { "navigationBarTitleText": "我的", "navigationStyle": "custom" } },
+ { "path": "withdrawal/audit/index", "style": { "navigationBarTitleText": "提现审核", "navigationStyle": "custom" } },
+ { "path": "store-input/audit/index", "style": { "navigationBarTitleText": "门店审核", "navigationStyle": "custom" } },
+ { "path": "store-input/audit/detail", "style": { "navigationBarTitleText": "审核详情", "navigationStyle": "custom" } },
+ { "path": "doctor-input/audit/index", "style": { "navigationBarTitleText": "医生审核", "navigationStyle": "custom" } },
+ { "path": "doctor-input/audit/detail", "style": { "navigationBarTitleText": "审核详情", "navigationStyle": "custom" } }
+ ]
+ }, {
+ "root": "subPackages/sub_salesperson",
+ "pages": [
+ { "path": "home/index", "style": { "navigationBarTitleText": "工作台", "navigationStyle": "custom" } },
+ { "path": "my/index", "style": { "navigationBarTitleText": "我的", "navigationStyle": "custom" } },
+ { "path": "store-input/index", "style": { "navigationBarTitleText": "列表", "navigationStyle": "custom" } },
+ { "path": "store-input/form", "style": { "navigationBarTitleText": "录入", "navigationStyle": "custom" } },
+ { "path": "store-input/detail", "style": { "navigationBarTitleText": "录入详情", "navigationStyle": "custom" } },
+ { "path": "doctor-input/index", "style": { "navigationBarTitleText": "列表", "navigationStyle": "custom" } },
+ { "path": "doctor-input/form", "style": { "navigationBarTitleText": "录入", "navigationStyle": "custom" } },
+ { "path": "doctor-input/detail", "style": { "navigationBarTitleText": "预填详情", "navigationStyle": "custom" } }
+ ]
+ }, {
+ "root": "subPackages/sub_clinic_salesperson",
+ "pages": [
+ { "path": "home/index", "style": { "navigationBarTitleText": "工作台", "navigationStyle": "custom" } },
+ { "path": "my/index", "style": { "navigationBarTitleText": "我的", "navigationStyle": "custom" } },
+ { "path": "earnings/index", "style": { "navigationBarTitleText": "我的收益", "navigationStyle": "custom" } },
+ { "path": "leads/index", "style": { "navigationBarTitleText": "获客记录", "navigationStyle": "custom" } },
+ { "path": "commission/index", "style": { "navigationBarTitleText": "分成记录", "navigationStyle": "custom" } },
+ { "path": "settlement/index", "style": { "navigationBarTitleText": "结算记录", "navigationStyle": "custom" } }
+ ]
}, {
"root": "subPackages/sub_agreement",
"pages": [{
diff --git a/pages/login/index.vue b/pages/login/index.vue
index f35a7ed..7fd7bae 100644
--- a/pages/login/index.vue
+++ b/pages/login/index.vue
@@ -12,25 +12,12 @@
+
+
diff --git a/subPackages/sub_business_shared/components/PageStickyHeader.vue b/subPackages/sub_business_shared/components/PageStickyHeader.vue
new file mode 100644
index 0000000..7572978
--- /dev/null
+++ b/subPackages/sub_business_shared/components/PageStickyHeader.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/subPackages/sub_business_shared/components/business-page-layout.vue b/subPackages/sub_business_shared/components/business-page-layout.vue
new file mode 100644
index 0000000..898ccaf
--- /dev/null
+++ b/subPackages/sub_business_shared/components/business-page-layout.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_business_shared/components/clinic-page-layout.vue b/subPackages/sub_business_shared/components/clinic-page-layout.vue
new file mode 100644
index 0000000..a0829b8
--- /dev/null
+++ b/subPackages/sub_business_shared/components/clinic-page-layout.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_business_shared/input/InputDetailPage.vue b/subPackages/sub_business_shared/input/InputDetailPage.vue
new file mode 100644
index 0000000..e69b075
--- /dev/null
+++ b/subPackages/sub_business_shared/input/InputDetailPage.vue
@@ -0,0 +1,81 @@
+
+
+
+ {{ f.l }}{{ display(f.k) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_business_shared/input/InputListPage.vue b/subPackages/sub_business_shared/input/InputListPage.vue
new file mode 100644
index 0000000..3da027b
--- /dev/null
+++ b/subPackages/sub_business_shared/input/InputListPage.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ statusText(item.status) }}
+
+ {{ item.mobile }} · {{ formatTime(item.created_at) }}
+
+ 暂无记录
+
+
+
+
+
+
+
diff --git a/subPackages/sub_business_shared/order/components/ExpressTimeline.vue b/subPackages/sub_business_shared/order/components/ExpressTimeline.vue
new file mode 100644
index 0000000..427f9a7
--- /dev/null
+++ b/subPackages/sub_business_shared/order/components/ExpressTimeline.vue
@@ -0,0 +1,171 @@
+
+
+ 物流信息
+
+ 物流公司{{ display.companyName }}
+ 运单号{{ display.expressNo }}
+ 最新状态{{ display.stateText }}
+
+
+ 物流追踪
+
+
+
+ {{ t.status }}
+ {{ t.detail }}
+ {{ t.time }}
+
+
+
+
+ 暂无物流信息
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_business_shared/order/components/PrescriptionDetailPopup.vue b/subPackages/sub_business_shared/order/components/PrescriptionDetailPopup.vue
new file mode 100644
index 0000000..69cb2c5
--- /dev/null
+++ b/subPackages/sub_business_shared/order/components/PrescriptionDetailPopup.vue
@@ -0,0 +1,593 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_business_shared/order/detail.vue b/subPackages/sub_business_shared/order/detail.vue
new file mode 100644
index 0000000..a4d4418
--- /dev/null
+++ b/subPackages/sub_business_shared/order/detail.vue
@@ -0,0 +1,587 @@
+
+
+
+
+
+
+
+
+ {{ receiverBlockTitle }}
+ {{ receiverLabel }}{{ receiverName }}
+ 联系电话{{ receiverMobile }}
+
+ 配送地址{{ deliveryAddress }}
+
+
+ 自提地址{{ pickupAddress }}
+
+
+
+
+
+ 订单商品
+
+
+
+
+
+ {{ p.drugName }}
+ {{ p.qty }}
+
+
+
+
+
+
+
+
+
+ {{ p.drugName }}
+
+ 编号:{{ p.drugNumber }}
+ 数量:{{ p.qty }}
+
+ 规格:{{ p.specification }}
+ 厂家:{{ p.manufacturer }}
+
+
+ 单价:{{ p.price }}
+
+
+
+
+
+
+
+
+
+ 处方信息
+ 查看完整处方 ➔
+
+
+ 处方编号{{ detailExtra.showPrescription.prescriptionNo }}
+ 诊断{{ detailExtra.showPrescription.diagnose }}
+ 医嘱{{ detailExtra.showPrescription.doctorOrder }}
+ 开药医生{{ detailExtra.showPrescription.doctorName }}
+
+ 点击加载完整处方内容
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_business_shared/order/index.vue b/subPackages/sub_business_shared/order/index.vue
new file mode 100644
index 0000000..640c7cc
--- /dev/null
+++ b/subPackages/sub_business_shared/order/index.vue
@@ -0,0 +1,583 @@
+
+
+
+
+
+
+
+ 订单号
+
+
+
+ 订单状态
+
+ {{ statusLabels[statusIndex] || '全部' }}
+
+
+
+ 发货方式
+
+ {{ deliveryLabels[deliveryIndex] }}
+
+
+
+ 订单类型
+
+ {{ prescriptionTypeLabels[prescriptionTypeIndex] }}
+
+
+
+
+ {{ dateStart || '开始日期' }}
+
+ 至
+
+ {{ dateEnd || '结束日期' }}
+
+
+ 查询
+
+
+
+
+
+
+
+ {{ s.label }}
+ {{ s.value }}
+
+
+
+
+
+
+
+
+
+
+ 单
+ {{ rowDisplay(item).orderNo }}
+
+
+ {{ rowDisplay(item).statusText }}
+
+
+
+
+
+
+
+ {{ rowDisplay(item).productSummary || '药品订单' }}
+
+ {{ rowDisplay(item).prescriptionTypeText }}
+ {{ rowDisplay(item).deliveryText }}
+
+
+
+ ¥
+ {{ rowDisplay(item).totalPayPrice.replace('¥', '').trim() }}
+
+
+
+
+
+
+ 就诊人
+ {{ rowDisplay(item).userNickname }}
+
+
+ 收件人
+
+ {{ rowDisplay(item).receiverName }}
+ · {{ rowDisplay(item).receiverMobile }}
+
+
+
+ 开方诊所
+ {{ rowDisplay(item).storeName }}
+
+
+
+
+
+
+
+
+
+
+ 暂无订单记录
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_business_shared/order/trace/index.vue b/subPackages/sub_business_shared/order/trace/index.vue
new file mode 100644
index 0000000..b671dc1
--- /dev/null
+++ b/subPackages/sub_business_shared/order/trace/index.vue
@@ -0,0 +1,480 @@
+
+
+
+ 加载中...
+
+
+
+
+ 商品订单{{ summary.product_order_no || '—' }}
+ 挂号订单{{ summary.register_order_no }}
+ 处方号{{ summary.prescription_no }}
+ 结算状态{{ summary.is_settled === 1 ? '已结算' : '未结算' }}
+
+
+
+
+ {{ tab.label }}
+
+
+
+
+ 暂无时间线数据
+
+
+
+ {{ node.title }}
+
+ {{ node.time }}
+ {{ node.status }}
+
+
+
+
+
+
+
+
+ 加载分账...
+
+
+ 商品订单
+ 挂号订单
+
+
+
+ 费用类型{{ row.fee_type_txt || '-' }}
+ 药品{{ row.drug_name }}
+ 规格{{ row.specification }}
+ 分账金额{{ formatMoney(row.money) }}
+ 结算状态{{ row.status_txt || '-' }}
+ 时间{{ row.created_at }}
+
+
+ 暂无分账明细
+
+
+
+
+
+ 加载对账...
+
+ {{ reconciliationHint }}
+
+
+
+ 对账汇总
+
+ 挂号费 {{ reconciliationSummary.registrationPrice }}
+
+
+
+ 挂号单号 {{ reconciliationSummary.registerOrderNo }}
+
+
+
+ 总销售额
+ {{ reconciliationSummary.totalSales }}
+
+
+
+ 总供货额
+ {{ reconciliationSummary.totalSupply }}
+
+
+
+
+
+ 草药
+ 销量 {{ reconciliationSummary.herbal.sales }}
+
+ 销售{{ reconciliationSummary.herbal.salesPrice }}
+ 供货{{ reconciliationSummary.herbal.supplyPrice }}
+
+
+
+ 西药
+ 销量 {{ reconciliationSummary.medicine.sales }}
+
+ 销售{{ reconciliationSummary.medicine.salesPrice }}
+ 供货{{ reconciliationSummary.medicine.supplyPrice }}
+
+
+
+ 服务包
+ 销量 {{ reconciliationSummary.servicePackage.sales }}
+
+ 销售{{ reconciliationSummary.servicePackage.salesPrice }}
+ 供货{{ reconciliationSummary.servicePackage.supplyPrice }}
+
+
+
+ 其他费用
+
+ 诊疗费{{ reconciliationSummary.otherFees.treatment }}
+ 加工费{{ reconciliationSummary.otherFees.process }}
+ 快递费{{ reconciliationSummary.otherFees.express }}
+
+
+
+
+
+ 药品明细
+
+ 药品{{ row.drug_name || row.drug_id || '-' }}
+ 数量{{ row.number }}
+ 销售价{{ formatMoney(row.total_price) }}
+ 供货价{{ formatMoney(row.total_buy_price) }}
+
+
+ 暂无对账明细
+
+
+
+
+ 加载失败,请返回重试
+
+
+
+
+
+
+
diff --git a/subPackages/sub_business_shared/reconciliation/index.vue b/subPackages/sub_business_shared/reconciliation/index.vue
new file mode 100644
index 0000000..dd42400
--- /dev/null
+++ b/subPackages/sub_business_shared/reconciliation/index.vue
@@ -0,0 +1,802 @@
+
+
+
+
+
+
+
+
+
+
+
+ 按订单维度拆分
+ 未勾选时按药品+供货价合并
+
+
+
+
+
+ 药品
+
+
+ 搜索
+
+
+
+
+ {{ selectedDrugLabel || '点击选择匹配的药品' }}
+
+ 清除选择
+
+
+
+ 订单
+
+
+ 搜索
+
+
+
+
+ {{ selectedOrderLabel || '点击选择匹配的订单' }}
+
+ 清除选择
+
+
+ 确认筛选
+
+
+
+
+
+
+
+ {{ s.label }}
+ {{ s.value }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ rowStore(item).name }}
+ 挂号费 {{ rowStore(item).registrationPrice }}
+
+
+
+
+
+ 总销售额
+ {{ rowStore(item).totalSales }}
+
+
+
+ 总供货额
+ {{ rowStore(item).totalSupply }}
+
+
+
+
+
+
+
+
+ 🌿 草药
+ 销量 {{ rowStore(item).herbal.sales }}
+
+ 销售{{ rowStore(item).herbal.salesPrice }}
+ 供货{{ rowStore(item).herbal.supplyPrice }}
+
+
+
+
+ 💊 西药
+ 销量 {{ rowStore(item).medicine.sales }}
+
+ 销售{{ rowStore(item).medicine.salesPrice }}
+ 供货{{ rowStore(item).medicine.supplyPrice }}
+
+
+
+
+ 📦 服务包
+ 销量 {{ rowStore(item).servicePackage.sales }}
+
+ 销售{{ rowStore(item).servicePackage.salesPrice }}
+ 供货{{ rowStore(item).servicePackage.supplyPrice }}
+
+
+
+
+ 🔖 其他费用
+
+ 诊疗费{{ rowStore(item).otherFees.treatment }}
+ 加工费{{ rowStore(item).otherFees.process }}
+ 快递费{{ rowStore(item).otherFees.express }}
+
+
+
+
+
+
+
+ {{ rowDrug(item).drugName }}
+
+ 编号 {{ rowDrug(item).drugNumber }}
+ {{ rowDrug(item).typeText }}
+
+
+
+
+
+ 销量
+ {{ rowDrug(item).number }}
+
+
+ 供货单价
+ {{ rowDrug(item).marketPrice }}
+
+
+ 总销售额
+ {{ rowDrug(item).totalSales }}
+
+
+ 总供货额
+ {{ rowDrug(item).totalSupply }}
+
+
+ 订单号
+ {{ rowDrug(item).orderNo }}
+
+
+
+
+
+
+
+
+ 暂无对账数据
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_business_shared/warehouse/components/PriceEditModal.vue b/subPackages/sub_business_shared/warehouse/components/PriceEditModal.vue
new file mode 100644
index 0000000..3271177
--- /dev/null
+++ b/subPackages/sub_business_shared/warehouse/components/PriceEditModal.vue
@@ -0,0 +1,133 @@
+
+
+
+ 修改售价
+ {{ drugName }}
+ 建议售价 {{ suggestPrice }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_business_shared/warehouse/detail.vue b/subPackages/sub_business_shared/warehouse/detail.vue
new file mode 100644
index 0000000..564cfc8
--- /dev/null
+++ b/subPackages/sub_business_shared/warehouse/detail.vue
@@ -0,0 +1,314 @@
+
+
+
+
+
+
+
+
+
+ {{ display.drugName }}
+ 拼音: {{ display.pinyin_simple || '--' }}
+
+
+
+
+
+
+ 状态
+
+ {{ display.statusText }}
+
+
+
+ 库存
+ {{ display.stock }}
+
+
+
+
+
+ 供货价
+ {{ display.buyPrice }}
+
+
+ 建议售价
+ {{ display.suggestPrice }}
+
+
+ 当前售价
+ {{ display.price }}
+
+
+
+
+
+
+ 修改售价
+
+
+ {{ display.isOnShelf ? '下架该药品' : '上架该药品' }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_business_shared/warehouse/index.vue b/subPackages/sub_business_shared/warehouse/index.vue
new file mode 100644
index 0000000..63cf2c4
--- /dev/null
+++ b/subPackages/sub_business_shared/warehouse/index.vue
@@ -0,0 +1,381 @@
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 供货 {{ rowDisplay(item).buyPrice }} · 售价 {{ rowDisplay(item).price }}
+ 库存 {{ rowDisplay(item).stock }}
+
+
+
+
+
+ 改价
+
+
+ {{ rowDisplay(item).isOnShelf ? '下架' : '上架' }}
+
+
+
+
+
+
+
+
+
+ 暂无药品数据
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_business_shared/withdrawal/account-change/index.vue b/subPackages/sub_business_shared/withdrawal/account-change/index.vue
new file mode 100644
index 0000000..c2ce81d
--- /dev/null
+++ b/subPackages/sub_business_shared/withdrawal/account-change/index.vue
@@ -0,0 +1,216 @@
+
+
+
+
+
+ {{ currentSourceLabel }}
+
+
+ 搜索
+
+
+
+
+
+ {{ item.source_type_txt || '-' }}
+
+ {{ item.change_amount }}
+
+
+ 变更字段{{ item.field_name_txt || item.field_name }}
+ 变动前{{ item.before_amount }}
+ 变动后{{ item.after_amount }}
+ 订单号{{ item.order_no }}
+ 时间{{ item.created_at }}
+ 备注{{ item.remark }}
+ 查看订单详情
+
+
+
+ 暂无资金变动记录
+
+
+
+
+
+
+
diff --git a/subPackages/sub_business_shared/withdrawal/apply.vue b/subPackages/sub_business_shared/withdrawal/apply.vue
new file mode 100644
index 0000000..ea8c550
--- /dev/null
+++ b/subPackages/sub_business_shared/withdrawal/apply.vue
@@ -0,0 +1,105 @@
+
+
+ 可提现余额:{{ balanceText }}
+
+ 提现金额
+
+
+
+ {{ q.value }}
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_business_shared/withdrawal/card-edit.vue b/subPackages/sub_business_shared/withdrawal/card-edit.vue
new file mode 100644
index 0000000..6deaf86
--- /dev/null
+++ b/subPackages/sub_business_shared/withdrawal/card-edit.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+ {{ f.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_business_shared/withdrawal/index.vue b/subPackages/sub_business_shared/withdrawal/index.vue
new file mode 100644
index 0000000..035a200
--- /dev/null
+++ b/subPackages/sub_business_shared/withdrawal/index.vue
@@ -0,0 +1,429 @@
+
+
+
+
+
+
+
+ {{ cardTitle || '银行卡' }}
+ 储蓄卡
+
+
+
+ {{ maskCard(card.bank_card) || '**** **** **** ----' }}
+
+
+ 开户行:{{ card.bank_name || '-' }}
+
+
+
+
+
+
+
+
+ {{ b.label }}
+ {{ b.display }}
+
+
+
+
+
+
+ {{ m.label }}
+
+
+
+
+
+
+ 提现记录
+
+
+
+
+
+ 提现到银行卡
+
+ -{{ item.amount || '0.00' }}
+
+
+ {{ item.time || '-' }}
+
+ {{ item.statusText || '处理中' }}
+
+
+
+
+ 暂无提现记录
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_business_shared/withdrawal/record-detail.vue b/subPackages/sub_business_shared/withdrawal/record-detail.vue
new file mode 100644
index 0000000..9149041
--- /dev/null
+++ b/subPackages/sub_business_shared/withdrawal/record-detail.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+ 实际到账 (元)
+ {{ formatMoney(info.true_cash) }}
+
+
+
+ {{ checkStatusText(info.check_status) }}
+
+
+
+
+
+ 订单号{{ info.order_no || '-' }}
+ 申请金额{{ formatMoney(info.apply_cash) }}
+ 手续费{{ formatMoney(info.charge_cash) }}
+ 申请时间{{ formatDateTime(info.apply_time) }}
+
+
+
+ 审核说明
+ {{ info.check_result }}
+
+
+
+
+ 打款状态{{ dakuanStatusText(info.dakuan_status) }}
+ 打款时间{{ formatDateTime(info.dakuan_time) }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_business_shared/withdrawal/settlement/detail.vue b/subPackages/sub_business_shared/withdrawal/settlement/detail.vue
new file mode 100644
index 0000000..f47dde1
--- /dev/null
+++ b/subPackages/sub_business_shared/withdrawal/settlement/detail.vue
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+ 订单号:{{ detail.order_no }}
+ {{ formatMoney(detail.sum_money) }}
+
+
+
+
+ 结算汇总
+ 费用类型{{ ledgerLogSummary.fee_type_txt || '-' }}
+ 结算类型{{ ledgerLogSummary.type_txt || '-' }}
+ 结算总额{{ formatMoney(ledgerLogSummary.amount) }}
+ 说明{{ ledgerLogSummary.content }}
+
+
+
+
+ 分账明细
+
+
+ 费用类型{{ row.fee_type_txt || '-' }}
+ 分账金额{{ formatMoney(row.money) }}
+
+ 结算状态
+ {{ row.status_txt || '-' }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_business_shared/withdrawal/settlement/index.vue b/subPackages/sub_business_shared/withdrawal/settlement/index.vue
new file mode 100644
index 0000000..284c567
--- /dev/null
+++ b/subPackages/sub_business_shared/withdrawal/settlement/index.vue
@@ -0,0 +1,302 @@
+
+
+
+
+
+ 搜索
+
+
+
+ 同订单合并
+
+
+
+
+
+
+
+ 单
+ {{ rowDisplay(item).orderNo }}
+
+
+ {{ rowDisplay(item).typeText }} {{ rowDisplay(item).amountText }}
+
+
+
+
+
+ 订单类型
+ {{ rowDisplay(item).orderTypeText }}
+
+
+ 费用类型
+ {{ rowDisplay(item).feeTypeText }}
+
+
+ 结算时间
+ {{ rowDisplay(item).createdAt }}
+
+
+ 费用说明
+ {{ rowDisplay(item).content }}
+
+
+
+
+ 结算明细
+ 订单详情
+
+
+
+
+
+ 暂无结算记录
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_clinic_admin/common/tabbar.js b/subPackages/sub_clinic_admin/common/tabbar.js
index 389eb90..8a3a277 100644
--- a/subPackages/sub_clinic_admin/common/tabbar.js
+++ b/subPackages/sub_clinic_admin/common/tabbar.js
@@ -1,6 +1,6 @@
export const TAB_WORKBENCH = 0
export const TAB_MY = 1
-
+const ROOT = '/subPackages/sub_clinic_salesperson';
export const CLINIC_TAB_ROUTES = [
'/subPackages/sub_clinic_admin/home/index',
'/subPackages/sub_clinic_admin/my/index',
@@ -9,14 +9,16 @@ export const CLINIC_TAB_ROUTES = [
export function getClinicTabList() {
return [
{
- iconPath: require('@/static/image/w-sf.png'),
- selectedIconPath: require('@/static/image/sf.png'),
+ iconPath: 'home',
+ selectedIconPath: 'home-fill',
text: '工作台',
+ pagePath: `${ROOT}/home/index`,
},
{
- iconPath: require('@/static/image/w-wd.png'),
- selectedIconPath: require('@/static/image/wd.png'),
+ iconPath: 'account',
+ selectedIconPath: 'account-fill',
text: '我的',
+ pagePath: `${ROOT}/my/index`,
},
]
}
diff --git a/subPackages/sub_clinic_admin/components/clinic-page-layout.vue b/subPackages/sub_clinic_admin/components/clinic-page-layout.vue
index 61df1ab..0ab4984 100644
--- a/subPackages/sub_clinic_admin/components/clinic-page-layout.vue
+++ b/subPackages/sub_clinic_admin/components/clinic-page-layout.vue
@@ -21,7 +21,7 @@
\ No newline at end of file
diff --git a/subPackages/sub_clinic_admin/my/index.vue b/subPackages/sub_clinic_admin/my/index.vue
index d5e54d8..1ee998b 100644
--- a/subPackages/sub_clinic_admin/my/index.vue
+++ b/subPackages/sub_clinic_admin/my/index.vue
@@ -18,13 +18,13 @@
-
-
-
- 所属诊所
- {{ storeName }}
-
-
+
+
+
+
+
+
+
@@ -46,8 +46,9 @@
+
+
diff --git a/subPackages/sub_clinic_salesperson/common/context.js b/subPackages/sub_clinic_salesperson/common/context.js
new file mode 100644
index 0000000..dcde059
--- /dev/null
+++ b/subPackages/sub_clinic_salesperson/common/context.js
@@ -0,0 +1,20 @@
+const ROOT = '/subPackages/sub_clinic_salesperson';
+
+export function getClinicSalespersonContext() {
+ return {
+ tabList: [
+ {
+ iconPath: 'home',
+ selectedIconPath: 'home-fill',
+ text: '工作台',
+ pagePath: `${ROOT}/home/index`,
+ },
+ {
+ iconPath: 'account',
+ selectedIconPath: 'account-fill',
+ text: '我的',
+ pagePath: `${ROOT}/my/index`,
+ },
+ ],
+ };
+}
diff --git a/subPackages/sub_clinic_salesperson/components/clinic-salesperson-page-layout.vue b/subPackages/sub_clinic_salesperson/components/clinic-salesperson-page-layout.vue
new file mode 100644
index 0000000..0895367
--- /dev/null
+++ b/subPackages/sub_clinic_salesperson/components/clinic-salesperson-page-layout.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_clinic_salesperson/earnings/index.vue b/subPackages/sub_clinic_salesperson/earnings/index.vue
new file mode 100644
index 0000000..72e0414
--- /dev/null
+++ b/subPackages/sub_clinic_salesperson/earnings/index.vue
@@ -0,0 +1,45 @@
+
+
+
+
+ {{ item.label }}
+ {{ item.value }}
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_clinic_salesperson/home/index.vue b/subPackages/sub_clinic_salesperson/home/index.vue
new file mode 100644
index 0000000..b1b323a
--- /dev/null
+++ b/subPackages/sub_clinic_salesperson/home/index.vue
@@ -0,0 +1,498 @@
+
+
+
+
+
+
+
+
+ 推广员工作台
+ {{ displayName }}
+ {{ storeName }}
+
+
+
+
+
+
+
+ 电子名片
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ¥
+ {{ stats.pending_amount || '0.00' }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 已结算
+ {{ stats.settled_amount || '0.00' }}
+
+
+
+
+
+
+
+
+
+ 累计获客
+ {{ stats.user_number || 0 }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+ {{ item.desc }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_clinic_salesperson/leads/index.vue b/subPackages/sub_clinic_salesperson/leads/index.vue
new file mode 100644
index 0000000..710c7b7
--- /dev/null
+++ b/subPackages/sub_clinic_salesperson/leads/index.vue
@@ -0,0 +1,44 @@
+
+
+
+ 暂无获客记录
+
+
+ {{ item.user_nick_name || '用户' }}
+ {{ item.user_phone }}
+
+ {{ item.bind_at_text }}
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_clinic_salesperson/my/index.vue b/subPackages/sub_clinic_salesperson/my/index.vue
new file mode 100644
index 0000000..20fcee1
--- /dev/null
+++ b/subPackages/sub_clinic_salesperson/my/index.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
+ {{ avatarText }}
+
+
+ {{ displayName }}
+
+ 推广员
+
+ {{ phone }}
+ {{ storeName }}
+
+
+
+
+
+ 所属诊所
+ {{ storeName || '-' }}
+
+
+
+
+
+
+ 退出登录
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_clinic_salesperson/settlement/index.vue b/subPackages/sub_clinic_salesperson/settlement/index.vue
new file mode 100644
index 0000000..8f4a966
--- /dev/null
+++ b/subPackages/sub_clinic_salesperson/settlement/index.vue
@@ -0,0 +1,54 @@
+
+
+
+ 暂无结算记录
+
+
+ {{ item.settlement_no }}
+ {{ item.created_at_text }}
+
+ ¥{{ item.amount }}
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_clinic_salesperson/utils/address-index.js b/subPackages/sub_clinic_salesperson/utils/address-index.js
new file mode 100644
index 0000000..899d3cb
--- /dev/null
+++ b/subPackages/sub_clinic_salesperson/utils/address-index.js
@@ -0,0 +1,632 @@
+import { addressOption } from '@/subPackages/sub_clinic_salesperson/utils/address.js';
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/** 跨级搜索结果 */
+
+
+/** 列表面板统一行 */
+
+
+const MUNICIPALITY_LABELS = new Set([
+ '北京市',
+ '天津市',
+ '上海市',
+ '重庆市',
+]);
+
+let provinceIndexCache = null;
+
+function isPrefectureCityLabel(label) {
+ return label.endsWith('市') && !label.endsWith('自治区');
+}
+
+function isDistrictLikeLabel(label) {
+ return /(?:区|县|旗)$/.test(label);
+}
+
+function detectMunicipality(province, children) {
+ if (MUNICIPALITY_LABELS.has(province.label)) {
+ return true;
+ }
+ if (!province.label.endsWith('市') || children.length === 0) {
+ return false;
+ }
+ const districtCount = children.filter((c) => isDistrictLikeLabel(c.label)).length;
+ return districtCount / children.length >= 0.8;
+}
+
+function buildProvinceIndexList() {
+ return (addressOption).map((province) => {
+ const children = (province)
+ .children ?? [];
+ return {
+ province: {
+ value: province.value,
+ label: province.label,
+ pvalue: province.pvalue,
+ },
+ children: children.map((c) => ({
+ value: c.value,
+ label: c.label,
+ pvalue: c.pvalue,
+ })),
+ isMunicipality: detectMunicipality(province, children),
+ };
+ });
+}
+
+function getProvinceIndexList() {
+ if (!provinceIndexCache) {
+ provinceIndexCache = buildProvinceIndexList();
+ }
+ return provinceIndexCache;
+}
+
+function findProvinceIndex(provinceId) {
+ if (!provinceId) {
+ return undefined;
+ }
+ return getProvinceIndexList().find((p) => p.province.value === provinceId);
+}
+
+function findChild(
+ provinceIndex,
+ childId,
+) {
+ if (!childId) {
+ return undefined;
+ }
+ return provinceIndex.children.find((c) => c.value === childId);
+}
+
+function getCityNamePrefix(label) {
+ return label.replace(/市$/, '');
+}
+
+/** 省级列表 */
+export function getProvinces() {
+ return getProvinceIndexList().map((p) => p.province);
+}
+
+/** 市级列表(直辖市返回空) */
+export function getCities(provinceId) {
+ const index = findProvinceIndex(provinceId);
+ if (!index || index.isMunicipality) {
+ return [];
+ }
+ return index.children;
+}
+
+/** 区级列表 */
+export function getDistricts(
+ provinceId,
+ cityId,
+) {
+ const index = findProvinceIndex(provinceId);
+ if (!index) {
+ return [];
+ }
+ if (index.isMunicipality) {
+ return index.children;
+ }
+ if (!cityId) {
+ return [];
+ }
+ const city = findChild(index, cityId);
+ if (!city || !isPrefectureCityLabel(city.label)) {
+ return [];
+ }
+ const prefix = getCityNamePrefix(city.label);
+ return index.children.filter(
+ (c) =>
+ c.value !== cityId &&
+ !isPrefectureCityLabel(c.label) &&
+ c.label.startsWith(prefix),
+ );
+}
+
+/** 当前层级候选列表 */
+export function getLevelOptions(
+ level,
+ ctx,
+) {
+ if (level === 'province') {
+ return getProvinces();
+ }
+ if (level === 'city') {
+ return getCities(ctx.provinceId);
+ }
+ return getDistricts(ctx.provinceId, ctx.cityId);
+}
+
+/** 选择某级后的下一层级(无则 undefined) */
+export function getNextLevel(
+ currentLevel,
+ ctx,
+) {
+ const index = findProvinceIndex(ctx.provinceId);
+ if (!index) {
+ return undefined;
+ }
+ if (currentLevel === 'province') {
+ return index.isMunicipality ? 'district' : 'city';
+ }
+ if (currentLevel === 'city') {
+ if (!ctx.cityId) {
+ return undefined;
+ }
+ const districts = getDistricts(ctx.provinceId, ctx.cityId);
+ return districts.length > 0 ? 'district' : undefined;
+ }
+ return undefined;
+}
+
+/** 当前层级选中后是否可直接完成(叶节点) */
+export function canCompleteAfterSelect(
+ level,
+ ctx,
+ item,
+) {
+ const index = findProvinceIndex(ctx.provinceId);
+ if (!index) {
+ return false;
+ }
+ if (level === 'district') {
+ return true;
+ }
+ if (level === 'city') {
+ if (index.isMunicipality) {
+ return false;
+ }
+ if (!isPrefectureCityLabel(item.label)) {
+ return true;
+ }
+ return getDistricts(ctx.provinceId, item.value).length === 0;
+ }
+ return false;
+}
+
+/** 组装对外 address 值 */
+export function buildAddressOutput(
+ provinceId,
+ cityId,
+ districtId,
+) {
+ if (!provinceId) {
+ return undefined;
+ }
+ const leafId = districtId ?? cityId;
+ if (!leafId) {
+ return undefined;
+ }
+ return [provinceId, leafId];
+}
+
+/** 由 address 反查省/市/区 */
+export function resolveAddressValue(
+ value,
+) {
+ if (!value || value.length < 2) {
+ return {};
+ }
+ const [provinceId, leafId] = value;
+ const index = findProvinceIndex(provinceId);
+ if (!index) {
+ return { provinceId };
+ }
+ const leaf = findChild(index, leafId);
+ if (!leaf) {
+ return { provinceId, province: index.province };
+ }
+
+ if (index.isMunicipality) {
+ return {
+ provinceId,
+ districtId: leafId,
+ province: index.province,
+ district: leaf,
+ };
+ }
+
+ const isLeafDistrict =
+ !isPrefectureCityLabel(leaf.label) && isDistrictLikeLabel(leaf.label);
+
+ if (isPrefectureCityLabel(leaf.label)) {
+ return {
+ provinceId,
+ cityId: leafId,
+ province: index.province,
+ city: leaf,
+ };
+ }
+
+ if (isLeafDistrict) {
+ for (const city of index.children.filter((c) =>
+ isPrefectureCityLabel(c.label),
+ )) {
+ const prefix = getCityNamePrefix(city.label);
+ if (leaf.label.startsWith(prefix)) {
+ return {
+ provinceId,
+ cityId: city.value,
+ districtId: leafId,
+ province: index.province,
+ city,
+ district: leaf,
+ };
+ }
+ }
+ return {
+ provinceId,
+ cityId: leafId,
+ province: index.province,
+ city: leaf,
+ };
+ }
+
+ return {
+ provinceId,
+ cityId: leafId,
+ province: index.province,
+ city: leaf,
+ };
+}
+
+/** 面包屑展示项 */
+export function formatBreadcrumbItems(
+ resolved,
+) {
+ const items = [];
+ if (resolved.provinceId && resolved.province) {
+ items.push({
+ level: 'province',
+ id: resolved.provinceId,
+ label: resolved.province.label,
+ });
+ }
+ const index = findProvinceIndex(resolved.provinceId);
+ if (index?.isMunicipality) {
+ if (resolved.districtId && resolved.district) {
+ items.push({
+ level: 'district',
+ id: resolved.districtId,
+ label: resolved.district.label,
+ });
+ }
+ return items;
+ }
+ if (resolved.cityId && resolved.city) {
+ items.push({
+ level: 'city',
+ id: resolved.cityId,
+ label: resolved.city.label,
+ });
+ }
+ if (resolved.districtId && resolved.district) {
+ items.push({
+ level: 'district',
+ id: resolved.districtId,
+ label: resolved.district.label,
+ });
+ }
+ return items;
+}
+
+/** 触发器展示文案 */
+export function formatAddressDisplay(value) {
+ const items = formatBreadcrumbItems(resolveAddressValue(value));
+ return items.map((i) => i.label).join(' / ');
+}
+
+/** 当前层级搜索占位 */
+export function getLevelSearchPlaceholder(level) {
+ const map = {
+ province: '搜索省',
+ city: '搜索市/县',
+ district: '搜索区',
+ };
+ return map[level];
+}
+
+/** 模糊筛选 */
+export function filterAddressOptions(
+ options,
+ keyword,
+) {
+ const q = keyword.trim().toLowerCase();
+ if (!q) {
+ return options;
+ }
+ return options.filter((o) => o.label.toLowerCase().includes(q));
+}
+
+/** 从已选上下文生成面包屑(面板内) */
+export function buildBreadcrumbFromContext(
+ ctx,
+) {
+ return formatBreadcrumbItems({
+ provinceId: ctx.provinceId,
+ cityId: ctx.cityId,
+ districtId: ctx.districtId,
+ province: findProvinceIndex(ctx.provinceId)?.province,
+ city: findChild(findProvinceIndex(ctx.provinceId), ctx.cityId),
+ district: findChild(findProvinceIndex(ctx.provinceId), ctx.districtId),
+ });
+}
+
+/** 根据面板内选中生成 ResolvedAddress */
+export function contextToResolved(ctx) {
+ const index = findProvinceIndex(ctx.provinceId);
+ return {
+ provinceId: ctx.provinceId,
+ cityId: ctx.cityId,
+ districtId: ctx.districtId,
+ province: index?.province,
+ city: index ? findChild(index, ctx.cityId) : undefined,
+ district: index ? findChild(index, ctx.districtId) : undefined,
+ };
+}
+
+/** 是否直辖市 */
+export function isMunicipalityProvince(provinceId) {
+ return !!findProvinceIndex(provinceId)?.isMunicipality;
+}
+
+/** 打开面板时的初始层级(有回填则进入待选级,否则省) */
+export function getInitialPickerLevel(
+ resolved,
+) {
+ const index = findProvinceIndex(resolved.provinceId);
+ if (!resolved.provinceId || !index) {
+ return 'province';
+ }
+ if (index.isMunicipality) {
+ return 'district';
+ }
+ if (!resolved.cityId) {
+ return 'city';
+ }
+ const districts = getDistricts(resolved.provinceId, resolved.cityId);
+ if (!resolved.districtId && districts.length > 0) {
+ return 'district';
+ }
+ return 'city';
+}
+
+/** 当前级候选转列表行 */
+export function levelOptionsToRows(
+ level,
+ ctx,
+) {
+ return getLevelOptions(level, ctx).map((node) => ({
+ level,
+ node,
+ label: node.label,
+ complete: canCompleteAfterSelect(
+ level,
+ level === 'city'
+ ? { provinceId: ctx.provinceId, cityId: node.value }
+ : level === 'district'
+ ? {
+ provinceId: ctx.provinceId,
+ cityId: ctx.cityId,
+ districtId: node.value,
+ }
+ : ctx,
+ node,
+ ),
+ }));
+}
+
+/** 跨级模糊搜索(含第三级区/县) */
+export function searchAddressHits(
+ keyword,
+ ctx,
+) {
+ const q = keyword.trim().toLowerCase();
+ if (!q) {
+ return [];
+ }
+
+ const hits = [];
+ const seen = new Set();
+
+ const push = (hit) => {
+ const key = `${hit.level}-${hit.node.value}`;
+ if (!seen.has(key)) {
+ seen.add(key);
+ hits.push(hit);
+ }
+ };
+
+ if (!ctx.provinceId) {
+ for (const p of getProvinces()) {
+ if (p.label.toLowerCase().includes(q)) {
+ push({
+ level: 'province',
+ node: p,
+ pathLabel: p.label,
+ complete: false,
+ });
+ }
+ }
+ return hits;
+ }
+
+ const index = findProvinceIndex(ctx.provinceId);
+ if (!index) {
+ return hits;
+ }
+
+ if (index.isMunicipality) {
+ for (const d of index.children) {
+ if (d.label.toLowerCase().includes(q)) {
+ push({
+ level: 'district',
+ node: d,
+ pathLabel: `${index.province.label} / ${d.label}`,
+ complete: true,
+ });
+ }
+ }
+ return hits;
+ }
+
+ const cityNode = ctx.cityId ? findChild(index, ctx.cityId) : undefined;
+
+ if (!ctx.cityId) {
+ for (const child of index.children) {
+ if (!child.label.toLowerCase().includes(q)) {
+ continue;
+ }
+ const rowCtx = { provinceId: ctx.provinceId, cityId: child.value };
+ push({
+ level: 'city',
+ node: child,
+ pathLabel: `${index.province.label} / ${child.label}`,
+ complete: canCompleteAfterSelect('city', rowCtx, child),
+ });
+ }
+ for (const child of index.children.filter((c) => isPrefectureCityLabel(c.label))) {
+ for (const d of getDistricts(ctx.provinceId, child.value)) {
+ if (!d.label.toLowerCase().includes(q)) {
+ continue;
+ }
+ push({
+ level: 'district',
+ node: d,
+ pathLabel: `${index.province.label} / ${child.label} / ${d.label}`,
+ complete: true,
+ });
+ }
+ }
+ return hits;
+ }
+
+ if (cityNode && cityNode.label.toLowerCase().includes(q)) {
+ push({
+ level: 'city',
+ node: cityNode,
+ pathLabel: `${index.province.label} / ${cityNode.label}`,
+ complete: canCompleteAfterSelect('city', ctx, cityNode),
+ });
+ }
+
+ for (const d of getDistricts(ctx.provinceId, ctx.cityId)) {
+ if (d.label.toLowerCase().includes(q)) {
+ push({
+ level: 'district',
+ node: d,
+ pathLabel: `${index.province.label} / ${cityNode?.label ?? ''} / ${d.label}`,
+ complete: true,
+ });
+ }
+ }
+
+ return hits;
+}
+
+/** 搜索命中转列表行 */
+export function searchHitsToRows(hits) {
+ return hits.map((hit) => ({
+ level: hit.level,
+ node: hit.node,
+ label: hit.pathLabel,
+ complete: hit.complete,
+ }));
+}
+
+/** 应用跨级搜索选中 */
+export function applySearchHit(
+ hit,
+ ctx,
+) {
+ if (hit.level === 'province') {
+ return {
+ provinceId: hit.node.value,
+ cityId: undefined,
+ districtId: undefined,
+ };
+ }
+ if (hit.level === 'city') {
+ return {
+ provinceId: ctx.provinceId,
+ cityId: hit.node.value,
+ districtId: undefined,
+ };
+ }
+ if (hit.level === 'district' && findProvinceIndex(ctx.provinceId)?.isMunicipality) {
+ return {
+ provinceId: ctx.provinceId,
+ cityId: undefined,
+ districtId: hit.node.value,
+ };
+ }
+ return {
+ provinceId: ctx.provinceId,
+ cityId: ctx.cityId,
+ districtId: hit.node.value,
+ };
+}
+
+/** 高亮项是否有下一级 */
+export function rowHasNextLevel(
+ row,
+ ctx,
+) {
+ if (row.level === 'province') {
+ return !!getNextLevel('province', {
+ provinceId: row.node.value,
+ cityId: undefined,
+ districtId: undefined,
+ });
+ }
+ if (row.level === 'city') {
+ return !!getNextLevel('city', {
+ provinceId: ctx.provinceId,
+ cityId: row.node.value,
+ districtId: undefined,
+ });
+ }
+ return false;
+}
+
+/** 点击面包屑项后截断选中并返回新上下文 */
+export function truncateContextToBreadcrumb(
+ ctx,
+ item,
+) {
+ if (item.level === 'province') {
+ return {
+ provinceId: item.id,
+ cityId: undefined,
+ districtId: undefined,
+ };
+ }
+ if (item.level === 'city') {
+ return {
+ provinceId: ctx.provinceId,
+ cityId: item.id,
+ districtId: undefined,
+ };
+ }
+ return {
+ provinceId: ctx.provinceId,
+ cityId: ctx.cityId,
+ districtId: item.id,
+ };
+}
diff --git a/subPackages/sub_clinic_salesperson/utils/address.js b/subPackages/sub_clinic_salesperson/utils/address.js
new file mode 100644
index 0000000..e26e437
--- /dev/null
+++ b/subPackages/sub_clinic_salesperson/utils/address.js
@@ -0,0 +1,2 @@
+/** 省市区数据,与 xk-admin address.ts 保持一致时需手动维护 */
+export const addressOption = [{"value":1,"label":"天津市","pvalue":0,"children":[{"value":2347,"label":"和平区","pvalue":1},{"value":2348,"label":"河东区","pvalue":1},{"value":2349,"label":"河西区","pvalue":1},{"value":2350,"label":"南开区","pvalue":1},{"value":2351,"label":"河北区","pvalue":1},{"value":2352,"label":"红桥区","pvalue":1},{"value":2353,"label":"滨海新区","pvalue":1},{"value":2354,"label":"东丽区","pvalue":1},{"value":2355,"label":"西青区","pvalue":1},{"value":2356,"label":"津南区","pvalue":1},{"value":2373,"label":"北辰区","pvalue":1},{"value":2374,"label":"武清区","pvalue":1},{"value":2375,"label":"宝坻区","pvalue":1},{"value":2376,"label":"宁河区","pvalue":1},{"value":2377,"label":"静海区","pvalue":1},{"value":2378,"label":"蓟州区","pvalue":1}]},{"value":2,"label":"上海市","pvalue":0,"children":[{"value":2357,"label":"黄浦区","pvalue":2},{"value":2358,"label":"徐汇区","pvalue":2},{"value":2359,"label":"长宁区","pvalue":2},{"value":2360,"label":"静安区","pvalue":2},{"value":2361,"label":"普陀区","pvalue":2},{"value":2362,"label":"虹口区","pvalue":2},{"value":2363,"label":"杨浦区","pvalue":2},{"value":2364,"label":"浦东新区","pvalue":2},{"value":2365,"label":"闵行区","pvalue":2},{"value":2366,"label":"宝山区","pvalue":2},{"value":2367,"label":"嘉定区","pvalue":2},{"value":2368,"label":"金山区","pvalue":2},{"value":2369,"label":"松江区","pvalue":2},{"value":2370,"label":"青浦区","pvalue":2},{"value":2371,"label":"奉贤区","pvalue":2},{"value":2372,"label":"崇明区","pvalue":2}]},{"value":3,"label":"重庆市","pvalue":0,"children":[{"value":2395,"label":"万州区","pvalue":3},{"value":2396,"label":"涪陵区","pvalue":3},{"value":2397,"label":"渝中区","pvalue":3},{"value":2398,"label":"大渡口区","pvalue":3},{"value":2399,"label":"江北区","pvalue":3},{"value":2400,"label":"沙坪坝区","pvalue":3},{"value":2401,"label":"九龙坡区","pvalue":3},{"value":2402,"label":"南岸区","pvalue":3},{"value":2403,"label":"北碚区","pvalue":3},{"value":2404,"label":"綦江区","pvalue":3},{"value":2405,"label":"大足区","pvalue":3},{"value":2406,"label":"渝北区","pvalue":3},{"value":2407,"label":"巴南区","pvalue":3},{"value":2408,"label":"黔江区","pvalue":3},{"value":2409,"label":"长寿区","pvalue":3},{"value":2410,"label":"江津区","pvalue":3},{"value":2411,"label":"合川区","pvalue":3},{"value":2412,"label":"永川区","pvalue":3},{"value":2413,"label":"南川区","pvalue":3},{"value":2414,"label":"璧山区","pvalue":3},{"value":2415,"label":"铜梁区","pvalue":3},{"value":2416,"label":"潼南区","pvalue":3},{"value":2417,"label":"荣昌区","pvalue":3},{"value":2418,"label":"开州区","pvalue":3},{"value":2419,"label":"梁平区","pvalue":3},{"value":2420,"label":"武隆区","pvalue":3},{"value":2421,"label":"城口县","pvalue":3},{"value":2422,"label":"丰都县","pvalue":3},{"value":2423,"label":"垫江县","pvalue":3},{"value":2424,"label":"忠县","pvalue":3},{"value":2425,"label":"云阳县","pvalue":3},{"value":2426,"label":"奉节县","pvalue":3},{"value":2427,"label":"巫山县","pvalue":3},{"value":2428,"label":"巫溪县","pvalue":3},{"value":2429,"label":"石柱土家族自治县","pvalue":3},{"value":2430,"label":"秀山土家族苗族自治县","pvalue":3},{"value":2431,"label":"酉阳土家族苗族自治县","pvalue":3},{"value":2432,"label":"彭水苗族土家族自治县","pvalue":3}]},{"value":4,"label":"河北省","pvalue":0,"children":[{"value":737,"label":"石家庄市","pvalue":4},{"value":738,"label":"晋州市","pvalue":4},{"value":739,"label":"行唐县","pvalue":4},{"value":740,"label":"灵寿县","pvalue":4},{"value":741,"label":"平山县","pvalue":4},{"value":742,"label":"赞皇县","pvalue":4},{"value":743,"label":"元氏县","pvalue":4},{"value":744,"label":"高邑县","pvalue":4},{"value":745,"label":"新乐市","pvalue":4},{"value":746,"label":"赵县","pvalue":4},{"value":747,"label":"藁城市","pvalue":4},{"value":748,"label":"无极县","pvalue":4},{"value":749,"label":"深泽县","pvalue":4},{"value":750,"label":"辛集市","pvalue":4},{"value":751,"label":"鹿泉市","pvalue":4},{"value":752,"label":"栾城县","pvalue":4},{"value":753,"label":"正定县","pvalue":4},{"value":754,"label":"井陉县","pvalue":4},{"value":755,"label":"唐山市","pvalue":4},{"value":756,"label":"滦县","pvalue":4},{"value":757,"label":"滦南县","pvalue":4},{"value":758,"label":"乐亭县","pvalue":4},{"value":759,"label":"迁安市","pvalue":4},{"value":760,"label":"迁西县","pvalue":4},{"value":761,"label":"遵化市","pvalue":4},{"value":762,"label":"玉田县","pvalue":4},{"value":763,"label":"唐海县","pvalue":4},{"value":764,"label":"秦皇岛市","pvalue":4},{"value":765,"label":"青龙县","pvalue":4},{"value":766,"label":"昌黎县","pvalue":4},{"value":767,"label":"抚宁县","pvalue":4},{"value":768,"label":"卢龙县","pvalue":4},{"value":769,"label":"邯郸市","pvalue":4},{"value":770,"label":"邯郸县","pvalue":4},{"value":771,"label":"大名县","pvalue":4},{"value":772,"label":"魏县","pvalue":4},{"value":773,"label":"曲周县","pvalue":4},{"value":774,"label":"邱县","pvalue":4},{"value":775,"label":"鸡泽县","pvalue":4},{"value":776,"label":"肥乡县","pvalue":4},{"value":777,"label":"广平县","pvalue":4},{"value":778,"label":"成安县","pvalue":4},{"value":779,"label":"临漳县","pvalue":4},{"value":780,"label":"磁县","pvalue":4},{"value":781,"label":"涉县","pvalue":4},{"value":782,"label":"永年县","pvalue":4},{"value":783,"label":"馆陶县","pvalue":4},{"value":784,"label":"武安市","pvalue":4},{"value":785,"label":"邢台市","pvalue":4},{"value":786,"label":"邢台县","pvalue":4},{"value":787,"label":"南宫市","pvalue":4},{"value":788,"label":"沙河市","pvalue":4},{"value":789,"label":"临城县","pvalue":4},{"value":790,"label":"内邱县","pvalue":4},{"value":791,"label":"柏乡县","pvalue":4},{"value":792,"label":"隆尧县","pvalue":4},{"value":793,"label":"任县","pvalue":4},{"value":794,"label":"南和县","pvalue":4},{"value":795,"label":"宁晋县","pvalue":4},{"value":796,"label":"巨鹿县","pvalue":4},{"value":797,"label":"新河县","pvalue":4},{"value":798,"label":"广宗县","pvalue":4},{"value":799,"label":"平乡县","pvalue":4},{"value":800,"label":"威县","pvalue":4},{"value":801,"label":"清河县","pvalue":4},{"value":802,"label":"临西县","pvalue":4},{"value":803,"label":"保定市","pvalue":4},{"value":804,"label":"满城县","pvalue":4},{"value":805,"label":"清苑县","pvalue":4},{"value":806,"label":"定州市","pvalue":4},{"value":807,"label":"涿州市","pvalue":4},{"value":808,"label":"易县","pvalue":4},{"value":809,"label":"徐水县","pvalue":4},{"value":810,"label":"涞源县","pvalue":4},{"value":811,"label":"定兴县","pvalue":4},{"value":812,"label":"顺平县","pvalue":4},{"value":813,"label":"唐县","pvalue":4},{"value":814,"label":"望都县","pvalue":4},{"value":815,"label":"涞水县","pvalue":4},{"value":816,"label":"高阳县","pvalue":4},{"value":817,"label":"安新县","pvalue":4},{"value":818,"label":"雄县","pvalue":4},{"value":819,"label":"容城县","pvalue":4},{"value":820,"label":"高碑店市","pvalue":4},{"value":821,"label":"曲阳县","pvalue":4},{"value":822,"label":"阜平县","pvalue":4},{"value":823,"label":"安国市","pvalue":4},{"value":824,"label":"博野县","pvalue":4},{"value":825,"label":"蠡县","pvalue":4},{"value":826,"label":"张家口市","pvalue":4},{"value":827,"label":"宣化县","pvalue":4},{"value":828,"label":"张北县","pvalue":4},{"value":829,"label":"康保县","pvalue":4},{"value":830,"label":"沽源县","pvalue":4},{"value":831,"label":"尚义县","pvalue":4},{"value":832,"label":"蔚县","pvalue":4},{"value":833,"label":"阳原县","pvalue":4},{"value":834,"label":"怀安县","pvalue":4},{"value":835,"label":"万全县","pvalue":4},{"value":836,"label":"怀来县","pvalue":4},{"value":837,"label":"涿鹿县","pvalue":4},{"value":838,"label":"赤城县","pvalue":4},{"value":839,"label":"崇礼县","pvalue":4},{"value":840,"label":"承德市","pvalue":4},{"value":841,"label":"承德县","pvalue":4},{"value":842,"label":"宽城县","pvalue":4},{"value":843,"label":"兴隆县","pvalue":4},{"value":844,"label":"平泉县","pvalue":4},{"value":845,"label":"滦平县","pvalue":4},{"value":846,"label":"丰宁县","pvalue":4},{"value":847,"label":"隆化县","pvalue":4},{"value":848,"label":"围场县","pvalue":4},{"value":849,"label":"沧州市","pvalue":4},{"value":850,"label":"沧县","pvalue":4},{"value":851,"label":"青县","pvalue":4},{"value":852,"label":"泊头市","pvalue":4},{"value":853,"label":"任丘市","pvalue":4},{"value":854,"label":"河间市","pvalue":4},{"value":855,"label":"肃宁县","pvalue":4},{"value":856,"label":"献县","pvalue":4},{"value":857,"label":"吴桥县","pvalue":4},{"value":858,"label":"东光县","pvalue":4},{"value":859,"label":"南皮县","pvalue":4},{"value":860,"label":"盐山县","pvalue":4},{"value":861,"label":"黄骅市","pvalue":4},{"value":862,"label":"孟村县","pvalue":4},{"value":863,"label":"海兴县","pvalue":4},{"value":864,"label":"廊坊市","pvalue":4},{"value":865,"label":"三河市","pvalue":4},{"value":866,"label":"固安县","pvalue":4},{"value":867,"label":"永清县","pvalue":4},{"value":868,"label":"香河县","pvalue":4},{"value":869,"label":"大城县","pvalue":4},{"value":870,"label":"文安县","pvalue":4},{"value":871,"label":"霸州市","pvalue":4},{"value":872,"label":"大厂县","pvalue":4},{"value":873,"label":"衡水市","pvalue":4},{"value":874,"label":"冀州市","pvalue":4},{"value":875,"label":"枣强县","pvalue":4},{"value":876,"label":"武邑县","pvalue":4},{"value":877,"label":"深州市","pvalue":4},{"value":878,"label":"武强县","pvalue":4},{"value":879,"label":"饶阳县","pvalue":4},{"value":880,"label":"安平县","pvalue":4},{"value":881,"label":"故城县","pvalue":4},{"value":882,"label":"景县","pvalue":4},{"value":883,"label":"阜城县","pvalue":4}]},{"value":5,"label":"河南省","pvalue":0,"children":[{"value":1439,"label":"郑州市","pvalue":5},{"value":1440,"label":"济源市","pvalue":5},{"value":1441,"label":"新密市","pvalue":5},{"value":1442,"label":"登封市","pvalue":5},{"value":1443,"label":"巩义市","pvalue":5},{"value":1444,"label":"新郑市","pvalue":5},{"value":1445,"label":"中牟县","pvalue":5},{"value":1446,"label":"荥阳市","pvalue":5},{"value":1447,"label":"开封市","pvalue":5},{"value":1448,"label":"杞县","pvalue":5},{"value":1449,"label":"通许县","pvalue":5},{"value":1450,"label":"尉氏县","pvalue":5},{"value":1451,"label":"开封县","pvalue":5},{"value":1452,"label":"兰考县","pvalue":5},{"value":1453,"label":"洛阳市","pvalue":5},{"value":1454,"label":"偃师市","pvalue":5},{"value":1455,"label":"孟津县","pvalue":5},{"value":1456,"label":"新安县","pvalue":5},{"value":1457,"label":"栾川县","pvalue":5},{"value":1458,"label":"嵩县","pvalue":5},{"value":1459,"label":"汝阳县","pvalue":5},{"value":1460,"label":"宜阳县","pvalue":5},{"value":1461,"label":"洛宁县","pvalue":5},{"value":1462,"label":"伊川县","pvalue":5},{"value":1463,"label":"平顶山市","pvalue":5},{"value":1464,"label":"宝丰县","pvalue":5},{"value":1465,"label":"叶县","pvalue":5},{"value":1466,"label":"鲁山县","pvalue":5},{"value":1467,"label":"郏县","pvalue":5},{"value":1468,"label":"襄城县","pvalue":5},{"value":1469,"label":"汝州市","pvalue":5},{"value":1470,"label":"安阳市","pvalue":5},{"value":1471,"label":"林州市","pvalue":5},{"value":1472,"label":"安阳县","pvalue":5},{"value":1473,"label":"汤阴县","pvalue":5},{"value":1474,"label":"滑县","pvalue":5},{"value":1475,"label":"内黄县","pvalue":5},{"value":1476,"label":"鹤壁市","pvalue":5},{"value":1477,"label":"浚县","pvalue":5},{"value":1478,"label":"淇县","pvalue":5},{"value":1479,"label":"新乡市","pvalue":5},{"value":1480,"label":"新乡县","pvalue":5},{"value":1481,"label":"获嘉县","pvalue":5},{"value":1482,"label":"原阳县","pvalue":5},{"value":1483,"label":"延津县","pvalue":5},{"value":1484,"label":"封丘县","pvalue":5},{"value":1485,"label":"长垣县","pvalue":5},{"value":1486,"label":"卫辉市","pvalue":5},{"value":1487,"label":"辉县市","pvalue":5},{"value":1488,"label":"焦作市","pvalue":5},{"value":1489,"label":"修武县","pvalue":5},{"value":1490,"label":"博爱县","pvalue":5},{"value":1491,"label":"武陟县","pvalue":5},{"value":1492,"label":"沁阳市","pvalue":5},{"value":1493,"label":"温县","pvalue":5},{"value":1494,"label":"孟州市","pvalue":5},{"value":1495,"label":"濮阳市","pvalue":5},{"value":1496,"label":"清丰县","pvalue":5},{"value":1497,"label":"南乐县","pvalue":5},{"value":1498,"label":"范县","pvalue":5},{"value":1499,"label":"台前县","pvalue":5},{"value":1500,"label":"濮阳县","pvalue":5},{"value":1501,"label":"许昌市","pvalue":5},{"value":1502,"label":"长葛市","pvalue":5},{"value":1503,"label":"许昌县","pvalue":5},{"value":1504,"label":"鄢陵县","pvalue":5},{"value":1505,"label":"禹州市","pvalue":5},{"value":1506,"label":"漯河市","pvalue":5},{"value":1507,"label":"舞阳县","pvalue":5},{"value":1508,"label":"临颍县","pvalue":5},{"value":1509,"label":"郾城县","pvalue":5},{"value":1510,"label":"舞钢市","pvalue":5},{"value":1511,"label":"三门峡市","pvalue":5},{"value":1512,"label":"渑池县","pvalue":5},{"value":1513,"label":"陕县","pvalue":5},{"value":1514,"label":"灵宝市","pvalue":5},{"value":1515,"label":"卢氏县","pvalue":5},{"value":1516,"label":"义马市","pvalue":5},{"value":1517,"label":"商丘市","pvalue":5},{"value":1518,"label":"虞城县","pvalue":5},{"value":1519,"label":"民权县","pvalue":5},{"value":1520,"label":"宁陵县","pvalue":5},{"value":1521,"label":"睢县","pvalue":5},{"value":1522,"label":"夏邑县","pvalue":5},{"value":1523,"label":"柘城县","pvalue":5},{"value":1524,"label":"永城市","pvalue":5},{"value":1525,"label":"周口市","pvalue":5},{"value":1526,"label":"扶沟县","pvalue":5},{"value":1527,"label":"西华县","pvalue":5},{"value":1528,"label":"商水县","pvalue":5},{"value":1529,"label":"太康县","pvalue":5},{"value":1530,"label":"鹿邑县","pvalue":5},{"value":1531,"label":"郸城县","pvalue":5},{"value":1532,"label":"淮阳县","pvalue":5},{"value":1533,"label":"沈丘县","pvalue":5},{"value":1534,"label":"项城市","pvalue":5},{"value":1535,"label":"驻马店市","pvalue":5},{"value":1536,"label":"确山县","pvalue":5},{"value":1537,"label":"泌阳县","pvalue":5},{"value":1538,"label":"遂平县","pvalue":5},{"value":1539,"label":"西平县","pvalue":5},{"value":1540,"label":"上蔡县","pvalue":5},{"value":1541,"label":"汝南县","pvalue":5},{"value":1542,"label":"平舆县","pvalue":5},{"value":1543,"label":"新蔡县","pvalue":5},{"value":1544,"label":"正阳县","pvalue":5},{"value":1545,"label":"南阳市","pvalue":5},{"value":1546,"label":"邓州市","pvalue":5},{"value":1547,"label":"南召县","pvalue":5},{"value":1548,"label":"方城县","pvalue":5},{"value":1549,"label":"西峡县","pvalue":5},{"value":1550,"label":"镇平县","pvalue":5},{"value":1551,"label":"内乡县","pvalue":5},{"value":1552,"label":"淅川县","pvalue":5},{"value":1553,"label":"社旗县","pvalue":5},{"value":1554,"label":"唐河县","pvalue":5},{"value":1555,"label":"新野县","pvalue":5},{"value":1556,"label":"桐柏县","pvalue":5},{"value":1557,"label":"信阳市","pvalue":5},{"value":1558,"label":"息县","pvalue":5},{"value":1559,"label":"淮滨县","pvalue":5},{"value":1560,"label":"潢川县","pvalue":5},{"value":1561,"label":"光山县","pvalue":5},{"value":1562,"label":"固始县","pvalue":5},{"value":1563,"label":"商城县","pvalue":5},{"value":1564,"label":"罗山县","pvalue":5},{"value":1565,"label":"新县","pvalue":5}]},{"value":6,"label":"云南省","pvalue":0,"children":[{"value":1846,"label":"昆明市","pvalue":6},{"value":1847,"label":"寻甸县","pvalue":6},{"value":1848,"label":"禄劝县","pvalue":6},{"value":1849,"label":"嵩明县","pvalue":6},{"value":1850,"label":"石林县","pvalue":6},{"value":1851,"label":"宜良县","pvalue":6},{"value":1852,"label":"富民县","pvalue":6},{"value":1853,"label":"安宁市","pvalue":6},{"value":1854,"label":"晋宁县","pvalue":6},{"value":1855,"label":"呈贡县","pvalue":6},{"value":1856,"label":"昭通市","pvalue":6},{"value":1857,"label":"鲁甸县","pvalue":6},{"value":1858,"label":"巧家县","pvalue":6},{"value":1859,"label":"盐津县","pvalue":6},{"value":1860,"label":"大关县","pvalue":6},{"value":1861,"label":"永善县","pvalue":6},{"value":1862,"label":"绥江县","pvalue":6},{"value":1863,"label":"镇雄县","pvalue":6},{"value":1864,"label":"彝良县","pvalue":6},{"value":1865,"label":"威信县","pvalue":6},{"value":1866,"label":"水富县","pvalue":6},{"value":1867,"label":"曲靖市","pvalue":6},{"value":1868,"label":"马龙县","pvalue":6},{"value":1869,"label":"宣威市","pvalue":6},{"value":1870,"label":"富源县","pvalue":6},{"value":1871,"label":"罗平县","pvalue":6},{"value":1872,"label":"师宗县","pvalue":6},{"value":1873,"label":"陆良县","pvalue":6},{"value":1874,"label":"会泽县","pvalue":6},{"value":1875,"label":"沾益县","pvalue":6},{"value":1876,"label":"楚雄市","pvalue":6},{"value":1877,"label":"双柏县","pvalue":6},{"value":1878,"label":"牟定县","pvalue":6},{"value":1879,"label":"南华县","pvalue":6},{"value":1880,"label":"姚安县","pvalue":6},{"value":1881,"label":"大姚县","pvalue":6},{"value":1882,"label":"永仁县","pvalue":6},{"value":1883,"label":"元谋县","pvalue":6},{"value":1884,"label":"武定县","pvalue":6},{"value":1885,"label":"禄丰县","pvalue":6},{"value":1886,"label":"玉溪市","pvalue":6},{"value":1887,"label":"江川县","pvalue":6},{"value":1888,"label":"澄江县","pvalue":6},{"value":1889,"label":"通海县","pvalue":6},{"value":1890,"label":"华宁县","pvalue":6},{"value":1891,"label":"易门县","pvalue":6},{"value":1892,"label":"峨山县","pvalue":6},{"value":1893,"label":"新平县","pvalue":6},{"value":1894,"label":"元江县","pvalue":6},{"value":1895,"label":"个旧市","pvalue":6},{"value":1896,"label":"开远市","pvalue":6},{"value":1897,"label":"蒙自县","pvalue":6},{"value":1898,"label":"屏边县","pvalue":6},{"value":1899,"label":"建水县","pvalue":6},{"value":1900,"label":"石屏县","pvalue":6},{"value":1901,"label":"弥勒县","pvalue":6},{"value":1902,"label":"泸西县","pvalue":6},{"value":1903,"label":"元阳县","pvalue":6},{"value":1904,"label":"红河县","pvalue":6},{"value":1905,"label":"金平县","pvalue":6},{"value":1906,"label":"绿春县","pvalue":6},{"value":1907,"label":"河口县","pvalue":6},{"value":1908,"label":"文山县","pvalue":6},{"value":1909,"label":"砚山县","pvalue":6},{"value":1910,"label":"西畴县","pvalue":6},{"value":1911,"label":"麻栗坡县","pvalue":6},{"value":1912,"label":"马关县","pvalue":6},{"value":1913,"label":"邱北县","pvalue":6},{"value":1914,"label":"广南县","pvalue":6},{"value":1915,"label":"富宁县","pvalue":6},{"value":1916,"label":"思茅市","pvalue":6},{"value":1917,"label":"普洱县","pvalue":6},{"value":1918,"label":"墨江县","pvalue":6},{"value":1919,"label":"景东县","pvalue":6},{"value":1920,"label":"景谷县","pvalue":6},{"value":1921,"label":"镇沅县","pvalue":6},{"value":1922,"label":"江城县","pvalue":6},{"value":1923,"label":"孟连县","pvalue":6},{"value":1924,"label":"澜沧县","pvalue":6},{"value":1925,"label":"西盟县","pvalue":6},{"value":1926,"label":"景洪市","pvalue":6},{"value":1927,"label":"勐海县","pvalue":6},{"value":1928,"label":"勐腊县","pvalue":6},{"value":1929,"label":"大理市","pvalue":6},{"value":1930,"label":"漾濞县","pvalue":6},{"value":1931,"label":"祥云县","pvalue":6},{"value":1932,"label":"宾川县","pvalue":6},{"value":1933,"label":"弥渡县","pvalue":6},{"value":1934,"label":"南涧县","pvalue":6},{"value":1935,"label":"巍山县","pvalue":6},{"value":1936,"label":"永平县","pvalue":6},{"value":1937,"label":"云龙县","pvalue":6},{"value":1938,"label":"洱源县","pvalue":6},{"value":1939,"label":"剑川县","pvalue":6},{"value":1940,"label":"鹤庆县","pvalue":6},{"value":1941,"label":"保山市","pvalue":6},{"value":1942,"label":"施甸县","pvalue":6},{"value":1943,"label":"腾冲县","pvalue":6},{"value":1944,"label":"龙陵县","pvalue":6},{"value":1945,"label":"昌宁县","pvalue":6},{"value":1946,"label":"潞西市","pvalue":6},{"value":1947,"label":"梁河县","pvalue":6},{"value":1948,"label":"盈江县","pvalue":6},{"value":1949,"label":"陇川县","pvalue":6},{"value":1950,"label":"瑞丽市","pvalue":6},{"value":1951,"label":"丽江市","pvalue":6},{"value":1952,"label":"永胜县","pvalue":6},{"value":1953,"label":"华坪县","pvalue":6},{"value":1954,"label":"宁蒗县","pvalue":6},{"value":1955,"label":"泸水县","pvalue":6},{"value":1956,"label":"福贡县","pvalue":6},{"value":1957,"label":"贡山县","pvalue":6},{"value":1958,"label":"兰坪县","pvalue":6},{"value":1959,"label":"香格里拉县","pvalue":6},{"value":1960,"label":"德钦县","pvalue":6},{"value":1961,"label":"维西县","pvalue":6},{"value":1962,"label":"临沧市","pvalue":6},{"value":1963,"label":"凤庆县","pvalue":6},{"value":1964,"label":"云县","pvalue":6},{"value":1965,"label":"永德县","pvalue":6},{"value":1966,"label":"镇康县","pvalue":6},{"value":1967,"label":"双江县","pvalue":6},{"value":1968,"label":"耿马县","pvalue":6},{"value":1969,"label":"沧源县","pvalue":6}]},{"value":7,"label":"辽宁省","pvalue":0,"children":[{"value":35,"label":"沈阳市","pvalue":7},{"value":36,"label":"东城区","pvalue":7},{"value":37,"label":"康平县","pvalue":7},{"value":38,"label":"辽中县","pvalue":7},{"value":39,"label":"新民市","pvalue":7},{"value":40,"label":"大连市","pvalue":7},{"value":41,"label":"普兰店市","pvalue":7},{"value":42,"label":"庄河市","pvalue":7},{"value":43,"label":"瓦房店市","pvalue":7},{"value":44,"label":"长海县","pvalue":7},{"value":45,"label":"鞍山市","pvalue":7},{"value":46,"label":"台安县","pvalue":7},{"value":47,"label":"海城市","pvalue":7},{"value":48,"label":"抚顺市","pvalue":7},{"value":49,"label":"抚顺县","pvalue":7},{"value":50,"label":"新宾县","pvalue":7},{"value":51,"label":"喀左县","pvalue":7},{"value":52,"label":"本溪市","pvalue":7},{"value":53,"label":"本溪县","pvalue":7},{"value":54,"label":"桓仁县","pvalue":7},{"value":55,"label":"丹东市","pvalue":7},{"value":56,"label":"凤城市","pvalue":7},{"value":57,"label":"大石桥市","pvalue":7},{"value":58,"label":"东港市","pvalue":7},{"value":59,"label":"宽甸县","pvalue":7},{"value":60,"label":"岫岩县","pvalue":7},{"value":61,"label":"锦州市","pvalue":7},{"value":62,"label":"绥中县","pvalue":7},{"value":63,"label":"凌海市","pvalue":7},{"value":64,"label":"北宁市","pvalue":7},{"value":65,"label":"黑山县","pvalue":7},{"value":66,"label":"义县","pvalue":7},{"value":67,"label":"葫芦岛市","pvalue":7},{"value":68,"label":"兴城市","pvalue":7},{"value":69,"label":"营口市","pvalue":7},{"value":70,"label":"盖州市","pvalue":7},{"value":71,"label":"阜新市","pvalue":7},{"value":72,"label":"阜新县","pvalue":7},{"value":73,"label":"彰武县","pvalue":7},{"value":74,"label":"辽阳市","pvalue":7},{"value":75,"label":"辽阳县","pvalue":7},{"value":76,"label":"灯塔市","pvalue":7},{"value":77,"label":"盘锦市","pvalue":7},{"value":78,"label":"大洼县","pvalue":7},{"value":79,"label":"盘山县","pvalue":7},{"value":80,"label":"铁岭市","pvalue":7},{"value":81,"label":"西丰县","pvalue":7},{"value":82,"label":"昌图县","pvalue":7},{"value":83,"label":"调兵山市","pvalue":7},{"value":84,"label":"开原市","pvalue":7},{"value":85,"label":"朝阳市","pvalue":7},{"value":86,"label":"建平县","pvalue":7},{"value":87,"label":"凌源市","pvalue":7},{"value":88,"label":"清原县","pvalue":7},{"value":89,"label":"建昌县","pvalue":7},{"value":90,"label":"北票市","pvalue":7}]},{"value":8,"label":"黑龙江省","pvalue":0,"children":[{"value":1078,"label":"哈尔滨市","pvalue":8},{"value":1079,"label":"依兰县","pvalue":8},{"value":1080,"label":"延寿县","pvalue":8},{"value":1081,"label":"方正县","pvalue":8},{"value":1082,"label":"通河县","pvalue":8},{"value":1083,"label":"木兰县","pvalue":8},{"value":1084,"label":"巴彦县","pvalue":8},{"value":1085,"label":"五常市","pvalue":8},{"value":1086,"label":"宾县","pvalue":8},{"value":1087,"label":"尚志市","pvalue":8},{"value":1088,"label":"双城市","pvalue":8},{"value":1089,"label":"阿城市","pvalue":8},{"value":1090,"label":"呼兰县","pvalue":8},{"value":1091,"label":"齐齐哈尔市","pvalue":8},{"value":1092,"label":"龙江县","pvalue":8},{"value":1093,"label":"讷河市","pvalue":8},{"value":1094,"label":"依安县","pvalue":8},{"value":1095,"label":"泰来县","pvalue":8},{"value":1096,"label":"甘南县","pvalue":8},{"value":1097,"label":"杜蒙县","pvalue":8},{"value":1098,"label":"富裕县","pvalue":8},{"value":1099,"label":"林甸县","pvalue":8},{"value":1100,"label":"克山县","pvalue":8},{"value":1101,"label":"大庆市","pvalue":8},{"value":1102,"label":"克东县","pvalue":8},{"value":1103,"label":"拜泉县","pvalue":8},{"value":1104,"label":"鸡西市","pvalue":8},{"value":1105,"label":"鸡东县","pvalue":8},{"value":1106,"label":"鹤岗市","pvalue":8},{"value":1107,"label":"萝北县","pvalue":8},{"value":1108,"label":"绥滨县","pvalue":8},{"value":1109,"label":"双鸭山市","pvalue":8},{"value":1110,"label":"集贤县","pvalue":8},{"value":1111,"label":"佳木斯市","pvalue":8},{"value":1112,"label":"伊春市","pvalue":8},{"value":1113,"label":"嘉荫县","pvalue":8},{"value":1114,"label":"铁力市","pvalue":8},{"value":1115,"label":"牡丹江市","pvalue":8},{"value":1116,"label":"桦南县","pvalue":8},{"value":1117,"label":"桦川县","pvalue":8},{"value":1118,"label":"宝清县","pvalue":8},{"value":1119,"label":"汤原县","pvalue":8},{"value":1120,"label":"饶河县","pvalue":8},{"value":1121,"label":"抚远县","pvalue":8},{"value":1122,"label":"友谊县","pvalue":8},{"value":1123,"label":"同江市","pvalue":8},{"value":1124,"label":"富锦市","pvalue":8},{"value":1125,"label":"七台河市","pvalue":8},{"value":1126,"label":"勃利县","pvalue":8},{"value":1127,"label":"宁安市","pvalue":8},{"value":1128,"label":"海林市","pvalue":8},{"value":1129,"label":"穆棱市","pvalue":8},{"value":1130,"label":"东宁县","pvalue":8},{"value":1131,"label":"林口县","pvalue":8},{"value":1132,"label":"虎林市","pvalue":8},{"value":1133,"label":"绥芬河市","pvalue":8},{"value":1134,"label":"密山市","pvalue":8},{"value":1135,"label":"绥化市","pvalue":8},{"value":1136,"label":"安达市","pvalue":8},{"value":1137,"label":"肇东市","pvalue":8},{"value":1138,"label":"海伦市","pvalue":8},{"value":1139,"label":"望奎县","pvalue":8},{"value":1140,"label":"兰西县","pvalue":8},{"value":1141,"label":"青冈县","pvalue":8},{"value":1142,"label":"肇源县","pvalue":8},{"value":1143,"label":"肇州县","pvalue":8},{"value":1144,"label":"庆安县","pvalue":8},{"value":1145,"label":"明水县","pvalue":8},{"value":1146,"label":"绥棱县","pvalue":8},{"value":1147,"label":"黑河市","pvalue":8},{"value":1148,"label":"北安市","pvalue":8},{"value":1149,"label":"五大连池市","pvalue":8},{"value":1150,"label":"嫩江县","pvalue":8},{"value":1151,"label":"逊克县","pvalue":8},{"value":1152,"label":"孙吴县","pvalue":8},{"value":1153,"label":"大兴安岭地区","pvalue":8},{"value":1154,"label":"呼玛县","pvalue":8},{"value":1155,"label":"塔河县","pvalue":8},{"value":1156,"label":"漠河县","pvalue":8}]},{"value":9,"label":"湖南省","pvalue":0,"children":[{"value":1566,"label":"长沙市","pvalue":9},{"value":1567,"label":"宁乡县","pvalue":9},{"value":1568,"label":"浏阳市","pvalue":9},{"value":1569,"label":"望城县","pvalue":9},{"value":1570,"label":"株州市","pvalue":9},{"value":1571,"label":"株洲县","pvalue":9},{"value":1572,"label":"攸县","pvalue":9},{"value":1573,"label":"茶陵县","pvalue":9},{"value":1574,"label":"醴陵市","pvalue":9},{"value":1575,"label":"炎陵县","pvalue":9},{"value":1576,"label":"湘潭市","pvalue":9},{"value":1577,"label":"湘乡市","pvalue":9},{"value":1578,"label":"韶山市","pvalue":9},{"value":1579,"label":"衡阳市","pvalue":9},{"value":1580,"label":"衡阳县","pvalue":9},{"value":1581,"label":"衡南县","pvalue":9},{"value":1582,"label":"衡山县","pvalue":9},{"value":1583,"label":"衡东县","pvalue":9},{"value":1584,"label":"常宁市","pvalue":9},{"value":1585,"label":"祁东县","pvalue":9},{"value":1586,"label":"耒阳市","pvalue":9},{"value":1587,"label":"邵阳市","pvalue":9},{"value":1588,"label":"邵东县","pvalue":9},{"value":1589,"label":"新邵县","pvalue":9},{"value":1590,"label":"邵阳县","pvalue":9},{"value":1591,"label":"隆回县","pvalue":9},{"value":1592,"label":"洞口县","pvalue":9},{"value":1593,"label":"武冈市","pvalue":9},{"value":1594,"label":"绥宁县","pvalue":9},{"value":1595,"label":"新宁县","pvalue":9},{"value":1596,"label":"城步县","pvalue":9},{"value":1597,"label":"岳阳市","pvalue":9},{"value":1598,"label":"岳阳县","pvalue":9},{"value":1599,"label":"临湘市","pvalue":9},{"value":1600,"label":"华容县","pvalue":9},{"value":1601,"label":"湘阴县","pvalue":9},{"value":1602,"label":"平江县","pvalue":9},{"value":1603,"label":"汩罗市","pvalue":9},{"value":1604,"label":"常德市","pvalue":9},{"value":1605,"label":"安乡县","pvalue":9},{"value":1606,"label":"汉寿县","pvalue":9},{"value":1607,"label":"澧县","pvalue":9},{"value":1608,"label":"临澧县","pvalue":9},{"value":1609,"label":"桃源县","pvalue":9},{"value":1610,"label":"石门县","pvalue":9},{"value":1611,"label":"津市市","pvalue":9},{"value":1612,"label":"张家界市","pvalue":9},{"value":1613,"label":"慈利县","pvalue":9},{"value":1614,"label":"桑植县","pvalue":9},{"value":1615,"label":"益阳市","pvalue":9},{"value":1616,"label":"沅江市","pvalue":9},{"value":1617,"label":"南县","pvalue":9},{"value":1618,"label":"桃江县","pvalue":9},{"value":1619,"label":"安化县","pvalue":9},{"value":1620,"label":"娄底市","pvalue":9},{"value":1621,"label":"冷水江市","pvalue":9},{"value":1622,"label":"涟源市","pvalue":9},{"value":1623,"label":"双峰县","pvalue":9},{"value":1624,"label":"新化县","pvalue":9},{"value":1625,"label":"郴州市","pvalue":9},{"value":1626,"label":"资兴市","pvalue":9},{"value":1627,"label":"桂阳县","pvalue":9},{"value":1628,"label":"永兴县","pvalue":9},{"value":1629,"label":"宜章县","pvalue":9},{"value":1630,"label":"嘉禾县","pvalue":9},{"value":1631,"label":"临武县","pvalue":9},{"value":1632,"label":"汝城县","pvalue":9},{"value":1633,"label":"桂东县","pvalue":9},{"value":1634,"label":"安仁县","pvalue":9},{"value":1635,"label":"永州市","pvalue":9},{"value":1636,"label":"东安县","pvalue":9},{"value":1637,"label":"道县","pvalue":9},{"value":1638,"label":"宁远县","pvalue":9},{"value":1639,"label":"江永县","pvalue":9},{"value":1640,"label":"江华县","pvalue":9},{"value":1641,"label":"蓝山县","pvalue":9},{"value":1642,"label":"新田县","pvalue":9},{"value":1643,"label":"双牌县","pvalue":9},{"value":1644,"label":"祁阳县","pvalue":9},{"value":1645,"label":"怀化市","pvalue":9},{"value":1646,"label":"洪江市","pvalue":9},{"value":1647,"label":"沅陵县","pvalue":9},{"value":1648,"label":"辰溪县","pvalue":9},{"value":1649,"label":"溆浦县","pvalue":9},{"value":1650,"label":"麻阳县","pvalue":9},{"value":1651,"label":"新晃县","pvalue":9},{"value":1652,"label":"芷江县","pvalue":9},{"value":1653,"label":"会同县","pvalue":9},{"value":1654,"label":"靖州县","pvalue":9},{"value":1655,"label":"通道县","pvalue":9},{"value":1656,"label":"吉首市","pvalue":9},{"value":1657,"label":"泸溪县","pvalue":9},{"value":1658,"label":"凤凰县","pvalue":9},{"value":1659,"label":"花垣县","pvalue":9},{"value":1660,"label":"保靖县","pvalue":9},{"value":1661,"label":"古丈县","pvalue":9},{"value":1662,"label":"永顺县","pvalue":9},{"value":1663,"label":"龙山县","pvalue":9}]},{"value":10,"label":"安徽省","pvalue":0,"children":[{"value":1361,"label":"合肥市","pvalue":10},{"value":1362,"label":"长丰县","pvalue":10},{"value":1363,"label":"肥西县","pvalue":10},{"value":1364,"label":"肥东县","pvalue":10},{"value":1365,"label":"芜湖市","pvalue":10},{"value":1366,"label":"芜湖县","pvalue":10},{"value":1367,"label":"繁昌县","pvalue":10},{"value":1368,"label":"南陵县","pvalue":10},{"value":1369,"label":"蚌埠市","pvalue":10},{"value":1370,"label":"怀远县","pvalue":10},{"value":1371,"label":"五河县","pvalue":10},{"value":1372,"label":"固镇县","pvalue":10},{"value":1373,"label":"淮南市","pvalue":10},{"value":1374,"label":"凤台县","pvalue":10},{"value":1375,"label":"马鞍山市","pvalue":10},{"value":1376,"label":"当涂县","pvalue":10},{"value":1377,"label":"淮北市","pvalue":10},{"value":1378,"label":"濉溪县","pvalue":10},{"value":1379,"label":"铜陵市","pvalue":10},{"value":1380,"label":"铜陵县","pvalue":10},{"value":1381,"label":"安庆市","pvalue":10},{"value":1382,"label":"桐城市","pvalue":10},{"value":1383,"label":"怀宁县","pvalue":10},{"value":1384,"label":"枞阳县","pvalue":10},{"value":1385,"label":"潜山县","pvalue":10},{"value":1386,"label":"太湖县","pvalue":10},{"value":1387,"label":"宿松县","pvalue":10},{"value":1388,"label":"望江县","pvalue":10},{"value":1389,"label":"岳西县","pvalue":10},{"value":1390,"label":"黄山市","pvalue":10},{"value":1391,"label":"歙县","pvalue":10},{"value":1392,"label":"休宁县","pvalue":10},{"value":1393,"label":"黟县","pvalue":10},{"value":1394,"label":"祁门县","pvalue":10},{"value":1395,"label":"阜阳市","pvalue":10},{"value":1396,"label":"亳州市","pvalue":10},{"value":1397,"label":"临泉县","pvalue":10},{"value":1398,"label":"太和县","pvalue":10},{"value":1399,"label":"涡阳县","pvalue":10},{"value":1400,"label":"蒙城县","pvalue":10},{"value":1401,"label":"阜南县","pvalue":10},{"value":1402,"label":"颍上县","pvalue":10},{"value":1403,"label":"界首市","pvalue":10},{"value":1404,"label":"利辛县","pvalue":10},{"value":1405,"label":"宿州市","pvalue":10},{"value":1406,"label":"砀山县","pvalue":10},{"value":1407,"label":"萧县","pvalue":10},{"value":1408,"label":"灵璧县","pvalue":10},{"value":1409,"label":"泗县","pvalue":10},{"value":1410,"label":"滁州市","pvalue":10},{"value":1411,"label":"天长市","pvalue":10},{"value":1412,"label":"来安县","pvalue":10},{"value":1413,"label":"全椒县","pvalue":10},{"value":1414,"label":"定远县","pvalue":10},{"value":1415,"label":"凤阳县","pvalue":10},{"value":1416,"label":"明光市","pvalue":10},{"value":1417,"label":"六安市","pvalue":10},{"value":1418,"label":"寿县","pvalue":10},{"value":1419,"label":"霍邱县","pvalue":10},{"value":1420,"label":"舒城县","pvalue":10},{"value":1421,"label":"金寨县","pvalue":10},{"value":1422,"label":"霍山县","pvalue":10},{"value":1423,"label":"宣城市","pvalue":10},{"value":1424,"label":"郎溪县","pvalue":10},{"value":1425,"label":"广德县","pvalue":10},{"value":1426,"label":"宁国市","pvalue":10},{"value":1427,"label":"泾县","pvalue":10},{"value":1428,"label":"旌德县","pvalue":10},{"value":1429,"label":"绩溪县","pvalue":10},{"value":1430,"label":"巢湖市","pvalue":10},{"value":1431,"label":"庐江县","pvalue":10},{"value":1432,"label":"无为县","pvalue":10},{"value":1433,"label":"含山县","pvalue":10},{"value":1434,"label":"和县","pvalue":10},{"value":1435,"label":"池州市","pvalue":10},{"value":1436,"label":"东至县","pvalue":10},{"value":1437,"label":"石台县","pvalue":10},{"value":1438,"label":"青阳县","pvalue":10}]},{"value":11,"label":"山东省","pvalue":0,"children":[{"value":158,"label":"济南市","pvalue":11},{"value":159,"label":"商河县","pvalue":11},{"value":160,"label":"济阳县","pvalue":11},{"value":161,"label":"平阴县","pvalue":11},{"value":162,"label":"章丘市","pvalue":11},{"value":163,"label":"青岛市","pvalue":11},{"value":164,"label":"即墨市","pvalue":11},{"value":165,"label":"胶南市","pvalue":11},{"value":166,"label":"莱西市","pvalue":11},{"value":167,"label":"平度市","pvalue":11},{"value":168,"label":"胶州市","pvalue":11},{"value":169,"label":"淄博市","pvalue":11},{"value":170,"label":"桓台县","pvalue":11},{"value":171,"label":"高青县","pvalue":11},{"value":172,"label":"沂源县","pvalue":11},{"value":173,"label":"枣庄市","pvalue":11},{"value":174,"label":"滕州市","pvalue":11},{"value":175,"label":"东营市","pvalue":11},{"value":176,"label":"垦利县","pvalue":11},{"value":177,"label":"利津县","pvalue":11},{"value":178,"label":"广饶县","pvalue":11},{"value":179,"label":"烟台市","pvalue":11},{"value":180,"label":"蓬莱市","pvalue":11},{"value":181,"label":"招远市","pvalue":11},{"value":182,"label":"栖霞市","pvalue":11},{"value":183,"label":"海阳市","pvalue":11},{"value":184,"label":"长岛县","pvalue":11},{"value":185,"label":"龙口市","pvalue":11},{"value":186,"label":"莱阳市","pvalue":11},{"value":187,"label":"莱州市","pvalue":11},{"value":188,"label":"潍坊市","pvalue":11},{"value":189,"label":"安丘市","pvalue":11},{"value":190,"label":"寿光市","pvalue":11},{"value":191,"label":"临朐县","pvalue":11},{"value":192,"label":"昌乐县","pvalue":11},{"value":193,"label":"昌邑市","pvalue":11},{"value":194,"label":"高密市","pvalue":11},{"value":195,"label":"五莲县","pvalue":11},{"value":196,"label":"青州市","pvalue":11},{"value":197,"label":"诸城市","pvalue":11},{"value":198,"label":"济宁市","pvalue":11},{"value":199,"label":"衮州市","pvalue":11},{"value":200,"label":"邹城市","pvalue":11},{"value":201,"label":"微山县","pvalue":11},{"value":202,"label":"鱼台县","pvalue":11},{"value":203,"label":"金乡县","pvalue":11},{"value":204,"label":"嘉祥县","pvalue":11},{"value":205,"label":"汶上县","pvalue":11},{"value":206,"label":"泗水县","pvalue":11},{"value":207,"label":"曲阜市","pvalue":11},{"value":208,"label":"泰安市","pvalue":11},{"value":209,"label":"宁阳县","pvalue":11},{"value":210,"label":"肥城市","pvalue":11},{"value":211,"label":"东平县","pvalue":11},{"value":212,"label":"莱芜市","pvalue":11},{"value":213,"label":"新泰市","pvalue":11},{"value":214,"label":"威海市","pvalue":11},{"value":215,"label":"乳山市","pvalue":11},{"value":216,"label":"文登市","pvalue":11},{"value":217,"label":"荣成市","pvalue":11},{"value":218,"label":"滨州市","pvalue":11},{"value":219,"label":"惠民县","pvalue":11},{"value":220,"label":"阳信县","pvalue":11},{"value":221,"label":"无棣县","pvalue":11},{"value":222,"label":"沾化县","pvalue":11},{"value":223,"label":"博兴县","pvalue":11},{"value":224,"label":"邹平县","pvalue":11},{"value":225,"label":"德州市","pvalue":11},{"value":226,"label":"乐陵市","pvalue":11},{"value":227,"label":"陵县","pvalue":11},{"value":228,"label":"平原县","pvalue":11},{"value":229,"label":"夏津县","pvalue":11},{"value":230,"label":"武城县","pvalue":11},{"value":231,"label":"齐河县","pvalue":11},{"value":232,"label":"禹城市","pvalue":11},{"value":233,"label":"临邑县","pvalue":11},{"value":234,"label":"宁津县","pvalue":11},{"value":235,"label":"庆云县","pvalue":11},{"value":236,"label":"聊城市","pvalue":11},{"value":237,"label":"临清市","pvalue":11},{"value":238,"label":"阳谷县","pvalue":11},{"value":239,"label":"莘县","pvalue":11},{"value":240,"label":"茌平县","pvalue":11},{"value":241,"label":"东阿县","pvalue":11},{"value":242,"label":"冠县","pvalue":11},{"value":243,"label":"高唐县","pvalue":11},{"value":244,"label":"临沂市","pvalue":11},{"value":245,"label":"日照市","pvalue":11},{"value":246,"label":"郯城县","pvalue":11},{"value":247,"label":"苍山县","pvalue":11},{"value":248,"label":"莒南县","pvalue":11},{"value":249,"label":"莒县","pvalue":11},{"value":250,"label":"沂水县","pvalue":11},{"value":251,"label":"蒙阴县","pvalue":11},{"value":252,"label":"平邑县","pvalue":11},{"value":253,"label":"费县","pvalue":11},{"value":254,"label":"沂南县","pvalue":11},{"value":255,"label":"临沭县","pvalue":11},{"value":256,"label":"菏泽市","pvalue":11},{"value":257,"label":"曹县","pvalue":11},{"value":258,"label":"定陶县","pvalue":11},{"value":259,"label":"成武县","pvalue":11},{"value":260,"label":"单县","pvalue":11},{"value":261,"label":"巨野县","pvalue":11},{"value":262,"label":"梁山县","pvalue":11},{"value":263,"label":"郓城县","pvalue":11},{"value":264,"label":"鄄城县","pvalue":11},{"value":265,"label":"东明县","pvalue":11}]},{"value":12,"label":"新疆维吾尔族自治区","pvalue":0,"children":[{"value":2255,"label":"乌鲁木齐市","pvalue":12},{"value":2256,"label":"乌鲁木齐县","pvalue":12},{"value":2257,"label":"克拉玛依市","pvalue":12},{"value":2258,"label":"吐鲁番市","pvalue":12},{"value":2259,"label":"鄯善县","pvalue":12},{"value":2260,"label":"托克逊县","pvalue":12},{"value":2261,"label":"哈密市","pvalue":12},{"value":2262,"label":"巴里坤哈萨克自治县","pvalue":12},{"value":2263,"label":"伊吾县","pvalue":12},{"value":2264,"label":"北屯镇","pvalue":12},{"value":2265,"label":"昌吉市","pvalue":12},{"value":2266,"label":"米泉市","pvalue":12},{"value":2267,"label":"呼图壁县","pvalue":12},{"value":2268,"label":"玛纳斯县","pvalue":12},{"value":2269,"label":"奇台县","pvalue":12},{"value":2270,"label":"阜康市","pvalue":12},{"value":2271,"label":"吉木萨尔县","pvalue":12},{"value":2272,"label":"五家渠市","pvalue":12},{"value":2273,"label":"木垒哈萨克自治县","pvalue":12},{"value":2274,"label":"博乐市","pvalue":12},{"value":2275,"label":"精河县","pvalue":12},{"value":2276,"label":"温泉县","pvalue":12},{"value":2277,"label":"库尔勒市","pvalue":12},{"value":2278,"label":"轮台县","pvalue":12},{"value":2279,"label":"尉犁县","pvalue":12},{"value":2280,"label":"若羌县","pvalue":12},{"value":2281,"label":"且末县","pvalue":12},{"value":2282,"label":"焉耆回族自治县","pvalue":12},{"value":2283,"label":"和静县","pvalue":12},{"value":2284,"label":"和硕县","pvalue":12},{"value":2285,"label":"博湖县","pvalue":12},{"value":2286,"label":"阿克苏市","pvalue":12},{"value":2287,"label":"温宿县","pvalue":12},{"value":2288,"label":"库车县","pvalue":12},{"value":2289,"label":"沙雅县","pvalue":12},{"value":2290,"label":"新和县","pvalue":12},{"value":2291,"label":"拜城县","pvalue":12},{"value":2292,"label":"乌什县","pvalue":12},{"value":2293,"label":"阿瓦提县","pvalue":12},{"value":2294,"label":"柯坪县","pvalue":12},{"value":2295,"label":"阿图什市","pvalue":12},{"value":2296,"label":"阿克陶县","pvalue":12},{"value":2297,"label":"阿合奇县","pvalue":12},{"value":2298,"label":"乌恰县","pvalue":12},{"value":2299,"label":"喀什市","pvalue":12},{"value":2300,"label":"疏附县","pvalue":12},{"value":2301,"label":"疏勒县","pvalue":12},{"value":2302,"label":"英吉沙县","pvalue":12},{"value":2303,"label":"泽普县","pvalue":12},{"value":2304,"label":"莎车县","pvalue":12},{"value":2305,"label":"叶城县","pvalue":12},{"value":2306,"label":"麦盖提县","pvalue":12},{"value":2307,"label":"岳普湖县","pvalue":12},{"value":2308,"label":"伽师县","pvalue":12},{"value":2309,"label":"巴楚县","pvalue":12},{"value":2310,"label":"塔什库尔干塔吉克自治县","pvalue":12},{"value":2311,"label":"和田市","pvalue":12},{"value":2312,"label":"墨玉县","pvalue":12},{"value":2313,"label":"皮山县","pvalue":12},{"value":2314,"label":"洛浦县","pvalue":12},{"value":2315,"label":"策勒县","pvalue":12},{"value":2316,"label":"于田县","pvalue":12},{"value":2317,"label":"民丰县","pvalue":12},{"value":2318,"label":"伊宁市","pvalue":12},{"value":2319,"label":"奎屯市","pvalue":12},{"value":2320,"label":"伊宁县","pvalue":12},{"value":2321,"label":"察布查尔锡伯自治县","pvalue":12},{"value":2322,"label":"霍城县","pvalue":12},{"value":2323,"label":"巩留县","pvalue":12},{"value":2324,"label":"新源县","pvalue":12},{"value":2325,"label":"昭苏县","pvalue":12},{"value":2326,"label":"特克斯县","pvalue":12},{"value":2327,"label":"尼勒克县","pvalue":12},{"value":2328,"label":"塔城市","pvalue":12},{"value":2329,"label":"额敏县","pvalue":12},{"value":2330,"label":"乌苏市","pvalue":12},{"value":2331,"label":"沙湾县","pvalue":12},{"value":2332,"label":"托里县","pvalue":12},{"value":2333,"label":"裕民县","pvalue":12},{"value":2334,"label":"和布克赛尔蒙古自治县","pvalue":12},{"value":2335,"label":"阿勒泰市","pvalue":12},{"value":2336,"label":"布尔津县","pvalue":12},{"value":2337,"label":"富蕴县","pvalue":12},{"value":2338,"label":"福海县","pvalue":12},{"value":2339,"label":"哈巴河县","pvalue":12},{"value":2340,"label":"青河县","pvalue":12},{"value":2341,"label":"吉木乃县","pvalue":12},{"value":2342,"label":"石河子市","pvalue":12},{"value":2343,"label":"三道岭地区","pvalue":12},{"value":2344,"label":"阿拉尔市","pvalue":12},{"value":2345,"label":"图木舒克市","pvalue":12},{"value":2346,"label":"阿拉山口口岸","pvalue":12}]},{"value":13,"label":"江苏省","pvalue":0,"children":[{"value":91,"label":"南京市","pvalue":13},{"value":92,"label":"高淳县","pvalue":13},{"value":93,"label":"溧水县","pvalue":13},{"value":94,"label":"无锡市","pvalue":13},{"value":95,"label":"江阴市","pvalue":13},{"value":96,"label":"宜兴市","pvalue":13},{"value":97,"label":"徐州市","pvalue":13},{"value":98,"label":"丰县","pvalue":13},{"value":99,"label":"沛县","pvalue":13},{"value":100,"label":"铜山县","pvalue":13},{"value":101,"label":"睢宁县","pvalue":13},{"value":102,"label":"邳州市","pvalue":13},{"value":103,"label":"新沂市","pvalue":13},{"value":104,"label":"常州市","pvalue":13},{"value":105,"label":"金坛市","pvalue":13},{"value":106,"label":"溧阳市","pvalue":13},{"value":107,"label":"苏州市","pvalue":13},{"value":108,"label":"太仓市","pvalue":13},{"value":109,"label":"昆山市","pvalue":13},{"value":110,"label":"吴江市","pvalue":13},{"value":111,"label":"常熟市","pvalue":13},{"value":112,"label":"张家港市","pvalue":13},{"value":113,"label":"南通市","pvalue":13},{"value":114,"label":"海安县","pvalue":13},{"value":115,"label":"如皋市","pvalue":13},{"value":116,"label":"如东县","pvalue":13},{"value":117,"label":"海门市","pvalue":13},{"value":118,"label":"启东市","pvalue":13},{"value":119,"label":"连云港市","pvalue":13},{"value":120,"label":"赣榆县","pvalue":13},{"value":121,"label":"东海县","pvalue":13},{"value":122,"label":"灌云县","pvalue":13},{"value":123,"label":"淮安市","pvalue":13},{"value":124,"label":"灌南县","pvalue":13},{"value":125,"label":"沭阳县","pvalue":13},{"value":126,"label":"通州市","pvalue":13},{"value":127,"label":"涟水县","pvalue":13},{"value":128,"label":"泗洪县","pvalue":13},{"value":129,"label":"洪泽县","pvalue":13},{"value":130,"label":"盱眙县","pvalue":13},{"value":131,"label":"金湖县","pvalue":13},{"value":132,"label":"宿迁市","pvalue":13},{"value":133,"label":"泗阳县","pvalue":13},{"value":134,"label":"宿豫县","pvalue":13},{"value":135,"label":"盐城市","pvalue":13},{"value":136,"label":"响水县","pvalue":13},{"value":137,"label":"滨海县","pvalue":13},{"value":138,"label":"阜宁县","pvalue":13},{"value":139,"label":"射阳县","pvalue":13},{"value":140,"label":"建湖县","pvalue":13},{"value":141,"label":"大丰市","pvalue":13},{"value":142,"label":"东台市","pvalue":13},{"value":143,"label":"盐都县","pvalue":13},{"value":144,"label":"扬州市","pvalue":13},{"value":145,"label":"高邮市","pvalue":13},{"value":146,"label":"宝应县","pvalue":13},{"value":147,"label":"靖江市","pvalue":13},{"value":148,"label":"泰兴市","pvalue":13},{"value":149,"label":"江都市","pvalue":13},{"value":150,"label":"泰州市","pvalue":13},{"value":151,"label":"仪征市","pvalue":13},{"value":152,"label":"兴化市","pvalue":13},{"value":153,"label":"姜堰市","pvalue":13},{"value":154,"label":"镇江市","pvalue":13},{"value":155,"label":"丹阳市","pvalue":13},{"value":156,"label":"句容市","pvalue":13},{"value":157,"label":"扬中市","pvalue":13}]},{"value":14,"label":"浙江省","pvalue":0,"children":[{"value":1225,"label":"杭州市","pvalue":14},{"value":1226,"label":"淳安县","pvalue":14},{"value":1227,"label":"建德市","pvalue":14},{"value":1228,"label":"临安市","pvalue":14},{"value":1229,"label":"富阳市","pvalue":14},{"value":1230,"label":"桐庐县","pvalue":14},{"value":1231,"label":"宁波市","pvalue":14},{"value":1232,"label":"象山县","pvalue":14},{"value":1233,"label":"宁海县","pvalue":14},{"value":1234,"label":"余姚市","pvalue":14},{"value":1235,"label":"慈溪市","pvalue":14},{"value":1236,"label":"奉化市","pvalue":14},{"value":1237,"label":"温州市","pvalue":14},{"value":1238,"label":"洞头县","pvalue":14},{"value":1239,"label":"乐清市","pvalue":14},{"value":1240,"label":"永嘉县","pvalue":14},{"value":1241,"label":"平阳县","pvalue":14},{"value":1242,"label":"苍南县","pvalue":14},{"value":1243,"label":"文成县","pvalue":14},{"value":1244,"label":"泰顺县","pvalue":14},{"value":1245,"label":"瑞安市","pvalue":14},{"value":1246,"label":"嘉兴市","pvalue":14},{"value":1247,"label":"嘉善县","pvalue":14},{"value":1248,"label":"平湖市","pvalue":14},{"value":1249,"label":"海盐县","pvalue":14},{"value":1250,"label":"桐乡市","pvalue":14},{"value":1251,"label":"海宁市","pvalue":14},{"value":1252,"label":"湖州市","pvalue":14},{"value":1253,"label":"德清县","pvalue":14},{"value":1254,"label":"长兴县","pvalue":14},{"value":1255,"label":"安吉县","pvalue":14},{"value":1256,"label":"绍兴市","pvalue":14},{"value":1257,"label":"绍兴县","pvalue":14},{"value":1258,"label":"上虞市","pvalue":14},{"value":1259,"label":"嵊州市","pvalue":14},{"value":1260,"label":"新昌县","pvalue":14},{"value":1261,"label":"诸暨市","pvalue":14},{"value":1262,"label":"金华市","pvalue":14},{"value":1263,"label":"永康市","pvalue":14},{"value":1264,"label":"武义县","pvalue":14},{"value":1265,"label":"浦江县","pvalue":14},{"value":1266,"label":"磐安县","pvalue":14},{"value":1267,"label":"兰溪市","pvalue":14},{"value":1268,"label":"义乌市","pvalue":14},{"value":1269,"label":"东阳市","pvalue":14},{"value":1270,"label":"衢州市","pvalue":14},{"value":1271,"label":"常山县","pvalue":14},{"value":1272,"label":"开化县","pvalue":14},{"value":1273,"label":"龙游县","pvalue":14},{"value":1274,"label":"江山市","pvalue":14},{"value":1275,"label":"舟山市","pvalue":14},{"value":1276,"label":"岱山县","pvalue":14},{"value":1277,"label":"嵊泗县","pvalue":14},{"value":1278,"label":"丽水市","pvalue":14},{"value":1279,"label":"青田县","pvalue":14},{"value":1280,"label":"云和县","pvalue":14},{"value":1281,"label":"庆元县","pvalue":14},{"value":1282,"label":"缙云县","pvalue":14},{"value":1283,"label":"遂昌县","pvalue":14},{"value":1284,"label":"松阳县","pvalue":14},{"value":1285,"label":"景宁县","pvalue":14},{"value":1286,"label":"龙泉市","pvalue":14},{"value":1287,"label":"台州市","pvalue":14},{"value":1288,"label":"临海市","pvalue":14},{"value":1289,"label":"温岭市","pvalue":14},{"value":1290,"label":"仙居县","pvalue":14},{"value":1291,"label":"天台县","pvalue":14},{"value":1292,"label":"三门县","pvalue":14},{"value":1293,"label":"玉环县","pvalue":14}]},{"value":15,"label":"江西省","pvalue":0,"children":[{"value":1664,"label":"南昌市","pvalue":15},{"value":1665,"label":"湾里","pvalue":15},{"value":1666,"label":"进贤县","pvalue":15},{"value":1667,"label":"安义县","pvalue":15},{"value":1668,"label":"新建县","pvalue":15},{"value":1669,"label":"南昌县","pvalue":15},{"value":1670,"label":"景德镇市","pvalue":15},{"value":1671,"label":"乐平市","pvalue":15},{"value":1672,"label":"浮梁县","pvalue":15},{"value":1673,"label":"萍乡市","pvalue":15},{"value":1674,"label":"上栗县","pvalue":15},{"value":1675,"label":"芦溪县","pvalue":15},{"value":1676,"label":"九江市","pvalue":15},{"value":1677,"label":"庐山","pvalue":15},{"value":1678,"label":"九江县","pvalue":15},{"value":1679,"label":"瑞昌市","pvalue":15},{"value":1680,"label":"武宁县","pvalue":15},{"value":1681,"label":"修水县","pvalue":15},{"value":1682,"label":"永修县","pvalue":15},{"value":1683,"label":"德安县","pvalue":15},{"value":1684,"label":"星子县","pvalue":15},{"value":1685,"label":"都昌县","pvalue":15},{"value":1686,"label":"湖口县","pvalue":15},{"value":1687,"label":"彭泽县","pvalue":15},{"value":1688,"label":"新余市","pvalue":15},{"value":1689,"label":"分宜县","pvalue":15},{"value":1690,"label":"鹰潭市","pvalue":15},{"value":1691,"label":"贵溪市","pvalue":15},{"value":1692,"label":"余江县","pvalue":15},{"value":1693,"label":"赣州市","pvalue":15},{"value":1694,"label":"赣县","pvalue":15},{"value":1695,"label":"南康市","pvalue":15},{"value":1696,"label":"信丰县","pvalue":15},{"value":1697,"label":"大余县","pvalue":15},{"value":1698,"label":"上犹县","pvalue":15},{"value":1699,"label":"崇义县","pvalue":15},{"value":1700,"label":"安远县","pvalue":15},{"value":1701,"label":"龙南县","pvalue":15},{"value":1702,"label":"定南县","pvalue":15},{"value":1703,"label":"全南县","pvalue":15},{"value":1704,"label":"宁都县","pvalue":15},{"value":1705,"label":"于都县","pvalue":15},{"value":1706,"label":"兴国县","pvalue":15},{"value":1707,"label":"瑞金市","pvalue":15},{"value":1708,"label":"会昌县","pvalue":15},{"value":1709,"label":"寻乌县","pvalue":15},{"value":1710,"label":"石城县","pvalue":15},{"value":1711,"label":"宜春市","pvalue":15},{"value":1712,"label":"丰城市","pvalue":15},{"value":1713,"label":"樟树市","pvalue":15},{"value":1714,"label":"高安市","pvalue":15},{"value":1715,"label":"奉新县","pvalue":15},{"value":1716,"label":"万载县","pvalue":15},{"value":1717,"label":"上高县","pvalue":15},{"value":1718,"label":"宜丰县","pvalue":15},{"value":1719,"label":"靖安县","pvalue":15},{"value":1720,"label":"铜鼓县","pvalue":15},{"value":1721,"label":"上饶市","pvalue":15},{"value":1722,"label":"上饶县","pvalue":15},{"value":1723,"label":"广丰县","pvalue":15},{"value":1724,"label":"玉山县","pvalue":15},{"value":1725,"label":"铅山县","pvalue":15},{"value":1726,"label":"横峰县","pvalue":15},{"value":1727,"label":"弋阳县","pvalue":15},{"value":1728,"label":"余干县","pvalue":15},{"value":1729,"label":"鄱阳县","pvalue":15},{"value":1730,"label":"万年县","pvalue":15},{"value":1731,"label":"德兴市","pvalue":15},{"value":1732,"label":"婺源县","pvalue":15},{"value":1733,"label":"吉安市","pvalue":15},{"value":1734,"label":"井冈山市","pvalue":15},{"value":1735,"label":"吉安县","pvalue":15},{"value":1736,"label":"吉水县","pvalue":15},{"value":1737,"label":"峡江县","pvalue":15},{"value":1738,"label":"新干县","pvalue":15},{"value":1739,"label":"永丰县","pvalue":15},{"value":1740,"label":"泰和县","pvalue":15},{"value":1741,"label":"遂川县","pvalue":15},{"value":1742,"label":"万安县","pvalue":15},{"value":1743,"label":"安福县","pvalue":15},{"value":1744,"label":"永新县","pvalue":15},{"value":1745,"label":"莲花县","pvalue":15},{"value":1746,"label":"抚州市","pvalue":15},{"value":1747,"label":"南城县","pvalue":15},{"value":1748,"label":"黎川县","pvalue":15},{"value":1749,"label":"南丰县","pvalue":15},{"value":1750,"label":"崇仁县","pvalue":15},{"value":1751,"label":"乐安县","pvalue":15},{"value":1752,"label":"宜黄县","pvalue":15},{"value":1753,"label":"金溪县","pvalue":15},{"value":1754,"label":"资溪县","pvalue":15},{"value":1755,"label":"东乡县","pvalue":15},{"value":1756,"label":"广昌县","pvalue":15}]},{"value":16,"label":"广西壮族自治区","pvalue":0,"children":[{"value":1757,"label":"南宁市","pvalue":16},{"value":1758,"label":"马山县","pvalue":16},{"value":1759,"label":"隆安县","pvalue":16},{"value":1760,"label":"上林县","pvalue":16},{"value":1761,"label":"宾阳县","pvalue":16},{"value":1762,"label":"横县","pvalue":16},{"value":1763,"label":"武鸣县","pvalue":16},{"value":1764,"label":"凭祥市","pvalue":16},{"value":1765,"label":"扶绥县","pvalue":16},{"value":1766,"label":"崇左市","pvalue":16},{"value":1767,"label":"大新县","pvalue":16},{"value":1768,"label":"天等县","pvalue":16},{"value":1769,"label":"宁明县","pvalue":16},{"value":1770,"label":"龙州县","pvalue":16},{"value":1771,"label":"柳州市","pvalue":16},{"value":1772,"label":"柳江县","pvalue":16},{"value":1773,"label":"柳城县","pvalue":16},{"value":1774,"label":"合山市","pvalue":16},{"value":1775,"label":"鹿寨县","pvalue":16},{"value":1776,"label":"象州县","pvalue":16},{"value":1777,"label":"武宣县","pvalue":16},{"value":1778,"label":"来宾市","pvalue":16},{"value":1779,"label":"融安县","pvalue":16},{"value":1780,"label":"三江县","pvalue":16},{"value":1781,"label":"融水县","pvalue":16},{"value":1782,"label":"金秀县","pvalue":16},{"value":1783,"label":"忻城县","pvalue":16},{"value":1784,"label":"桂林市","pvalue":16},{"value":1785,"label":"阳朔县","pvalue":16},{"value":1786,"label":"临桂县","pvalue":16},{"value":1787,"label":"灵川县","pvalue":16},{"value":1788,"label":"全州县","pvalue":16},{"value":1789,"label":"兴安县","pvalue":16},{"value":1790,"label":"永福县","pvalue":16},{"value":1791,"label":"灌阳县","pvalue":16},{"value":1792,"label":"龙胜县","pvalue":16},{"value":1793,"label":"资源县","pvalue":16},{"value":1794,"label":"平乐县","pvalue":16},{"value":1795,"label":"荔浦县","pvalue":16},{"value":1796,"label":"恭城县","pvalue":16},{"value":1797,"label":"梧州市","pvalue":16},{"value":1798,"label":"苍梧县","pvalue":16},{"value":1799,"label":"岑溪市","pvalue":16},{"value":1800,"label":"藤县","pvalue":16},{"value":1801,"label":"昭平县","pvalue":16},{"value":1802,"label":"蒙山县","pvalue":16},{"value":1803,"label":"贺州市","pvalue":16},{"value":1804,"label":"钟山县","pvalue":16},{"value":1805,"label":"富川县","pvalue":16},{"value":1806,"label":"北海市","pvalue":16},{"value":1807,"label":"合浦县","pvalue":16},{"value":1808,"label":"玉林市","pvalue":16},{"value":1809,"label":"贵港市","pvalue":16},{"value":1810,"label":"桂平市","pvalue":16},{"value":1811,"label":"平南县","pvalue":16},{"value":1812,"label":"容县","pvalue":16},{"value":1813,"label":"北流市","pvalue":16},{"value":1814,"label":"陆川县","pvalue":16},{"value":1815,"label":"博白县","pvalue":16},{"value":1816,"label":"兴业县","pvalue":16},{"value":1817,"label":"百色市","pvalue":16},{"value":1818,"label":"田阳县","pvalue":16},{"value":1819,"label":"田东县","pvalue":16},{"value":1820,"label":"平果县","pvalue":16},{"value":1821,"label":"靖西县","pvalue":16},{"value":1822,"label":"那坡县","pvalue":16},{"value":1823,"label":"凌云县","pvalue":16},{"value":1824,"label":"乐业县","pvalue":16},{"value":1825,"label":"田林县","pvalue":16},{"value":1826,"label":"隆林县","pvalue":16},{"value":1827,"label":"西林县","pvalue":16},{"value":1828,"label":"德保县","pvalue":16},{"value":1829,"label":"河池市","pvalue":16},{"value":1830,"label":"宜州市","pvalue":16},{"value":1831,"label":"罗城县","pvalue":16},{"value":1832,"label":"环江县","pvalue":16},{"value":1833,"label":"南丹县","pvalue":16},{"value":1834,"label":"天峨县","pvalue":16},{"value":1835,"label":"凤山县","pvalue":16},{"value":1836,"label":"东兰县","pvalue":16},{"value":1837,"label":"巴马县","pvalue":16},{"value":1838,"label":"都安县","pvalue":16},{"value":1839,"label":"大化县","pvalue":16},{"value":1840,"label":"钦州市","pvalue":16},{"value":1841,"label":"上思县","pvalue":16},{"value":1842,"label":"灵山县","pvalue":16},{"value":1843,"label":"浦北县","pvalue":16},{"value":1844,"label":"防城港市","pvalue":16},{"value":1845,"label":"东兴市","pvalue":16}]},{"value":17,"label":"甘肃省","pvalue":0,"children":[{"value":2126,"label":"兰州市","pvalue":17},{"value":2127,"label":"榆中县","pvalue":17},{"value":2128,"label":"皋兰县","pvalue":17},{"value":2129,"label":"永登县","pvalue":17},{"value":2130,"label":"红古区","pvalue":17},{"value":2131,"label":"嘉峪关市","pvalue":17},{"value":2132,"label":"金昌市","pvalue":17},{"value":2133,"label":"永昌县","pvalue":17},{"value":2134,"label":"白银市","pvalue":17},{"value":2135,"label":"靖远县","pvalue":17},{"value":2136,"label":"会宁县","pvalue":17},{"value":2137,"label":"景泰县","pvalue":17},{"value":2138,"label":"平川区","pvalue":17},{"value":2139,"label":"天水市","pvalue":17},{"value":2140,"label":"清水县","pvalue":17},{"value":2141,"label":"秦安县","pvalue":17},{"value":2142,"label":"甘谷县","pvalue":17},{"value":2143,"label":"武山县","pvalue":17},{"value":2144,"label":"张家川县","pvalue":17},{"value":2145,"label":"酒泉市","pvalue":17},{"value":2146,"label":"玉门市","pvalue":17},{"value":2147,"label":"敦煌市","pvalue":17},{"value":2148,"label":"金塔县","pvalue":17},{"value":2149,"label":"肃北县","pvalue":17},{"value":2150,"label":"阿克塞县","pvalue":17},{"value":2151,"label":"安西县","pvalue":17},{"value":2152,"label":"张掖市","pvalue":17},{"value":2153,"label":"肃南县","pvalue":17},{"value":2154,"label":"民乐县","pvalue":17},{"value":2155,"label":"临泽县","pvalue":17},{"value":2156,"label":"高台县","pvalue":17},{"value":2157,"label":"山丹县","pvalue":17},{"value":2158,"label":"武威市","pvalue":17},{"value":2159,"label":"民勤县","pvalue":17},{"value":2160,"label":"古浪县","pvalue":17},{"value":2161,"label":"天祝县","pvalue":17},{"value":2162,"label":"定西市","pvalue":17},{"value":2163,"label":"通渭县","pvalue":17},{"value":2164,"label":"陇西县","pvalue":17},{"value":2165,"label":"渭源县","pvalue":17},{"value":2166,"label":"临洮县","pvalue":17},{"value":2167,"label":"漳县","pvalue":17},{"value":2168,"label":"岷县","pvalue":17},{"value":2169,"label":"陇南市","pvalue":17},{"value":2170,"label":"宕昌县","pvalue":17},{"value":2171,"label":"成县","pvalue":17},{"value":2172,"label":"康县","pvalue":17},{"value":2173,"label":"文县","pvalue":17},{"value":2174,"label":"西和县","pvalue":17},{"value":2175,"label":"礼县","pvalue":17},{"value":2176,"label":"两当县","pvalue":17},{"value":2177,"label":"徽县","pvalue":17},{"value":2178,"label":"平凉市","pvalue":17},{"value":2179,"label":"泾川县","pvalue":17},{"value":2180,"label":"灵台县","pvalue":17},{"value":2181,"label":"崇信县","pvalue":17},{"value":2182,"label":"华亭县","pvalue":17},{"value":2183,"label":"庄浪县","pvalue":17},{"value":2184,"label":"静宁县","pvalue":17},{"value":2185,"label":"庆阳市","pvalue":17},{"value":2186,"label":"庆城县","pvalue":17},{"value":2187,"label":"环县","pvalue":17},{"value":2188,"label":"华池县","pvalue":17},{"value":2189,"label":"合水县","pvalue":17},{"value":2190,"label":"正宁县","pvalue":17},{"value":2191,"label":"宁县","pvalue":17},{"value":2192,"label":"镇原县","pvalue":17},{"value":2193,"label":"临夏州","pvalue":17},{"value":2194,"label":"康乐县","pvalue":17},{"value":2195,"label":"永靖县","pvalue":17},{"value":2196,"label":"广河县","pvalue":17},{"value":2197,"label":"和政县","pvalue":17},{"value":2198,"label":"东乡县","pvalue":17},{"value":2199,"label":"积石山县","pvalue":17},{"value":2200,"label":"甘南州","pvalue":17},{"value":2201,"label":"临潭县","pvalue":17},{"value":2202,"label":"卓尼县","pvalue":17},{"value":2203,"label":"舟曲县","pvalue":17},{"value":2204,"label":"迭部县","pvalue":17},{"value":2205,"label":"玛曲县","pvalue":17},{"value":2206,"label":"碌曲县","pvalue":17},{"value":2207,"label":"夏河县","pvalue":17}]},{"value":18,"label":"山西省","pvalue":0,"children":[{"value":884,"label":"太原市","pvalue":18},{"value":885,"label":"古交市","pvalue":18},{"value":886,"label":"娄烦县","pvalue":18},{"value":887,"label":"阳曲县","pvalue":18},{"value":888,"label":"清徐县","pvalue":18},{"value":889,"label":"大同市","pvalue":18},{"value":890,"label":"阳泉市","pvalue":18},{"value":891,"label":"阳高县","pvalue":18},{"value":892,"label":"天镇县","pvalue":18},{"value":893,"label":"广灵县","pvalue":18},{"value":894,"label":"灵邱县","pvalue":18},{"value":895,"label":"浑源县","pvalue":18},{"value":896,"label":"应县","pvalue":18},{"value":897,"label":"左云县","pvalue":18},{"value":898,"label":"右玉县","pvalue":18},{"value":899,"label":"大同县","pvalue":18},{"value":900,"label":"长治市","pvalue":18},{"value":901,"label":"怀仁县","pvalue":18},{"value":902,"label":"平定县","pvalue":18},{"value":903,"label":"盂县","pvalue":18},{"value":904,"label":"长治县","pvalue":18},{"value":905,"label":"潞城市","pvalue":18},{"value":906,"label":"襄垣县","pvalue":18},{"value":907,"label":"屯留县","pvalue":18},{"value":908,"label":"平顺县","pvalue":18},{"value":909,"label":"黎城县","pvalue":18},{"value":910,"label":"壶关县","pvalue":18},{"value":911,"label":"长子县","pvalue":18},{"value":912,"label":"武乡县","pvalue":18},{"value":913,"label":"沁县","pvalue":18},{"value":914,"label":"沁源县","pvalue":18},{"value":915,"label":"晋城市","pvalue":18},{"value":916,"label":"沁水县","pvalue":18},{"value":917,"label":"阳城县","pvalue":18},{"value":918,"label":"高平市","pvalue":18},{"value":919,"label":"陵川县","pvalue":18},{"value":920,"label":"朔州市","pvalue":18},{"value":921,"label":"山阴县","pvalue":18},{"value":922,"label":"忻州市","pvalue":18},{"value":923,"label":"定襄县","pvalue":18},{"value":924,"label":"五台县","pvalue":18},{"value":925,"label":"原平市","pvalue":18},{"value":926,"label":"代县","pvalue":18},{"value":927,"label":"繁峙县","pvalue":18},{"value":928,"label":"宁武县","pvalue":18},{"value":929,"label":"静乐县","pvalue":18},{"value":930,"label":"神池县","pvalue":18},{"value":931,"label":"五寨县","pvalue":18},{"value":932,"label":"岢岚县","pvalue":18},{"value":933,"label":"河曲县","pvalue":18},{"value":934,"label":"保德县","pvalue":18},{"value":935,"label":"偏关县","pvalue":18},{"value":936,"label":"吕梁市","pvalue":18},{"value":937,"label":"汾阳市","pvalue":18},{"value":938,"label":"文水县","pvalue":18},{"value":939,"label":"交城县","pvalue":18},{"value":940,"label":"孝义市","pvalue":18},{"value":941,"label":"兴县","pvalue":18},{"value":942,"label":"临县","pvalue":18},{"value":943,"label":"柳林县","pvalue":18},{"value":944,"label":"石楼县","pvalue":18},{"value":945,"label":"岚县","pvalue":18},{"value":946,"label":"方山县","pvalue":18},{"value":947,"label":"中阳县","pvalue":18},{"value":948,"label":"交口县","pvalue":18},{"value":949,"label":"晋中市","pvalue":18},{"value":950,"label":"榆社县","pvalue":18},{"value":951,"label":"左权县","pvalue":18},{"value":952,"label":"和顺县","pvalue":18},{"value":953,"label":"昔阳县","pvalue":18},{"value":954,"label":"寿阳县","pvalue":18},{"value":955,"label":"太谷县","pvalue":18},{"value":956,"label":"祁县","pvalue":18},{"value":957,"label":"平遥县","pvalue":18},{"value":958,"label":"介休市","pvalue":18},{"value":959,"label":"灵石县","pvalue":18},{"value":960,"label":"临汾市","pvalue":18},{"value":961,"label":"侯马市","pvalue":18},{"value":962,"label":"曲沃县","pvalue":18},{"value":963,"label":"翼城县","pvalue":18},{"value":964,"label":"襄汾县","pvalue":18},{"value":965,"label":"洪洞县","pvalue":18},{"value":966,"label":"霍州市","pvalue":18},{"value":967,"label":"古县","pvalue":18},{"value":968,"label":"安泽县","pvalue":18},{"value":969,"label":"浮山县","pvalue":18},{"value":970,"label":"吉县","pvalue":18},{"value":971,"label":"乡宁县","pvalue":18},{"value":972,"label":"蒲县","pvalue":18},{"value":973,"label":"大宁县","pvalue":18},{"value":974,"label":"永和县","pvalue":18},{"value":975,"label":"隰县","pvalue":18},{"value":976,"label":"汾西县","pvalue":18},{"value":977,"label":"运城市","pvalue":18},{"value":978,"label":"永济市","pvalue":18},{"value":979,"label":"芮城县","pvalue":18},{"value":980,"label":"临猗县","pvalue":18},{"value":981,"label":"万荣县","pvalue":18},{"value":982,"label":"新绛县","pvalue":18},{"value":983,"label":"稷山县","pvalue":18},{"value":984,"label":"河津市","pvalue":18},{"value":985,"label":"闻喜县","pvalue":18},{"value":986,"label":"夏县","pvalue":18},{"value":987,"label":"绛县","pvalue":18},{"value":988,"label":"平陆县","pvalue":18},{"value":989,"label":"垣曲县","pvalue":18}]},{"value":19,"label":"内蒙古自治区","pvalue":0,"children":[{"value":990,"label":"呼和浩特市","pvalue":19},{"value":991,"label":"清水河县","pvalue":19},{"value":992,"label":"和林格尔县","pvalue":19},{"value":993,"label":"武川县","pvalue":19},{"value":994,"label":"托克托县","pvalue":19},{"value":995,"label":"土左旗","pvalue":19},{"value":996,"label":"包头市","pvalue":19},{"value":997,"label":"土默特右旗","pvalue":19},{"value":998,"label":"固阳县","pvalue":19},{"value":999,"label":"乌海市","pvalue":19},{"value":1000,"label":"赤峰市","pvalue":19},{"value":1001,"label":"阿鲁科尔沁旗","pvalue":19},{"value":1002,"label":"巴林左旗","pvalue":19},{"value":1003,"label":"巴林右旗","pvalue":19},{"value":1004,"label":"林西县","pvalue":19},{"value":1005,"label":"克什克腾","pvalue":19},{"value":1006,"label":"翁牛特旗","pvalue":19},{"value":1007,"label":"喀喇沁旗","pvalue":19},{"value":1008,"label":"宁城县","pvalue":19},{"value":1009,"label":"敖汉旗","pvalue":19},{"value":1010,"label":"呼伦贝尔市","pvalue":19},{"value":1011,"label":"满州里市","pvalue":19},{"value":1012,"label":"扎兰屯市","pvalue":19},{"value":1013,"label":"牙克石市","pvalue":19},{"value":1014,"label":"阿荣旗","pvalue":19},{"value":1015,"label":"莫力达瓦达斡尔族自治旗","pvalue":19},{"value":1016,"label":"额尔古纳市","pvalue":19},{"value":1017,"label":"根河市","pvalue":19},{"value":1018,"label":"鄂伦春族自治旗","pvalue":19},{"value":1019,"label":"鄂温克族自治旗","pvalue":19},{"value":1020,"label":"新巴尔虎右旗","pvalue":19},{"value":1021,"label":"新巴尔虎左旗","pvalue":19},{"value":1022,"label":"陈巴尔虎旗","pvalue":19},{"value":1023,"label":"兴安盟","pvalue":19},{"value":1024,"label":"科尔沁右翼中旗","pvalue":19},{"value":1025,"label":"扎赉特旗","pvalue":19},{"value":1026,"label":"突泉县","pvalue":19},{"value":1027,"label":"阿尔山市","pvalue":19},{"value":1028,"label":"通辽市","pvalue":19},{"value":1029,"label":"霍林郭勒市","pvalue":19},{"value":1030,"label":"科尔沁左翼中旗","pvalue":19},{"value":1031,"label":"科尔沁左翼后旗","pvalue":19},{"value":1032,"label":"开鲁县","pvalue":19},{"value":1033,"label":"库伦旗","pvalue":19},{"value":1034,"label":"奈曼旗","pvalue":19},{"value":1035,"label":"扎鲁特旗","pvalue":19},{"value":1036,"label":"锡林郭勒盟","pvalue":19},{"value":1037,"label":"二连浩特市","pvalue":19},{"value":1038,"label":"阿巴嘎旗","pvalue":19},{"value":1039,"label":"苏尼特左旗","pvalue":19},{"value":1040,"label":"苏尼特右旗","pvalue":19},{"value":1041,"label":"东乌珠穆沁旗","pvalue":19},{"value":1042,"label":"西乌珠穆沁旗","pvalue":19},{"value":1043,"label":"太仆寺旗","pvalue":19},{"value":1044,"label":"镶黄旗","pvalue":19},{"value":1045,"label":"正镶白旗","pvalue":19},{"value":1046,"label":"正蓝旗","pvalue":19},{"value":1047,"label":"多伦县","pvalue":19},{"value":1048,"label":"乌兰察布盟","pvalue":19},{"value":1049,"label":"卓资县","pvalue":19},{"value":1050,"label":"化德县","pvalue":19},{"value":1051,"label":"商都县","pvalue":19},{"value":1052,"label":"兴和县","pvalue":19},{"value":1053,"label":"丰镇市","pvalue":19},{"value":1054,"label":"凉城县","pvalue":19},{"value":1055,"label":"察哈尔右翼前旗","pvalue":19},{"value":1056,"label":"察哈尔右翼中旗","pvalue":19},{"value":1057,"label":"察哈尔右翼后旗","pvalue":19},{"value":1058,"label":"达尔罕茂明安联合旗","pvalue":19},{"value":1059,"label":"四子王旗","pvalue":19},{"value":1060,"label":"鄂尔多斯市","pvalue":19},{"value":1061,"label":"达拉特旗","pvalue":19},{"value":1062,"label":"准格尔旗","pvalue":19},{"value":1063,"label":"鄂托克前旗","pvalue":19},{"value":1064,"label":"鄂托克旗","pvalue":19},{"value":1065,"label":"杭锦旗","pvalue":19},{"value":1066,"label":"乌审旗","pvalue":19},{"value":1067,"label":"伊金霍勒旗","pvalue":19},{"value":1068,"label":"巴彦淖尔盟","pvalue":19},{"value":1069,"label":"五原县","pvalue":19},{"value":1070,"label":"磴口县","pvalue":19},{"value":1071,"label":"乌拉特前旗","pvalue":19},{"value":1072,"label":"乌拉特中旗","pvalue":19},{"value":1073,"label":"乌拉特后旗","pvalue":19},{"value":1074,"label":"杭锦后旗","pvalue":19},{"value":1075,"label":"阿拉善盟","pvalue":19},{"value":1076,"label":"阿右旗","pvalue":19},{"value":1077,"label":"额济纳旗","pvalue":19}]},{"value":20,"label":"陕西省","pvalue":0,"children":[{"value":609,"label":"西安市","pvalue":20},{"value":610,"label":"高陵县","pvalue":20},{"value":611,"label":"户县","pvalue":20},{"value":612,"label":"周至县","pvalue":20},{"value":613,"label":"蓝田县","pvalue":20},{"value":614,"label":"铜川市","pvalue":20},{"value":615,"label":"耀县","pvalue":20},{"value":616,"label":"宜君县","pvalue":20},{"value":617,"label":"宝鸡市","pvalue":20},{"value":618,"label":"凤翔县","pvalue":20},{"value":619,"label":"岐山县","pvalue":20},{"value":620,"label":"扶风县","pvalue":20},{"value":621,"label":"眉县","pvalue":20},{"value":622,"label":"陇县","pvalue":20},{"value":623,"label":"千阳县","pvalue":20},{"value":624,"label":"麟游县","pvalue":20},{"value":625,"label":"凤县","pvalue":20},{"value":626,"label":"太白县","pvalue":20},{"value":627,"label":"咸阳市","pvalue":20},{"value":628,"label":"兴平市","pvalue":20},{"value":629,"label":"三原县","pvalue":20},{"value":630,"label":"泾阳县","pvalue":20},{"value":631,"label":"乾县","pvalue":20},{"value":632,"label":"礼泉县","pvalue":20},{"value":633,"label":"永寿县","pvalue":20},{"value":634,"label":"彬县","pvalue":20},{"value":635,"label":"长武县","pvalue":20},{"value":636,"label":"旬邑县","pvalue":20},{"value":637,"label":"淳化县","pvalue":20},{"value":638,"label":"武功县","pvalue":20},{"value":639,"label":"渭南市","pvalue":20},{"value":640,"label":"韩城市","pvalue":20},{"value":641,"label":"华县","pvalue":20},{"value":642,"label":"华阴市","pvalue":20},{"value":643,"label":"潼关县","pvalue":20},{"value":644,"label":"大荔县","pvalue":20},{"value":645,"label":"蒲城县","pvalue":20},{"value":646,"label":"澄城县","pvalue":20},{"value":647,"label":"白水县","pvalue":20},{"value":648,"label":"合阳县","pvalue":20},{"value":649,"label":"富平县","pvalue":20},{"value":650,"label":"汉中市","pvalue":20},{"value":651,"label":"南郑县","pvalue":20},{"value":652,"label":"城固县","pvalue":20},{"value":653,"label":"洋县","pvalue":20},{"value":654,"label":"西乡县","pvalue":20},{"value":655,"label":"勉县","pvalue":20},{"value":656,"label":"宁强县","pvalue":20},{"value":657,"label":"略阳县","pvalue":20},{"value":658,"label":"镇巴县","pvalue":20},{"value":659,"label":"留坝县","pvalue":20},{"value":660,"label":"佛坪县","pvalue":20},{"value":661,"label":"安康市","pvalue":20},{"value":662,"label":"汉阴县","pvalue":20},{"value":663,"label":"石泉县","pvalue":20},{"value":664,"label":"宁陕县","pvalue":20},{"value":665,"label":"紫阳县","pvalue":20},{"value":666,"label":"岚皋县","pvalue":20},{"value":667,"label":"平利县","pvalue":20},{"value":668,"label":"镇坪县","pvalue":20},{"value":669,"label":"旬阳县","pvalue":20},{"value":670,"label":"白河县","pvalue":20},{"value":671,"label":"商洛市","pvalue":20},{"value":672,"label":"洛南县","pvalue":20},{"value":673,"label":"丹凤县","pvalue":20},{"value":674,"label":"商南县","pvalue":20},{"value":675,"label":"山阳县","pvalue":20},{"value":676,"label":"镇安县","pvalue":20},{"value":677,"label":"柞水县","pvalue":20},{"value":678,"label":"延安市","pvalue":20},{"value":679,"label":"延长县","pvalue":20},{"value":680,"label":"延川县","pvalue":20},{"value":681,"label":"子长县","pvalue":20},{"value":682,"label":"安塞县","pvalue":20},{"value":683,"label":"志丹县","pvalue":20},{"value":684,"label":"吴旗县","pvalue":20},{"value":685,"label":"甘泉县","pvalue":20},{"value":686,"label":"富县","pvalue":20},{"value":687,"label":"洛川县","pvalue":20},{"value":688,"label":"宜川县","pvalue":20},{"value":689,"label":"黄龙县","pvalue":20},{"value":690,"label":"黄陵县","pvalue":20},{"value":691,"label":"榆林市","pvalue":20},{"value":692,"label":"神木县","pvalue":20},{"value":693,"label":"府谷县","pvalue":20},{"value":694,"label":"横山县","pvalue":20},{"value":695,"label":"靖边县","pvalue":20},{"value":696,"label":"定边县","pvalue":20},{"value":697,"label":"绥德县","pvalue":20},{"value":698,"label":"米脂县","pvalue":20},{"value":699,"label":"佳县","pvalue":20},{"value":700,"label":"吴堡县","pvalue":20},{"value":701,"label":"清涧县","pvalue":20},{"value":702,"label":"子洲县","pvalue":20}]},{"value":21,"label":"吉林省","pvalue":0,"children":[{"value":1176,"label":"长春市","pvalue":21},{"value":1177,"label":"九台市","pvalue":21},{"value":1178,"label":"德惠市","pvalue":21},{"value":1179,"label":"农安县","pvalue":21},{"value":1180,"label":"榆树市","pvalue":21},{"value":1181,"label":"吉林市","pvalue":21},{"value":1182,"label":"永吉县","pvalue":21},{"value":1183,"label":"磐石市","pvalue":21},{"value":1184,"label":"蛟河市","pvalue":21},{"value":1185,"label":"桦甸市","pvalue":21},{"value":1186,"label":"舒兰市","pvalue":21},{"value":1187,"label":"四平市","pvalue":21},{"value":1188,"label":"梨树县","pvalue":21},{"value":1189,"label":"伊通县","pvalue":21},{"value":1190,"label":"双辽市","pvalue":21},{"value":1191,"label":"公主岭市","pvalue":21},{"value":1192,"label":"辽源市","pvalue":21},{"value":1193,"label":"东丰县","pvalue":21},{"value":1194,"label":"东辽县","pvalue":21},{"value":1195,"label":"通化市","pvalue":21},{"value":1196,"label":"通化县","pvalue":21},{"value":1197,"label":"辉南县","pvalue":21},{"value":1198,"label":"柳河县","pvalue":21},{"value":1199,"label":"梅河口市","pvalue":21},{"value":1200,"label":"集安市","pvalue":21},{"value":1201,"label":"白山市","pvalue":21},{"value":1202,"label":"抚松县","pvalue":21},{"value":1203,"label":"靖宇县","pvalue":21},{"value":1204,"label":"长白县","pvalue":21},{"value":1205,"label":"江源县","pvalue":21},{"value":1206,"label":"临江市","pvalue":21},{"value":1207,"label":"白城市","pvalue":21},{"value":1208,"label":"洮南市","pvalue":21},{"value":1209,"label":"大安市","pvalue":21},{"value":1210,"label":"镇赉县","pvalue":21},{"value":1211,"label":"通榆县","pvalue":21},{"value":1212,"label":"松原市","pvalue":21},{"value":1213,"label":"扶余县","pvalue":21},{"value":1214,"label":"长岭县","pvalue":21},{"value":1215,"label":"前郭县","pvalue":21},{"value":1216,"label":"乾安县","pvalue":21},{"value":1217,"label":"延吉市","pvalue":21},{"value":1218,"label":"图们市","pvalue":21},{"value":1219,"label":"敦化市","pvalue":21},{"value":1220,"label":"珲春市","pvalue":21},{"value":1221,"label":"龙井市","pvalue":21},{"value":1222,"label":"和龙市","pvalue":21},{"value":1223,"label":"汪清县","pvalue":21},{"value":1224,"label":"安图县","pvalue":21}]},{"value":22,"label":"福建省","pvalue":0,"children":[{"value":1294,"label":"福州市","pvalue":22},{"value":1295,"label":"平潭县","pvalue":22},{"value":1296,"label":"福清市","pvalue":22},{"value":1297,"label":"长乐市","pvalue":22},{"value":1298,"label":"永泰县","pvalue":22},{"value":1299,"label":"闽清县","pvalue":22},{"value":1300,"label":"罗源县","pvalue":22},{"value":1301,"label":"连江县","pvalue":22},{"value":1302,"label":"闽侯县","pvalue":22},{"value":1303,"label":"厦门市","pvalue":22},{"value":1304,"label":"莆田市","pvalue":22},{"value":1305,"label":"仙游县","pvalue":22},{"value":1306,"label":"三明市","pvalue":22},{"value":1307,"label":"明溪县","pvalue":22},{"value":1308,"label":"清流县","pvalue":22},{"value":1309,"label":"宁化县","pvalue":22},{"value":1310,"label":"大田县","pvalue":22},{"value":1311,"label":"尤溪县","pvalue":22},{"value":1312,"label":"沙县","pvalue":22},{"value":1313,"label":"将乐县","pvalue":22},{"value":1314,"label":"泰宁县","pvalue":22},{"value":1315,"label":"建宁县","pvalue":22},{"value":1316,"label":"永安市","pvalue":22},{"value":1317,"label":"泉州市","pvalue":22},{"value":1318,"label":"惠安县","pvalue":22},{"value":1319,"label":"晋江市","pvalue":22},{"value":1320,"label":"南安市","pvalue":22},{"value":1321,"label":"安溪县","pvalue":22},{"value":1322,"label":"永春县","pvalue":22},{"value":1323,"label":"德化县","pvalue":22},{"value":1324,"label":"石狮市","pvalue":22},{"value":1325,"label":"漳州市","pvalue":22},{"value":1326,"label":"龙海市","pvalue":22},{"value":1327,"label":"云霄县","pvalue":22},{"value":1328,"label":"漳浦县","pvalue":22},{"value":1329,"label":"诏安县","pvalue":22},{"value":1330,"label":"长泰县","pvalue":22},{"value":1331,"label":"东山县","pvalue":22},{"value":1332,"label":"南靖县","pvalue":22},{"value":1333,"label":"平和县","pvalue":22},{"value":1334,"label":"华安县","pvalue":22},{"value":1335,"label":"南平市","pvalue":22},{"value":1336,"label":"邵武市","pvalue":22},{"value":1337,"label":"顺昌县","pvalue":22},{"value":1338,"label":"建阳市","pvalue":22},{"value":1339,"label":"建瓯市","pvalue":22},{"value":1340,"label":"浦城县","pvalue":22},{"value":1341,"label":"光泽县","pvalue":22},{"value":1342,"label":"松溪县","pvalue":22},{"value":1343,"label":"政和县","pvalue":22},{"value":1344,"label":"武夷山市","pvalue":22},{"value":1345,"label":"宁德市","pvalue":22},{"value":1346,"label":"福鼎市","pvalue":22},{"value":1347,"label":"霞浦县","pvalue":22},{"value":1348,"label":"福安市","pvalue":22},{"value":1349,"label":"古田县","pvalue":22},{"value":1350,"label":"屏南县","pvalue":22},{"value":1351,"label":"寿宁县","pvalue":22},{"value":1352,"label":"周宁县","pvalue":22},{"value":1353,"label":"柘荣县","pvalue":22},{"value":1354,"label":"龙岩市","pvalue":22},{"value":1355,"label":"长汀县","pvalue":22},{"value":1356,"label":"永定县","pvalue":22},{"value":1357,"label":"上杭县","pvalue":22},{"value":1358,"label":"武平县","pvalue":22},{"value":1359,"label":"漳平市","pvalue":22},{"value":1360,"label":"连城县","pvalue":22}]},{"value":23,"label":"贵州省","pvalue":0,"children":[{"value":1970,"label":"贵阳市","pvalue":23},{"value":1971,"label":"清镇市","pvalue":23},{"value":1972,"label":"修文县","pvalue":23},{"value":1973,"label":"息烽县","pvalue":23},{"value":1974,"label":"开阳县","pvalue":23},{"value":1975,"label":"六盘水市","pvalue":23},{"value":1976,"label":"六枝特区","pvalue":23},{"value":1977,"label":"盘县","pvalue":23},{"value":1978,"label":"遵义市","pvalue":23},{"value":1979,"label":"遵义县","pvalue":23},{"value":1980,"label":"桐梓县","pvalue":23},{"value":1981,"label":"绥阳县","pvalue":23},{"value":1982,"label":"正安县","pvalue":23},{"value":1983,"label":"道真县","pvalue":23},{"value":1984,"label":"务川县","pvalue":23},{"value":1985,"label":"凤冈县","pvalue":23},{"value":1986,"label":"湄潭县","pvalue":23},{"value":1987,"label":"余庆县","pvalue":23},{"value":1988,"label":"仁怀市","pvalue":23},{"value":1989,"label":"赤水市","pvalue":23},{"value":1990,"label":"习水县","pvalue":23},{"value":1991,"label":"铜仁市","pvalue":23},{"value":1992,"label":"江口县","pvalue":23},{"value":1993,"label":"玉屏县","pvalue":23},{"value":1994,"label":"石阡县","pvalue":23},{"value":1995,"label":"思南县","pvalue":23},{"value":1996,"label":"印江县","pvalue":23},{"value":1997,"label":"德江县","pvalue":23},{"value":1998,"label":"沿河县","pvalue":23},{"value":1999,"label":"松桃县","pvalue":23},{"value":2000,"label":"万山特区","pvalue":23},{"value":2001,"label":"兴义市","pvalue":23},{"value":2002,"label":"兴仁县","pvalue":23},{"value":2003,"label":"普安县","pvalue":23},{"value":2004,"label":"晴隆县","pvalue":23},{"value":2005,"label":"贞丰县","pvalue":23},{"value":2006,"label":"望漠县","pvalue":23},{"value":2007,"label":"册亨县","pvalue":23},{"value":2008,"label":"安龙县","pvalue":23},{"value":2009,"label":"毕节市","pvalue":23},{"value":2010,"label":"大方县","pvalue":23},{"value":2011,"label":"黔西县","pvalue":23},{"value":2012,"label":"金沙县","pvalue":23},{"value":2013,"label":"织金县","pvalue":23},{"value":2014,"label":"纳雍县","pvalue":23},{"value":2015,"label":"威宁县","pvalue":23},{"value":2016,"label":"赫章县","pvalue":23},{"value":2017,"label":"安顺市","pvalue":23},{"value":2018,"label":"平坝县","pvalue":23},{"value":2019,"label":"普定县","pvalue":23},{"value":2020,"label":"关岭县","pvalue":23},{"value":2021,"label":"镇宁县","pvalue":23},{"value":2022,"label":"紫云县","pvalue":23},{"value":2023,"label":"凯里市","pvalue":23},{"value":2024,"label":"黄平县","pvalue":23},{"value":2025,"label":"施秉县","pvalue":23},{"value":2026,"label":"三穗县","pvalue":23},{"value":2027,"label":"镇远县","pvalue":23},{"value":2028,"label":"岑巩县","pvalue":23},{"value":2029,"label":"天柱县","pvalue":23},{"value":2030,"label":"锦屏县","pvalue":23},{"value":2031,"label":"剑河县","pvalue":23},{"value":2032,"label":"台江县","pvalue":23},{"value":2033,"label":"黎平县","pvalue":23},{"value":2034,"label":"榕江县","pvalue":23},{"value":2035,"label":"从江县","pvalue":23},{"value":2036,"label":"雷山县","pvalue":23},{"value":2037,"label":"麻江县","pvalue":23},{"value":2038,"label":"丹寨县","pvalue":23},{"value":2039,"label":"都匀市","pvalue":23},{"value":2040,"label":"荔波县","pvalue":23},{"value":2041,"label":"贵定县","pvalue":23},{"value":2042,"label":"福泉市","pvalue":23},{"value":2043,"label":"瓮安县","pvalue":23},{"value":2044,"label":"独山县","pvalue":23},{"value":2045,"label":"平塘县","pvalue":23},{"value":2046,"label":"罗甸县","pvalue":23},{"value":2047,"label":"长顺县","pvalue":23},{"value":2048,"label":"龙里县","pvalue":23},{"value":2049,"label":"惠水县","pvalue":23},{"value":2050,"label":"三都县","pvalue":23}]},{"value":24,"label":"广东省","pvalue":0,"children":[{"value":342,"label":"广州市","pvalue":24},{"value":343,"label":"增城市","pvalue":24},{"value":344,"label":"从化市","pvalue":24},{"value":345,"label":"韶关市","pvalue":24},{"value":346,"label":"曲江县","pvalue":24},{"value":347,"label":"始兴县","pvalue":24},{"value":348,"label":"南雄市","pvalue":24},{"value":349,"label":"仁化县","pvalue":24},{"value":350,"label":"乐昌市","pvalue":24},{"value":351,"label":"翁源县","pvalue":24},{"value":352,"label":"乳源县","pvalue":24},{"value":353,"label":"新丰县","pvalue":24},{"value":354,"label":"深圳市","pvalue":24},{"value":355,"label":"珠海市","pvalue":24},{"value":356,"label":"汕头市","pvalue":24},{"value":357,"label":"澄海市","pvalue":24},{"value":358,"label":"饶平县","pvalue":24},{"value":359,"label":"南澳县","pvalue":24},{"value":360,"label":"潮阳市","pvalue":24},{"value":361,"label":"揭阳市","pvalue":24},{"value":362,"label":"揭西县","pvalue":24},{"value":363,"label":"普宁市","pvalue":24},{"value":364,"label":"惠来县","pvalue":24},{"value":365,"label":"潮州市","pvalue":24},{"value":366,"label":"揭东县","pvalue":24},{"value":367,"label":"潮安营业部","pvalue":24},{"value":368,"label":"佛山市","pvalue":24},{"value":369,"label":"江门市","pvalue":24},{"value":370,"label":"台山市","pvalue":24},{"value":371,"label":"恩平市","pvalue":24},{"value":372,"label":"开平市","pvalue":24},{"value":373,"label":"鹤山市","pvalue":24},{"value":374,"label":"湛江市","pvalue":24},{"value":375,"label":"吴川市","pvalue":24},{"value":376,"label":"廉江市","pvalue":24},{"value":377,"label":"遂溪县","pvalue":24},{"value":378,"label":"雷州市","pvalue":24},{"value":379,"label":"徐闻县","pvalue":24},{"value":380,"label":"茂名市","pvalue":24},{"value":381,"label":"信宜市","pvalue":24},{"value":382,"label":"高州市","pvalue":24},{"value":383,"label":"电白县","pvalue":24},{"value":384,"label":"化州市","pvalue":24},{"value":385,"label":"肇庆市","pvalue":24},{"value":386,"label":"高要市","pvalue":24},{"value":387,"label":"四会市","pvalue":24},{"value":388,"label":"广宁县","pvalue":24},{"value":389,"label":"怀集县","pvalue":24},{"value":390,"label":"封开县","pvalue":24},{"value":391,"label":"德庆县","pvalue":24},{"value":392,"label":"云浮市","pvalue":24},{"value":393,"label":"新兴县","pvalue":24},{"value":394,"label":"郁南县","pvalue":24},{"value":395,"label":"罗定市","pvalue":24},{"value":396,"label":"惠州市","pvalue":24},{"value":397,"label":"博罗县","pvalue":24},{"value":398,"label":"惠东县","pvalue":24},{"value":399,"label":"龙门县","pvalue":24},{"value":400,"label":"大亚湾营业部","pvalue":24},{"value":401,"label":"梅州市","pvalue":24},{"value":402,"label":"大埔县","pvalue":24},{"value":403,"label":"丰顺县","pvalue":24},{"value":404,"label":"五华县","pvalue":24},{"value":405,"label":"兴宁市","pvalue":24},{"value":406,"label":"平远县","pvalue":24},{"value":407,"label":"蕉岭县","pvalue":24},{"value":408,"label":"汕尾市","pvalue":24},{"value":409,"label":"海丰县","pvalue":24},{"value":410,"label":"陆丰市","pvalue":24},{"value":411,"label":"陆河县","pvalue":24},{"value":412,"label":"河源市","pvalue":24},{"value":413,"label":"紫金县","pvalue":24},{"value":414,"label":"龙川县","pvalue":24},{"value":415,"label":"连平县","pvalue":24},{"value":416,"label":"和平县","pvalue":24},{"value":417,"label":"东源县","pvalue":24},{"value":418,"label":"阳江市","pvalue":24},{"value":419,"label":"阳西县","pvalue":24},{"value":420,"label":"阳春市","pvalue":24},{"value":421,"label":"阳东县","pvalue":24},{"value":422,"label":"清远市","pvalue":24},{"value":423,"label":"佛冈县","pvalue":24},{"value":424,"label":"英德市","pvalue":24},{"value":425,"label":"阳山县","pvalue":24},{"value":426,"label":"连州市","pvalue":24},{"value":427,"label":"连山县","pvalue":24},{"value":428,"label":"连南县","pvalue":24},{"value":429,"label":"清新县","pvalue":24},{"value":430,"label":"东莞市","pvalue":24},{"value":431,"label":"中山市","pvalue":24}]},{"value":25,"label":"青海省","pvalue":0,"children":[{"value":2208,"label":"西宁市","pvalue":25},{"value":2209,"label":"湟源县","pvalue":25},{"value":2210,"label":"湟中县","pvalue":25},{"value":2211,"label":"大通回族土族自治县","pvalue":25},{"value":2212,"label":"海东地区","pvalue":25},{"value":2213,"label":"平安县","pvalue":25},{"value":2214,"label":"民和回族土族自治县","pvalue":25},{"value":2215,"label":"乐都县","pvalue":25},{"value":2216,"label":"互助土族自治县","pvalue":25},{"value":2217,"label":"化隆回族自治县","pvalue":25},{"value":2218,"label":"循化撒拉族自治县","pvalue":25},{"value":2219,"label":"海北藏族自治州","pvalue":25},{"value":2220,"label":"门源回族自治县","pvalue":25},{"value":2221,"label":"祁连县","pvalue":25},{"value":2222,"label":"海晏县","pvalue":25},{"value":2223,"label":"刚察县","pvalue":25},{"value":2224,"label":"黄南藏族自治州","pvalue":25},{"value":2225,"label":"同仁县","pvalue":25},{"value":2226,"label":"尖扎县","pvalue":25},{"value":2227,"label":"泽库县","pvalue":25},{"value":2228,"label":"河南蒙古族自治县","pvalue":25},{"value":2229,"label":"海南藏族自治州","pvalue":25},{"value":2230,"label":"共和县","pvalue":25},{"value":2231,"label":"同德县","pvalue":25},{"value":2232,"label":"贵德县","pvalue":25},{"value":2233,"label":"兴海县","pvalue":25},{"value":2234,"label":"贵南县","pvalue":25},{"value":2235,"label":"果洛藏族自治州","pvalue":25},{"value":2236,"label":"玛沁县","pvalue":25},{"value":2237,"label":"班玛县","pvalue":25},{"value":2238,"label":"甘德县","pvalue":25},{"value":2239,"label":"达日县","pvalue":25},{"value":2240,"label":"久治县","pvalue":25},{"value":2241,"label":"玛多县","pvalue":25},{"value":2242,"label":"玉树藏族自治州","pvalue":25},{"value":2243,"label":"玉树县","pvalue":25},{"value":2244,"label":"杂多县","pvalue":25},{"value":2245,"label":"称多县","pvalue":25},{"value":2246,"label":"治多县","pvalue":25},{"value":2247,"label":"囊谦县","pvalue":25},{"value":2248,"label":"曲麻莱县","pvalue":25},{"value":2249,"label":"海西蒙古族藏族自治州","pvalue":25},{"value":2250,"label":"格尔木市","pvalue":25},{"value":2251,"label":"德令哈市","pvalue":25},{"value":2252,"label":"乌兰县","pvalue":25},{"value":2253,"label":"都兰县","pvalue":25},{"value":2254,"label":"天峻县","pvalue":25}]},{"value":26,"label":"西藏自治区","pvalue":0,"children":[{"value":2051,"label":"拉萨市","pvalue":26},{"value":2052,"label":"墨竹工卡县","pvalue":26},{"value":2053,"label":"达孜县","pvalue":26},{"value":2054,"label":"堆龙德庆县","pvalue":26},{"value":2055,"label":"曲水县","pvalue":26},{"value":2056,"label":"尼木县","pvalue":26},{"value":2057,"label":"当雄县","pvalue":26},{"value":2058,"label":"林周县","pvalue":26},{"value":2059,"label":"昌都县","pvalue":26},{"value":2060,"label":"江达县","pvalue":26},{"value":2061,"label":"贡觉县","pvalue":26},{"value":2062,"label":"类乌齐县","pvalue":26},{"value":2063,"label":"丁青县","pvalue":26},{"value":2064,"label":"察雅县","pvalue":26},{"value":2065,"label":"八宿县","pvalue":26},{"value":2066,"label":"左贡县","pvalue":26},{"value":2067,"label":"芒康县","pvalue":26},{"value":2068,"label":"洛隆县","pvalue":26},{"value":2069,"label":"边坝县","pvalue":26},{"value":2070,"label":"乃东县","pvalue":26},{"value":2071,"label":"扎囊县","pvalue":26},{"value":2072,"label":"贡嘎县","pvalue":26},{"value":2073,"label":"桑日县","pvalue":26},{"value":2074,"label":"琼结县","pvalue":26},{"value":2075,"label":"曲松县","pvalue":26},{"value":2076,"label":"措美县","pvalue":26},{"value":2077,"label":"洛扎县","pvalue":26},{"value":2078,"label":"加查县","pvalue":26},{"value":2079,"label":"隆子县","pvalue":26},{"value":2080,"label":"错那县","pvalue":26},{"value":2081,"label":"浪卡子县","pvalue":26},{"value":2082,"label":"日喀则市","pvalue":26},{"value":2083,"label":"南木林县","pvalue":26},{"value":2084,"label":"江孜县","pvalue":26},{"value":2085,"label":"定日县","pvalue":26},{"value":2086,"label":"萨迦县","pvalue":26},{"value":2087,"label":"拉孜县","pvalue":26},{"value":2088,"label":"昂仁县","pvalue":26},{"value":2089,"label":"谢通门县","pvalue":26},{"value":2090,"label":"白朗县","pvalue":26},{"value":2091,"label":"仁布县","pvalue":26},{"value":2092,"label":"康马县","pvalue":26},{"value":2093,"label":"定结县","pvalue":26},{"value":2094,"label":"仲巴县","pvalue":26},{"value":2095,"label":"亚东县","pvalue":26},{"value":2096,"label":"吉隆县","pvalue":26},{"value":2097,"label":"聂拉木县","pvalue":26},{"value":2098,"label":"萨嘎县","pvalue":26},{"value":2099,"label":"岗巴县","pvalue":26},{"value":2100,"label":"樟木口岸镇","pvalue":26},{"value":2101,"label":"那曲县","pvalue":26},{"value":2102,"label":"嘉黎县","pvalue":26},{"value":2103,"label":"比如县","pvalue":26},{"value":2104,"label":"聂荣县","pvalue":26},{"value":2105,"label":"安多县","pvalue":26},{"value":2106,"label":"申扎县","pvalue":26},{"value":2107,"label":"索县","pvalue":26},{"value":2108,"label":"班戈县","pvalue":26},{"value":2109,"label":"巴青县","pvalue":26},{"value":2110,"label":"尼玛县","pvalue":26},{"value":2111,"label":"双湖特别行政区","pvalue":26},{"value":2112,"label":"普兰县","pvalue":26},{"value":2113,"label":"札达县","pvalue":26},{"value":2114,"label":"噶尔县","pvalue":26},{"value":2115,"label":"日土县","pvalue":26},{"value":2116,"label":"革吉县","pvalue":26},{"value":2117,"label":"改则县","pvalue":26},{"value":2118,"label":"措勤县","pvalue":26},{"value":2119,"label":"林芝县","pvalue":26},{"value":2120,"label":"工布江达县","pvalue":26},{"value":2121,"label":"米林县","pvalue":26},{"value":2122,"label":"墨脱县","pvalue":26},{"value":2123,"label":"波密县","pvalue":26},{"value":2124,"label":"察隅县","pvalue":26},{"value":2125,"label":"朗县","pvalue":26}]},{"value":27,"label":"四川省","pvalue":0,"children":[{"value":432,"label":"邛崃市","pvalue":27},{"value":433,"label":"大邑县","pvalue":27},{"value":434,"label":"崇州市","pvalue":27},{"value":435,"label":"彭州市","pvalue":27},{"value":436,"label":"郫县","pvalue":27},{"value":437,"label":"双流县","pvalue":27},{"value":438,"label":"金堂县","pvalue":27},{"value":439,"label":"成都市","pvalue":27},{"value":440,"label":"都江堰市","pvalue":27},{"value":441,"label":"新津县","pvalue":27},{"value":442,"label":"蒲江县","pvalue":27},{"value":443,"label":"温江区","pvalue":27},{"value":444,"label":"新都区","pvalue":27},{"value":445,"label":"自贡市","pvalue":27},{"value":446,"label":"荣县","pvalue":27},{"value":447,"label":"富顺县","pvalue":27},{"value":448,"label":"攀枝花市","pvalue":27},{"value":449,"label":"米易县","pvalue":27},{"value":450,"label":"盐边县","pvalue":27},{"value":451,"label":"泸州市","pvalue":27},{"value":452,"label":"泸县","pvalue":27},{"value":453,"label":"合江县","pvalue":27},{"value":454,"label":"纳溪区","pvalue":27},{"value":455,"label":"叙永县","pvalue":27},{"value":456,"label":"古蔺县","pvalue":27},{"value":457,"label":"德阳市","pvalue":27},{"value":458,"label":"绵竹市","pvalue":27},{"value":459,"label":"中江县","pvalue":27},{"value":460,"label":"什邡市","pvalue":27},{"value":461,"label":"广汉市","pvalue":27},{"value":462,"label":"罗江县","pvalue":27},{"value":463,"label":"绵阳市","pvalue":27},{"value":464,"label":"三台县","pvalue":27},{"value":465,"label":"盐亭县","pvalue":27},{"value":466,"label":"安县","pvalue":27},{"value":467,"label":"梓潼县","pvalue":27},{"value":468,"label":"北川县","pvalue":27},{"value":469,"label":"平武县","pvalue":27},{"value":470,"label":"江油市","pvalue":27},{"value":471,"label":"广元市","pvalue":27},{"value":472,"label":"旺苍县","pvalue":27},{"value":473,"label":"青川县","pvalue":27},{"value":474,"label":"剑阁县","pvalue":27},{"value":475,"label":"苍溪县","pvalue":27},{"value":476,"label":"遂宁市","pvalue":27},{"value":477,"label":"蓬溪县","pvalue":27},{"value":478,"label":"射洪县","pvalue":27},{"value":479,"label":"大英县","pvalue":27},{"value":480,"label":"内江市","pvalue":27},{"value":481,"label":"乐至县","pvalue":27},{"value":482,"label":"安岳县","pvalue":27},{"value":483,"label":"威远县","pvalue":27},{"value":484,"label":"资中县","pvalue":27},{"value":485,"label":"资阳市","pvalue":27},{"value":486,"label":"简阳市","pvalue":27},{"value":487,"label":"隆昌县","pvalue":27},{"value":488,"label":"乐山市","pvalue":27},{"value":489,"label":"仁寿县","pvalue":27},{"value":490,"label":"眉山市","pvalue":27},{"value":491,"label":"犍为县","pvalue":27},{"value":492,"label":"井研县","pvalue":27},{"value":493,"label":"夹江县","pvalue":27},{"value":494,"label":"洪雅县","pvalue":27},{"value":495,"label":"彭山县","pvalue":27},{"value":496,"label":"沐川县","pvalue":27},{"value":497,"label":"青神县","pvalue":27},{"value":498,"label":"峨边县","pvalue":27},{"value":499,"label":"马边县","pvalue":27},{"value":500,"label":"峨眉山市","pvalue":27},{"value":501,"label":"丹棱县","pvalue":27},{"value":502,"label":"宜宾市","pvalue":27},{"value":503,"label":"宜宾县","pvalue":27},{"value":504,"label":"南溪县","pvalue":27},{"value":505,"label":"江安县","pvalue":27},{"value":506,"label":"长宁县","pvalue":27},{"value":507,"label":"高县","pvalue":27},{"value":508,"label":"筠连县","pvalue":27},{"value":509,"label":"珙县","pvalue":27},{"value":510,"label":"兴文县","pvalue":27},{"value":511,"label":"屏山县","pvalue":27},{"value":512,"label":"南充市","pvalue":27},{"value":513,"label":"华蓥市","pvalue":27},{"value":514,"label":"南部县","pvalue":27},{"value":515,"label":"岳池县","pvalue":27},{"value":516,"label":"营山县","pvalue":27},{"value":517,"label":"广安市","pvalue":27},{"value":518,"label":"蓬安县","pvalue":27},{"value":519,"label":"仪陇县","pvalue":27},{"value":520,"label":"武胜县","pvalue":27},{"value":521,"label":"西充县","pvalue":27},{"value":522,"label":"阆中市","pvalue":27},{"value":523,"label":"达州市","pvalue":27},{"value":524,"label":"达县","pvalue":27},{"value":525,"label":"宣汉县","pvalue":27},{"value":526,"label":"开江县","pvalue":27},{"value":527,"label":"万源市","pvalue":27},{"value":528,"label":"通江县","pvalue":27},{"value":529,"label":"南江县","pvalue":27},{"value":530,"label":"巴中市","pvalue":27},{"value":531,"label":"平昌县","pvalue":27},{"value":532,"label":"大竹县","pvalue":27},{"value":533,"label":"渠县","pvalue":27},{"value":534,"label":"邻水县","pvalue":27},{"value":535,"label":"雅安市","pvalue":27},{"value":536,"label":"名山县","pvalue":27},{"value":537,"label":"荥经县","pvalue":27},{"value":538,"label":"汉源县","pvalue":27},{"value":539,"label":"石棉县","pvalue":27},{"value":540,"label":"天全县","pvalue":27},{"value":541,"label":"芦山县","pvalue":27},{"value":542,"label":"宝兴县","pvalue":27},{"value":543,"label":"马尔康县","pvalue":27},{"value":544,"label":"汶川县","pvalue":27},{"value":545,"label":"理县","pvalue":27},{"value":546,"label":"茂县","pvalue":27},{"value":547,"label":"松潘县","pvalue":27},{"value":548,"label":"九寨沟县","pvalue":27},{"value":549,"label":"小金县","pvalue":27},{"value":550,"label":"黑水县","pvalue":27},{"value":551,"label":"壤塘县","pvalue":27},{"value":552,"label":"阿坝县","pvalue":27},{"value":553,"label":"若尔盖县","pvalue":27},{"value":554,"label":"红原县","pvalue":27},{"value":555,"label":"金川县","pvalue":27},{"value":556,"label":"康定县","pvalue":27},{"value":557,"label":"泸定县","pvalue":27},{"value":558,"label":"丹巴县","pvalue":27},{"value":559,"label":"九龙县","pvalue":27},{"value":560,"label":"雅江县","pvalue":27},{"value":561,"label":"道孚县","pvalue":27},{"value":562,"label":"炉霍县","pvalue":27},{"value":563,"label":"甘孜县","pvalue":27},{"value":564,"label":"新龙县","pvalue":27},{"value":565,"label":"德格县","pvalue":27},{"value":566,"label":"白玉县","pvalue":27},{"value":567,"label":"石渠县","pvalue":27},{"value":568,"label":"色达县","pvalue":27},{"value":569,"label":"理塘县","pvalue":27},{"value":570,"label":"巴塘县","pvalue":27},{"value":571,"label":"乡城县","pvalue":27},{"value":572,"label":"稻城县","pvalue":27},{"value":573,"label":"得荣县","pvalue":27},{"value":574,"label":"西昌市","pvalue":27},{"value":575,"label":"木里县","pvalue":27},{"value":576,"label":"盐源县","pvalue":27},{"value":577,"label":"会理县","pvalue":27},{"value":578,"label":"会东县","pvalue":27},{"value":579,"label":"宁南县","pvalue":27},{"value":580,"label":"普格县","pvalue":27},{"value":581,"label":"布拖县","pvalue":27},{"value":582,"label":"金阳县","pvalue":27},{"value":583,"label":"昭觉县","pvalue":27},{"value":584,"label":"喜德县","pvalue":27},{"value":585,"label":"冕宁县","pvalue":27},{"value":586,"label":"越西县","pvalue":27},{"value":587,"label":"甘洛县","pvalue":27},{"value":588,"label":"美姑县","pvalue":27},{"value":589,"label":"雷波县","pvalue":27},{"value":590,"label":"德昌县","pvalue":27}]},{"value":28,"label":"宁夏回族自治区","pvalue":0,"children":[{"value":591,"label":"银川市","pvalue":28},{"value":592,"label":"灵武市","pvalue":28},{"value":593,"label":"贺兰县","pvalue":28},{"value":594,"label":"永宁县","pvalue":28},{"value":595,"label":"石嘴山市","pvalue":28},{"value":596,"label":"平罗县","pvalue":28},{"value":597,"label":"吴忠市","pvalue":28},{"value":598,"label":"青铜峡市","pvalue":28},{"value":599,"label":"中卫市","pvalue":28},{"value":600,"label":"中宁县","pvalue":28},{"value":601,"label":"盐池县","pvalue":28},{"value":602,"label":"同心县","pvalue":28},{"value":603,"label":"固原市","pvalue":28},{"value":604,"label":"海原县","pvalue":28},{"value":605,"label":"西吉县","pvalue":28},{"value":606,"label":"隆德县","pvalue":28},{"value":607,"label":"泾源县","pvalue":28},{"value":608,"label":"彭阳县","pvalue":28}]},{"value":29,"label":"海南省","pvalue":0,"children":[{"value":1157,"label":"海口市","pvalue":29},{"value":1158,"label":"琼中县","pvalue":29},{"value":1159,"label":"保亭县","pvalue":29},{"value":1160,"label":"陵水县","pvalue":29},{"value":1161,"label":"乐东县","pvalue":29},{"value":1162,"label":"东方市","pvalue":29},{"value":1163,"label":"昌江县","pvalue":29},{"value":1164,"label":"白沙县","pvalue":29},{"value":1165,"label":"儋州市","pvalue":29},{"value":1166,"label":"临高县","pvalue":29},{"value":1167,"label":"澄迈县","pvalue":29},{"value":1168,"label":"屯昌县","pvalue":29},{"value":1169,"label":"定安县","pvalue":29},{"value":1170,"label":"万宁市","pvalue":29},{"value":1171,"label":"琼海市","pvalue":29},{"value":1172,"label":"文昌市","pvalue":29},{"value":1173,"label":"琼山市","pvalue":29},{"value":1174,"label":"五指山市","pvalue":29},{"value":1175,"label":"三亚市","pvalue":29}]},{"value":30,"label":"台湾","pvalue":0},{"value":31,"label":"澳门","pvalue":0},{"value":32,"label":"香港","pvalue":0},{"value":33,"label":"北京市","pvalue":0,"children":[{"value":2379,"label":"东城区","pvalue":33},{"value":2380,"label":"西城区","pvalue":33},{"value":2381,"label":"朝阳区","pvalue":33},{"value":2382,"label":"丰台区","pvalue":33},{"value":2383,"label":"石景山区","pvalue":33},{"value":2384,"label":"海淀区","pvalue":33},{"value":2385,"label":"顺义区","pvalue":33},{"value":2386,"label":"通州区","pvalue":33},{"value":2387,"label":"大兴区","pvalue":33},{"value":2388,"label":"房山区","pvalue":33},{"value":2389,"label":"门头沟区","pvalue":33},{"value":2390,"label":"昌平区","pvalue":33},{"value":2391,"label":"平谷区","pvalue":33},{"value":2392,"label":"密云区","pvalue":33},{"value":2393,"label":"怀柔区","pvalue":33},{"value":2394,"label":"延庆区","pvalue":33}]},{"value":34,"label":"湖北省","pvalue":0,"children":[{"value":266,"label":"武汉市","pvalue":34},{"value":267,"label":"黄石市","pvalue":34},{"value":268,"label":"大冶市","pvalue":34},{"value":269,"label":"十堰市","pvalue":34},{"value":270,"label":"宜昌市","pvalue":34},{"value":271,"label":"宜都市","pvalue":34},{"value":272,"label":"当阳市","pvalue":34},{"value":273,"label":"宜昌县","pvalue":34},{"value":274,"label":"枝江市","pvalue":34},{"value":275,"label":"远安县","pvalue":34},{"value":276,"label":"兴山县","pvalue":34},{"value":277,"label":"秭归县","pvalue":34},{"value":278,"label":"长阳县","pvalue":34},{"value":279,"label":"五峰县","pvalue":34},{"value":280,"label":"襄樊市","pvalue":34},{"value":281,"label":"宜城县","pvalue":34},{"value":282,"label":"南漳县","pvalue":34},{"value":283,"label":"谷城县","pvalue":34},{"value":284,"label":"保康县","pvalue":34},{"value":285,"label":"随州市","pvalue":34},{"value":286,"label":"老河口市","pvalue":34},{"value":287,"label":"枣阳市","pvalue":34},{"value":288,"label":"鄂州市","pvalue":34},{"value":289,"label":"神农架林区","pvalue":34},{"value":290,"label":"荆门市","pvalue":34},{"value":291,"label":"黄冈市","pvalue":34},{"value":292,"label":"麻城市","pvalue":34},{"value":293,"label":"武穴市","pvalue":34},{"value":294,"label":"团风县","pvalue":34},{"value":295,"label":"红安县","pvalue":34},{"value":296,"label":"罗田县","pvalue":34},{"value":297,"label":"英山县","pvalue":34},{"value":298,"label":"浠水县","pvalue":34},{"value":299,"label":"蕲春县","pvalue":34},{"value":300,"label":"黄梅县","pvalue":34},{"value":301,"label":"孝感市","pvalue":34},{"value":302,"label":"孝昌县","pvalue":34},{"value":303,"label":"应城市","pvalue":34},{"value":304,"label":"安陆市","pvalue":34},{"value":305,"label":"广水市","pvalue":34},{"value":306,"label":"大悟县","pvalue":34},{"value":307,"label":"云梦县","pvalue":34},{"value":308,"label":"汉川县","pvalue":34},{"value":309,"label":"咸宁市","pvalue":34},{"value":310,"label":"赤壁市","pvalue":34},{"value":311,"label":"嘉鱼县","pvalue":34},{"value":312,"label":"通城县","pvalue":34},{"value":313,"label":"崇阳县","pvalue":34},{"value":314,"label":"通山县","pvalue":34},{"value":315,"label":"阳新县","pvalue":34},{"value":316,"label":"荆州市","pvalue":34},{"value":317,"label":"仙桃市","pvalue":34},{"value":318,"label":"石首市","pvalue":34},{"value":319,"label":"洪湖市","pvalue":34},{"value":320,"label":"天门市","pvalue":34},{"value":321,"label":"潜江市","pvalue":34},{"value":322,"label":"松滋市","pvalue":34},{"value":323,"label":"公安县","pvalue":34},{"value":324,"label":"监利县","pvalue":34},{"value":325,"label":"钟祥市","pvalue":34},{"value":326,"label":"京山县","pvalue":34},{"value":327,"label":"沙洋县","pvalue":34},{"value":328,"label":"丹江口市","pvalue":34},{"value":329,"label":"郧县","pvalue":34},{"value":330,"label":"郧西县","pvalue":34},{"value":331,"label":"竹山县","pvalue":34},{"value":332,"label":"竹溪县","pvalue":34},{"value":333,"label":"房县","pvalue":34},{"value":334,"label":"恩施州","pvalue":34},{"value":335,"label":"利川市","pvalue":34},{"value":336,"label":"建始县","pvalue":34},{"value":337,"label":"巴东县","pvalue":34},{"value":338,"label":"宣恩县","pvalue":34},{"value":339,"label":"咸丰县","pvalue":34},{"value":340,"label":"来凤县","pvalue":34},{"value":341,"label":"鹤峰县","pvalue":34}]}];
diff --git a/subPackages/sub_online_reception/pages/chat.vue b/subPackages/sub_online_reception/pages/chat.vue
index d1887d3..c433627 100644
--- a/subPackages/sub_online_reception/pages/chat.vue
+++ b/subPackages/sub_online_reception/pages/chat.vue
@@ -323,10 +323,10 @@ import {
extractSendToUserMessageId
} from '@/api/chat.js';
import { parseMessageContent } from '../utils/messageParse.js';
-import PatientDetailPanel from '../components/PatientDetailPanel.vue';
-import MessageBubble from '../components/MessageBubble.vue';
-import ReceptionActionBar from '../components/ReceptionActionBar.vue';
-import RefuseReceptionModal from '../components/RefuseReceptionModal.vue';
+import PatientDetailPanel from '@/subPackages/sub_online_reception/components/PatientDetailPanel.vue';
+import MessageBubble from '@/subPackages/sub_online_reception/components/MessageBubble.vue';
+import ReceptionActionBar from '@/subPackages/sub_online_reception/components/ReceptionActionBar.vue';
+import RefuseReceptionModal from '@/subPackages/sub_online_reception/components/RefuseReceptionModal.vue';
import { withWxKey, ensureWxKey } from '@/utils/wxListKey.js';
import { prepareImagePath } from '@/common/js/image-compress.js';
diff --git a/subPackages/sub_platform_admin/common/businessMixin.js b/subPackages/sub_platform_admin/common/businessMixin.js
new file mode 100644
index 0000000..bf2a35c
--- /dev/null
+++ b/subPackages/sub_platform_admin/common/businessMixin.js
@@ -0,0 +1,26 @@
+import { resolveBusinessContext, pageUrl, businessPageRoot } from './context.js';
+
+export default {
+ inject: {
+ businessContext: { default: null },
+ },
+ computed: {
+ bizCtx() {
+ return resolveBusinessContext(this.businessContext);
+ },
+ bizApi() {
+ return this.bizCtx.api;
+ },
+ bizCap() {
+ return this.bizCtx.capabilities || {};
+ },
+ bizRoot() {
+ return businessPageRoot(this.bizCtx);
+ },
+ },
+ methods: {
+ bizPage(subPath) {
+ return pageUrl(this.bizCtx, subPath);
+ },
+ },
+};
diff --git a/subPackages/sub_platform_admin/common/context.js b/subPackages/sub_platform_admin/common/context.js
new file mode 100644
index 0000000..556a01c
--- /dev/null
+++ b/subPackages/sub_platform_admin/common/context.js
@@ -0,0 +1,49 @@
+import { platformAdminApi } from '@/api/businessApi.js';
+
+const BUSINESS_PACKAGE_ROOT = '/subPackages/sub_business_shared';
+const PLATFORM_HOME = '/subPackages/sub_platform_admin/home/index';
+const PLATFORM_MY = '/subPackages/sub_platform_admin/my/index';
+
+export function getPlatformAdminContext() {
+ return {
+ mode: 'platform_admin',
+ api: platformAdminApi,
+ userStorageKey: 'platform_admin_user',
+ homePath: PLATFORM_HOME,
+ myPath: PLATFORM_MY,
+ packageRoot: '/subPackages/sub_platform_admin',
+ businessPackageRoot: BUSINESS_PACKAGE_ROOT,
+ brandTitle: '平台管理工作台',
+ capabilities: {
+ canShip: true,
+ canRefund: true,
+ canStoreFilter: true,
+ canWithdraw: true,
+ canWithdrawAudit: true,
+ canWarehouse: true,
+ warehouseType: 'platform',
+ canStoreInput: true,
+ canDoctorInput: true,
+ canStoreInputAudit: true,
+ canDoctorInputAudit: true,
+ },
+ tabList: [
+ { text: '工作台', iconPath: '/static/tabbar/home.png', selectedIconPath: '/static/tabbar/home-active.png', pagePath: PLATFORM_HOME },
+ { text: '我的', iconPath: '/static/tabbar/my.png', selectedIconPath: '/static/tabbar/my-active.png', pagePath: PLATFORM_MY },
+ ],
+ };
+}
+
+export function resolveBusinessContext(injected) {
+ if (injected && injected.api) return injected;
+ if (uni.getStorageSync('loginMode') === 'platform_admin') return getPlatformAdminContext();
+ return getPlatformAdminContext();
+}
+
+export function businessPageRoot(ctx) {
+ return ctx.businessPackageRoot || ctx.packageRoot;
+}
+
+export function pageUrl(ctx, subPath) {
+ return `${businessPageRoot(ctx)}/${subPath}`;
+}
diff --git a/subPackages/sub_platform_admin/components/business-page-layout.vue b/subPackages/sub_platform_admin/components/business-page-layout.vue
new file mode 100644
index 0000000..2cdd6b5
--- /dev/null
+++ b/subPackages/sub_platform_admin/components/business-page-layout.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_platform_admin/doctor-input/audit/detail.vue b/subPackages/sub_platform_admin/doctor-input/audit/detail.vue
new file mode 100644
index 0000000..4b7ffd5
--- /dev/null
+++ b/subPackages/sub_platform_admin/doctor-input/audit/detail.vue
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/subPackages/sub_platform_admin/doctor-input/audit/index.vue b/subPackages/sub_platform_admin/doctor-input/audit/index.vue
new file mode 100644
index 0000000..40a903a
--- /dev/null
+++ b/subPackages/sub_platform_admin/doctor-input/audit/index.vue
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/subPackages/sub_platform_admin/home/index.vue b/subPackages/sub_platform_admin/home/index.vue
new file mode 100644
index 0000000..768f9eb
--- /dev/null
+++ b/subPackages/sub_platform_admin/home/index.vue
@@ -0,0 +1,340 @@
+
+
+
+
+
+
+
+
+ 平台管理工作台
+ {{ displayName }}
+ 欢迎回来,今天也要高效工作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+ {{ item.desc || '快捷进入' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_platform_admin/input/InputAuditSheet.vue b/subPackages/sub_platform_admin/input/InputAuditSheet.vue
new file mode 100644
index 0000000..b0a9acb
--- /dev/null
+++ b/subPackages/sub_platform_admin/input/InputAuditSheet.vue
@@ -0,0 +1,350 @@
+
+
+
+
+
+
+ 审核结果
+
+ 审核通过
+ 审核拒绝
+
+
+
+
+
+ ERP ID
+
+
+
+ MES ID
+
+
+
+
+ 一并审核关联医生(可选)
+
+ 全选
+ 取消全选
+
+
+ 暂无关联医生预填
+
+
+
+ ✓
+
+
+ {{ doc.name || '-' }}
+ {{ doctorMetaText(doc) }}
+ {{ doctorStatusText(doc.status) }}
+
+
+
+
+
+
+
+ 审核备注
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_platform_admin/input/InputDetailPage.vue b/subPackages/sub_platform_admin/input/InputDetailPage.vue
new file mode 100644
index 0000000..97cf58a
--- /dev/null
+++ b/subPackages/sub_platform_admin/input/InputDetailPage.vue
@@ -0,0 +1,363 @@
+
+
+ 加载中...
+ 暂无数据
+
+
+
+
+ {{ section.title }}
+
+
+ {{ field.label }}
+
+
+
+
+
+
+
+
+ {{ file.name }}
+
+ {{ fieldValue(field) }}
+
+
+
+
+
+ 关联医生
+ 暂无关联医生预填
+
+
+
+ {{ (doc.name || '?').charAt(0) }}
+
+
+ {{ doc.name || '-' }}
+ {{ doctorMetaText(doc) }}
+ {{ doctorStatusText(doc.status) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_platform_admin/input/InputListPage.vue b/subPackages/sub_platform_admin/input/InputListPage.vue
new file mode 100644
index 0000000..5458862
--- /dev/null
+++ b/subPackages/sub_platform_admin/input/InputListPage.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ statusText(item.status) }}
+
+ {{ item.mobile }} · {{ displayTime(item.created_at) }}
+
+ 暂无记录
+
+
+
+
+
+
+
diff --git a/subPackages/sub_platform_admin/my/index.vue b/subPackages/sub_platform_admin/my/index.vue
new file mode 100644
index 0000000..ef7658a
--- /dev/null
+++ b/subPackages/sub_platform_admin/my/index.vue
@@ -0,0 +1,65 @@
+
+
+
+
+ {{ avatarText }}
+
+ {{ displayName }}
+ {{ roleText }}
+
+
+
+
+
+ 退出登录
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_platform_admin/store-input/audit/detail.vue b/subPackages/sub_platform_admin/store-input/audit/detail.vue
new file mode 100644
index 0000000..57a8b5b
--- /dev/null
+++ b/subPackages/sub_platform_admin/store-input/audit/detail.vue
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/subPackages/sub_platform_admin/store-input/audit/index.vue b/subPackages/sub_platform_admin/store-input/audit/index.vue
new file mode 100644
index 0000000..966117e
--- /dev/null
+++ b/subPackages/sub_platform_admin/store-input/audit/index.vue
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/subPackages/sub_platform_admin/withdrawal/audit/index.vue b/subPackages/sub_platform_admin/withdrawal/audit/index.vue
new file mode 100644
index 0000000..b5db72e
--- /dev/null
+++ b/subPackages/sub_platform_admin/withdrawal/audit/index.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+ {{ item.userTypeText }}
+ {{ item.entityName }}
+
+ {{ item.amountText }}
+
+ 订单号:{{ item.orderNo }}
+ 申请时间:{{ item.applyTime }}
+
+ {{ item.statusText }}
+
+
+
+
+
+
+ 暂无待审核记录
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/common/businessMixin.js b/subPackages/sub_salesperson/common/businessMixin.js
new file mode 100644
index 0000000..bf2a35c
--- /dev/null
+++ b/subPackages/sub_salesperson/common/businessMixin.js
@@ -0,0 +1,26 @@
+import { resolveBusinessContext, pageUrl, businessPageRoot } from './context.js';
+
+export default {
+ inject: {
+ businessContext: { default: null },
+ },
+ computed: {
+ bizCtx() {
+ return resolveBusinessContext(this.businessContext);
+ },
+ bizApi() {
+ return this.bizCtx.api;
+ },
+ bizCap() {
+ return this.bizCtx.capabilities || {};
+ },
+ bizRoot() {
+ return businessPageRoot(this.bizCtx);
+ },
+ },
+ methods: {
+ bizPage(subPath) {
+ return pageUrl(this.bizCtx, subPath);
+ },
+ },
+};
diff --git a/subPackages/sub_salesperson/common/context.js b/subPackages/sub_salesperson/common/context.js
new file mode 100644
index 0000000..42882d3
--- /dev/null
+++ b/subPackages/sub_salesperson/common/context.js
@@ -0,0 +1,50 @@
+import { salespersonApi } from '@/api/businessApi.js';
+import { getPlatformAdminContext } from '@/subPackages/sub_business_shared/common/context.js';
+
+const BUSINESS_PACKAGE_ROOT = '/subPackages/sub_business_shared';
+const SALESPERSON_HOME = '/subPackages/sub_salesperson/home/index';
+const SALESPERSON_MY = '/subPackages/sub_salesperson/my/index';
+
+export function getSalespersonContext() {
+ return {
+ mode: 'salesperson',
+ api: salespersonApi,
+ userStorageKey: 'salesperson_user',
+ homePath: SALESPERSON_HOME,
+ myPath: SALESPERSON_MY,
+ packageRoot: '/subPackages/sub_salesperson',
+ businessPackageRoot: BUSINESS_PACKAGE_ROOT,
+ brandTitle: '业务工作台',
+ capabilities: {
+ canShip: false,
+ canRefund: false,
+ canStoreFilter: true,
+ canStoreInput: true,
+ canDoctorInput: true,
+ },
+ tabList: [
+ { text: '工作台', iconPath: '/static/tabbar/home.png', selectedIconPath: '/static/tabbar/home-active.png', pagePath: SALESPERSON_HOME },
+ { text: '我的', iconPath: '/static/tabbar/my.png', selectedIconPath: '/static/tabbar/my-active.png', pagePath: SALESPERSON_MY },
+ ],
+ };
+}
+
+/** 录入列表/详情:超管与业务员共用页面时按 loginMode 选 API */
+export function getInputBusinessContext() {
+ const mode = uni.getStorageSync('loginMode');
+ if (mode === 'platform_admin') return getPlatformAdminContext();
+ return getSalespersonContext();
+}
+
+export function resolveBusinessContext(injected) {
+ if (injected && injected.api) return injected;
+ return getInputBusinessContext();
+}
+
+export function businessPageRoot(ctx) {
+ return ctx.businessPackageRoot || ctx.packageRoot;
+}
+
+export function pageUrl(ctx, subPath) {
+ return `${businessPageRoot(ctx)}/${subPath}`;
+}
diff --git a/subPackages/sub_salesperson/common/inputDetailFields.js b/subPackages/sub_salesperson/common/inputDetailFields.js
new file mode 100644
index 0000000..7618a5d
--- /dev/null
+++ b/subPackages/sub_salesperson/common/inputDetailFields.js
@@ -0,0 +1,202 @@
+export function inputStatusText(status) {
+ const map = { 0: '待审核', 1: '审核通过', 2: '审核拒绝' }
+ return map[Number(status)] ?? '-'
+}
+
+function statusText(status) {
+ return inputStatusText(status)
+}
+
+function formatTime(ts) {
+ if (!ts) return '-'
+ const d = new Date(Number(ts) * 1000)
+ const pad = (n) => String(n).padStart(2, '0')
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`
+}
+
+function storeTypeText(type) {
+ return Number(type) === 0 ? '诊所' : '药店'
+}
+
+function clinicTypeText(type) {
+ if (Number(type) === 1) return '西医诊所'
+ if (Number(type) === 2) return '中医诊所'
+ return '未设置'
+}
+
+function doctorTypeText(type) {
+ if (Number(type) === 1) return '中医医生'
+ if (Number(type) === 2) return '西医医生'
+ return '-'
+}
+
+function signTypeText(signType) {
+ if (Number(signType) === 1) return '电子签名'
+ if (Number(signType) === 2) return '手写签名'
+ return '-'
+}
+
+function yesNoText(v) {
+ return Number(v) === 1 ? '是' : '否'
+}
+
+function regionText(info) {
+ const p = info.province?.name || ''
+ const c = info.city?.name || ''
+ return [p, c].filter(Boolean).join(' ') || '-'
+}
+
+function storeNamesText(info) {
+ const stores = info.stores
+ if (Array.isArray(stores) && stores.length) {
+ const names = stores.map((s) => s.store?.name || s.name).filter(Boolean)
+ if (names.length) return names.join('、')
+ }
+ if (info.store?.name) return info.store.name
+ return '-'
+}
+
+function promoterText(info) {
+ const u = info.promoter || info.inputUser
+ if (!u) return info.code || '-'
+ return [u.nick_name, u.code].filter(Boolean).join(' · ') || '-'
+}
+
+function bankTypeText(type) {
+ return Number(type) === 1 ? '对公' : '对私'
+}
+
+export function getStoreDetailSections() {
+ return [
+ {
+ title: '基础信息',
+ fields: [
+ { key: 'id', label: 'ID' },
+ { key: 'name', label: '门店名称' },
+ { key: 'type', label: '门店类型', format: (_, info) => storeTypeText(info.type) },
+ { key: 'clinic_type', label: '诊所类型', format: (_, info) => clinicTypeText(info.clinic_type) },
+ { key: 'contact', label: '联系人' },
+ { key: 'mobile', label: '联系电话' },
+ { key: 'region', label: '省市区', format: (_, info) => regionText(info) },
+ { key: 'position', label: '详细地址' },
+ { key: 'code', label: '业务员', format: (_, info) => promoterText(info) },
+ { key: 'is_shipping_free', label: '是否包邮', format: (_, info) => yesNoText(info.is_shipping_free) },
+ { key: 'subscribe_price_change', label: '订阅价格波动', format: (_, info) => yesNoText(info.subscribe_price_change) },
+ {
+ key: 'business_hours',
+ label: '营业时间',
+ format: (_, info) => {
+ const s = info.start_time || ''
+ const e = info.end_time || ''
+ return s && e ? `${s} - ${e}` : '-'
+ },
+ },
+ ],
+ },
+ {
+ title: '结算信息',
+ fields: [
+ { key: 'bank_type', label: '账户类型', format: (_, info) => bankTypeText(info.bank_type) },
+ { key: 'bank_user_name', label: '开户人' },
+ { key: 'bank_card', label: '银行卡号' },
+ { key: 'bank_name', label: '开户行' },
+ { key: 'bank_no', label: '银联行号' },
+ { key: 'z_buy_percent', label: '中药采购比例(%)' },
+ { key: 'z_sale_percent', label: '中药销售比例(%)' },
+ ],
+ },
+ {
+ title: '审核信息',
+ fields: [
+ { key: 'inputUser', label: '录入人', format: (_, info) => info.inputUser?.nick_name || '-' },
+ { key: 'status', label: '审核状态', format: (_, info) => statusText(info.status) },
+ { key: 'auditAdmin', label: '审核人', format: (_, info) => info.auditAdmin?.nick_name || '-', show: (info) => !!info.auditAdmin },
+ { key: 'audit_time', label: '审核时间', format: (_, info) => formatTime(info.audit_time), show: (info) => !!info.audit_time },
+ { key: 'audit_remark', label: '审核备注', show: (info) => !!info.audit_remark },
+ ],
+ },
+ {
+ title: '图片资料',
+ fields: [
+ { key: 'see_rate', label: '公章', type: 'image' },
+ { key: 'url', label: '轮播图', type: 'images' },
+ { key: 'contract_files', label: '合同文件', type: 'files' },
+ ],
+ },
+ ]
+}
+
+export function getDoctorDetailSections() {
+ return [
+ {
+ title: '基础信息',
+ fields: [
+ { key: 'id', label: 'ID' },
+ { key: 'name', label: '医生姓名' },
+ { key: 'mobile', label: '手机号' },
+ { key: 'idcard', label: '身份证' },
+ { key: 'type', label: '身份', format: (_, info) => doctorTypeText(info.type) },
+ { key: 'sign_type', label: '签名类型', format: (_, info) => signTypeText(info.sign_type) },
+ { key: 'depart', label: '科室', format: (_, info) => info.depart?.name || '-' },
+ { key: 'titleInfo', label: '职称', format: (_, info) => info.titleInfo?.name || '-' },
+ { key: 'stores', label: '关联门店', format: (_, info) => storeNamesText(info) },
+ { key: 'good_at', label: '擅长', multiline: true },
+ { key: 'intro', label: '简介', multiline: true },
+ ],
+ },
+ {
+ title: '审核信息',
+ fields: [
+ { key: 'inputUser', label: '录入人', format: (_, info) => info.inputUser?.nick_name || '-' },
+ { key: 'status', label: '审核状态', format: (_, info) => statusText(info.status) },
+ { key: 'auditAdmin', label: '审核人', format: (_, info) => info.auditAdmin?.nick_name || '-', show: (info) => !!info.auditAdmin },
+ { key: 'audit_time', label: '审核时间', format: (_, info) => formatTime(info.audit_time), show: (info) => !!info.audit_time },
+ { key: 'audit_remark', label: '审核备注', show: (info) => !!info.audit_remark },
+ ],
+ },
+ {
+ title: '证照资料',
+ fields: [
+ { key: 'avatar', label: '头像', type: 'image' },
+ { key: 'qualification', label: '资格证书', type: 'image' },
+ { key: 'practicing', label: '执业证书', type: 'image' },
+ { key: 'title', label: '职称证书', type: 'image' },
+ { key: 'card_up', label: '身份证正面', type: 'image' },
+ { key: 'card_down', label: '身份证反面', type: 'image' },
+ { key: 'sign_image', label: '签名图片', type: 'image' },
+ ],
+ },
+ ]
+}
+
+export function formatDetailFieldValue(field, info) {
+ if (field.show && !field.show(info)) return null
+ if (field.format) return field.format(field.key, info)
+ const v = info[field.key]
+ if (v == null || v === '') return '-'
+ if (Array.isArray(v) && !v.length) return null
+ return String(v)
+}
+
+export function getDetailImageUrls(field, info) {
+ const v = info[field.key]
+ if (!v) return []
+ if (field.type === 'images' && Array.isArray(v)) return v.filter(Boolean)
+ if (field.type === 'image' && typeof v === 'string') return [v]
+ return []
+}
+
+/** 门店详情关联的医生预填列表 */
+export function getLinkedDoctorInputs(info) {
+ const list = info?.doctor_inputs ?? info?.doctorInputs ?? []
+ return Array.isArray(list) ? list : []
+}
+
+export function getDetailFileLinks(field, info) {
+ const files = info[field.key]
+ if (!Array.isArray(files) || !files.length) return []
+ return files.map((f) => {
+ if (typeof f === 'string') return { url: f, name: f.split('/').pop() || '合同文件' }
+ return { url: f.file_url || f.url || '', name: f.file_name || f.name || '合同文件' }
+ }).filter((f) => f.url)
+}
diff --git a/subPackages/sub_salesperson/common/inputDraftHelpers.js b/subPackages/sub_salesperson/common/inputDraftHelpers.js
new file mode 100644
index 0000000..fac628f
--- /dev/null
+++ b/subPackages/sub_salesperson/common/inputDraftHelpers.js
@@ -0,0 +1,56 @@
+import {
+ createDefaultStoreInputForm,
+ createDefaultDoctorInputForm,
+} from '@/subPackages/sub_salesperson/common/inputFormHelpers.js'
+
+export function serializeStoreDraft(vm) {
+ return {
+ form: JSON.parse(JSON.stringify(vm.form)),
+ ui: {
+ currentStep: vm.currentStep,
+ clinicTypeIndex: vm.clinicTypeIndex,
+ bankTypeIndex: vm.bankTypeIndex,
+ },
+ }
+}
+
+export function applyStoreDraft(vm, draft) {
+ if (!draft) return
+ Object.assign(vm.form, createDefaultStoreInputForm(), draft.form || {})
+ if (!Array.isArray(vm.form.url)) vm.form.url = []
+ if (!Array.isArray(vm.form.contract_files)) vm.form.contract_files = []
+ const ui = draft.ui || {}
+ vm.currentStep = ui.currentStep != null ? ui.currentStep : 0
+ vm.clinicTypeIndex = ui.clinicTypeIndex != null ? ui.clinicTypeIndex : (Number(vm.form.clinic_type) === 1 ? 0 : 1)
+ vm.bankTypeIndex = ui.bankTypeIndex != null
+ ? ui.bankTypeIndex
+ : Math.max(0, vm.bankTypes.findIndex((b) => b.value === Number(vm.form.bank_account_type)))
+}
+
+export function applyDoctorDraft(vm, draft) {
+ if (!draft) return
+ Object.assign(vm.form, createDefaultDoctorInputForm(), draft.form || {})
+ const ui = draft.ui || {}
+ vm.selectedStoreInputIds = Array.isArray(ui.selectedStoreInputIds)
+ ? [...ui.selectedStoreInputIds]
+ : (Array.isArray(ui.selectedStoreIds) ? [...ui.selectedStoreIds] : [])
+ vm.departIndex = ui.departIndex != null ? ui.departIndex : Math.max(0, vm.departOptions.findIndex((d) => d.id === vm.form.depart_id))
+ vm.titleIndex = ui.titleIndex != null ? ui.titleIndex : Math.max(0, vm.titleOptions.findIndex((t) => t.id === vm.form.title_id))
+ vm.typeIndex = ui.typeIndex != null ? ui.typeIndex : (Number(vm.form.type) === 2 ? 1 : 0)
+ vm.signTypeIndex = ui.signTypeIndex != null ? ui.signTypeIndex : (Number(vm.form.sign_type) === 2 ? 1 : 0)
+ vm.currentStep = ui.currentStep != null ? ui.currentStep : 0
+}
+
+export function serializeDoctorDraft(vm) {
+ return {
+ form: JSON.parse(JSON.stringify(vm.form)),
+ ui: {
+ selectedStoreInputIds: [...(vm.selectedStoreInputIds || vm.selectedStoreIds || [])],
+ departIndex: vm.departIndex,
+ titleIndex: vm.titleIndex,
+ typeIndex: vm.typeIndex,
+ signTypeIndex: vm.signTypeIndex,
+ currentStep: vm.currentStep,
+ },
+ }
+}
diff --git a/subPackages/sub_salesperson/common/inputDraftStorage.js b/subPackages/sub_salesperson/common/inputDraftStorage.js
new file mode 100644
index 0000000..7ddc9aa
--- /dev/null
+++ b/subPackages/sub_salesperson/common/inputDraftStorage.js
@@ -0,0 +1,109 @@
+/**
+ * 业务员录入本地草稿(uni.setStorageSync)
+ */
+
+export const MAX_DRAFTS = 20
+
+const STORAGE_VERSION = 'v1'
+
+function readJson(key) {
+ try {
+ const raw = uni.getStorageSync(key)
+ if (!raw) return []
+ return typeof raw === 'string' ? JSON.parse(raw) : raw
+ } catch (e) {
+ return []
+ }
+}
+
+function writeJson(key, data) {
+ try {
+ uni.setStorageSync(key, JSON.stringify(data))
+ return true
+ } catch (e) {
+ return false
+ }
+}
+
+function storageUserSuffix() {
+ const user = uni.getStorageSync('salesperson_user') || {}
+ if (user.id != null && user.id !== '') return String(user.id)
+ const token = uni.getStorageSync('salesperson_token') || ''
+ if (!token) return 'anon'
+ let hash = 0
+ for (let i = 0; i < token.length; i += 1) {
+ hash = (hash * 31 + token.charCodeAt(i)) | 0
+ }
+ return 't' + Math.abs(hash)
+}
+
+function storageKey(type) {
+ return `salesperson.inputDraft.${STORAGE_VERSION}.${storageUserSuffix()}.${type}`
+}
+
+function newDraftId() {
+ return `draft_${Date.now()}_${Math.floor(Math.random() * 10000)}`
+}
+
+export function listDrafts(type) {
+ const list = readJson(storageKey(type))
+ if (!Array.isArray(list)) return []
+ return list.sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0))
+}
+
+export function getDraft(type, draftId) {
+ if (!draftId) return null
+ return listDrafts(type).find((d) => d.id === draftId) || null
+}
+
+export function removeDraft(type, draftId) {
+ const key = storageKey(type)
+ const list = listDrafts(type).filter((d) => d.id !== draftId)
+ writeJson(key, list)
+}
+
+export function saveDraft(type, { name, form, ui, draftId }) {
+ const trimmed = String(name || '').trim()
+ if (!trimmed) {
+ throw new Error('请输入草稿名称')
+ }
+ const key = storageKey(type)
+ let list = listDrafts(type)
+ const now = Math.floor(Date.now() / 1000)
+ const payload = {
+ id: draftId || newDraftId(),
+ name: trimmed,
+ updatedAt: now,
+ form: JSON.parse(JSON.stringify(form || {})),
+ ui: JSON.parse(JSON.stringify(ui || {})),
+ }
+ const idx = list.findIndex((d) => d.id === payload.id)
+ if (idx >= 0) {
+ list[idx] = payload
+ } else {
+ if (list.length >= MAX_DRAFTS) {
+ throw new Error(`最多保存 ${MAX_DRAFTS} 个草稿,请先删除旧草稿`)
+ }
+ list.push(payload)
+ }
+ const ok = writeJson(key, list)
+ if (!ok) {
+ throw new Error('保存失败,存储空间可能不足,请删除部分草稿或图片后再试')
+ }
+ return payload
+}
+
+export function formatDraftTime(ts) {
+ if (!ts) return ''
+ const d = new Date(Number(ts) * 1000)
+ const pad = (n) => String(n).padStart(2, '0')
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`
+}
+
+export function draftSummary(type, form) {
+ if (!form) return ''
+ if (type === 'store') {
+ return form.name || form.contact || form.mobile || '未填写名称'
+ }
+ return form.name || form.mobile || '未填写姓名'
+}
diff --git a/subPackages/sub_salesperson/common/inputFormHelpers.js b/subPackages/sub_salesperson/common/inputFormHelpers.js
new file mode 100644
index 0000000..ae7291a
--- /dev/null
+++ b/subPackages/sub_salesperson/common/inputFormHelpers.js
@@ -0,0 +1,195 @@
+import { prepareImagePath } from '@/common/js/image-compress.js'
+import { uploadLegacyAdminImage, uploadBusinessChatFileApi, extractUploadUrl } from '@/api/upload.js'
+
+/**
+ * 选择并上传图片(压缩 + old-admin-img 接口)
+ * @param {{ count?: number }} options count>1 时依次上传多张,返回 url 数组
+ */
+export function pickAndUploadImage(options = {}) {
+ const count = Math.min(Math.max(options.count || 1, 1), 9)
+ return new Promise((resolve, reject) => {
+ uni.chooseImage({
+ count,
+ sizeType: ['original', 'compressed'],
+ sourceType: ['album', 'camera'],
+ success: async (res) => {
+ uni.showLoading({ title: '上传中...', mask: true })
+ try {
+ const files = res.tempFiles || []
+ const paths = files.length
+ ? files.map((f) => f.path)
+ : (res.tempFilePaths || [])
+ const urls = []
+ for (const path of paths) {
+ const prepared = await prepareImagePath({
+ path,
+ size: files.find((f) => f.path === path)?.size,
+ })
+ if (!prepared) continue
+ const url = await uploadLegacyAdminImage({
+ filePath: prepared.path,
+ name: 'file',
+ })
+ urls.push(url)
+ }
+ uni.hideLoading()
+ if (!urls.length) {
+ reject(new Error('上传失败'))
+ return
+ }
+ resolve(count === 1 ? urls[0] : urls)
+ } catch (e) {
+ uni.hideLoading()
+ uni.showToast({ title: e.message || '上传失败', icon: 'none' })
+ reject(e)
+ }
+ },
+ fail: (err) => {
+ if (err && err.errMsg && err.errMsg.indexOf('cancel') !== -1) {
+ reject(new Error('cancel'))
+ return
+ }
+ reject(err)
+ },
+ })
+ })
+}
+
+function getUserDataPath() {
+ if (typeof wx !== 'undefined' && wx.env && wx.env.USER_DATA_PATH) {
+ return wx.env.USER_DATA_PATH
+ }
+ if (uni.env && uni.env.USER_DATA_PATH) {
+ return uni.env.USER_DATA_PATH
+ }
+ return ''
+}
+
+async function uploadSignFilePath(filePath) {
+ let url = null
+ try {
+ const res = await uploadBusinessChatFileApi({ filePath, name: 'file' })
+ url = extractUploadUrl(res)
+ } catch (e) {
+ // 回退与证照相同的上传接口
+ }
+ if (!url) {
+ url = await uploadLegacyAdminImage({ filePath, name: 'file' })
+ }
+ if (!url) {
+ throw new Error('上传成功但未返回地址')
+ }
+ return url
+}
+
+/**
+ * 手写签名 canvas 临时文件直传 OSS
+ * @param {string} tempFilePath canvasToTempFilePath 路径
+ */
+export function uploadSignCanvasTempPath(tempFilePath) {
+ return new Promise(async (resolve, reject) => {
+ if (!tempFilePath) {
+ reject(new Error('签名为空'))
+ return
+ }
+ uni.showLoading({ title: '上传中...', mask: true })
+ try {
+ const url = await uploadSignFilePath(tempFilePath)
+ uni.hideLoading()
+ resolve(url)
+ } catch (e) {
+ uni.hideLoading()
+ reject(e)
+ }
+ })
+}
+
+/**
+ * 手写签名板 base64 写入临时文件后上传 OSS
+ * @param {string} base64 canvas 导出的 base64(可带 data:image 前缀)
+ */
+export function uploadSignCanvasBase64(base64) {
+ return new Promise((resolve, reject) => {
+ if (!base64) {
+ reject(new Error('签名为空'))
+ return
+ }
+ const root = getUserDataPath()
+ if (!root) {
+ reject(new Error('无法获取临时目录'))
+ return
+ }
+ const fs = uni.getFileSystemManager()
+ const filePath = `${root}/sign_${Date.now()}.png`
+ const data = String(base64).replace(/^data:image\/\w+;base64,/, '')
+ fs.writeFile({
+ filePath,
+ data,
+ encoding: 'base64',
+ success: async () => {
+ uni.showLoading({ title: '上传中...', mask: true })
+ try {
+ const url = await uploadSignFilePath(filePath)
+ uni.hideLoading()
+ resolve(url)
+ } catch (e) {
+ uni.hideLoading()
+ reject(e)
+ }
+ },
+ fail: () => reject(new Error('签名临时文件写入失败')),
+ })
+ })
+}
+
+export function createDefaultStoreInputForm() {
+ return {
+ name: '',
+ contact: '',
+ mobile: '',
+ code: '',
+ position: '',
+ province_id: null,
+ city_id: null,
+ clinic_type: 2,
+ type: 0,
+ is_shipping_free: 0,
+ subscribe_price_change: 0,
+ start_time: '08:00',
+ end_time: '20:00',
+ see_rate: '',
+ url: [],
+ contract_files: [],
+ z_buy_percent: 100,
+ z_sale_percent: 100,
+ bank_user_name: '',
+ bank_card: '',
+ bank_name: '',
+ bank_no: '',
+ bank_account_type: 1,
+ address: [],
+ }
+}
+
+export function createDefaultDoctorInputForm() {
+ return {
+ name: '',
+ mobile: '',
+ idcard: '',
+ avatar: '',
+ depart_id: null,
+ title_id: null,
+ type: 1,
+ sign_type: 1,
+ good_at: '',
+ intro: '',
+ qualification: '',
+ practicing: '',
+ title: '',
+ card_up: '',
+ card_down: '',
+ sign_image: '',
+ store_id: 0,
+ store_ids: [],
+ }
+}
diff --git a/subPackages/sub_salesperson/common/inputNavigation.js b/subPackages/sub_salesperson/common/inputNavigation.js
new file mode 100644
index 0000000..2706e7e
--- /dev/null
+++ b/subPackages/sub_salesperson/common/inputNavigation.js
@@ -0,0 +1,42 @@
+import { listDrafts } from '@/subPackages/sub_salesperson/common/inputDraftStorage.js'
+
+export function resolveDoctorFormPath(bizCtx) {
+ const root = (bizCtx && bizCtx.packageRoot) || '/subPackages/sub_salesperson'
+ return `${root}/doctor-input/form`
+}
+
+export function goDoctorInputFromStore(storeInputId, bizCtx) {
+ const id = Number(storeInputId || 0)
+ if (!id) return
+ const path = resolveDoctorFormPath(bizCtx)
+ uni.navigateTo({ url: `${path}?storeInputId=${id}` })
+}
+
+export function navigateToInputForm(formPath, inputType, callbacks = {}) {
+ const drafts = listDrafts(inputType)
+ if (!drafts.length) {
+ uni.navigateTo({ url: formPath })
+ return
+ }
+ uni.showActionSheet({
+ itemList: ['空白新建', '从草稿继续…'],
+ success: (res) => {
+ if (res.tapIndex === 0) {
+ uni.navigateTo({ url: formPath })
+ } else if (res.tapIndex === 1) {
+ if (typeof callbacks.onPickDraft === 'function') {
+ callbacks.onPickDraft()
+ } else {
+ const listPath = formPath.replace('/form', '/index')
+ uni.navigateTo({ url: `${listPath}?openDraft=1` })
+ }
+ }
+ },
+ })
+}
+
+export function openDraftForm(formPath, draftId) {
+ if (!draftId) return
+ const sep = formPath.indexOf('?') >= 0 ? '&' : '?'
+ uni.navigateTo({ url: `${formPath}${sep}draftId=${encodeURIComponent(draftId)}` })
+}
diff --git a/subPackages/sub_salesperson/components/CollapsibleFilterPanel.vue b/subPackages/sub_salesperson/components/CollapsibleFilterPanel.vue
new file mode 100644
index 0000000..57976d8
--- /dev/null
+++ b/subPackages/sub_salesperson/components/CollapsibleFilterPanel.vue
@@ -0,0 +1,80 @@
+
+
+
+
+ {{ title }}
+ {{ expanded ? '收起' : '展开' }}
+
+ 清空
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/components/DepartPicker.vue b/subPackages/sub_salesperson/components/DepartPicker.vue
new file mode 100644
index 0000000..9744534
--- /dev/null
+++ b/subPackages/sub_salesperson/components/DepartPicker.vue
@@ -0,0 +1,104 @@
+
+
+
+ {{ displayLabel }}
+
+
+
+
+
+
+
+
+ 加载中...
+ {{ keyword ? '无匹配科室' : '暂无科室' }}
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/components/DrawerPageContainer.vue b/subPackages/sub_salesperson/components/DrawerPageContainer.vue
new file mode 100644
index 0000000..62f007b
--- /dev/null
+++ b/subPackages/sub_salesperson/components/DrawerPageContainer.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/components/InputDraftSheet.vue b/subPackages/sub_salesperson/components/InputDraftSheet.vue
new file mode 100644
index 0000000..25b4dbf
--- /dev/null
+++ b/subPackages/sub_salesperson/components/InputDraftSheet.vue
@@ -0,0 +1,104 @@
+
+
+
+
+
+ 暂无本地草稿
+
+
+ {{ item.name }}
+ {{ summary(item) }}
+ {{ formatTime(item.updatedAt) }}
+
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/components/InputFormLayout.vue b/subPackages/sub_salesperson/components/InputFormLayout.vue
new file mode 100644
index 0000000..a8b9377
--- /dev/null
+++ b/subPackages/sub_salesperson/components/InputFormLayout.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/components/PageStickyHeader.vue b/subPackages/sub_salesperson/components/PageStickyHeader.vue
new file mode 100644
index 0000000..42b51d5
--- /dev/null
+++ b/subPackages/sub_salesperson/components/PageStickyHeader.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/components/PromoterPicker.vue b/subPackages/sub_salesperson/components/PromoterPicker.vue
new file mode 100644
index 0000000..e347620
--- /dev/null
+++ b/subPackages/sub_salesperson/components/PromoterPicker.vue
@@ -0,0 +1,113 @@
+
+
+
+
+
+ {{ (selected.nick_name || '?').charAt(0) }}
+
+ {{ selected.nick_name || '-' }}
+ {{ selected.code }} · {{ selected.role_name }}
+
+
+ {{ placeholder }}
+
+
+
+
+
+ 加载中...
+ 暂无可选业务员
+
+
+ {{ (item.nick_name || '?').charAt(0) }}
+
+ {{ item.nick_name || '-' }}
+ {{ item.code }} · {{ item.role_name }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/components/RegionAddressPicker.vue b/subPackages/sub_salesperson/components/RegionAddressPicker.vue
new file mode 100644
index 0000000..672ec1a
--- /dev/null
+++ b/subPackages/sub_salesperson/components/RegionAddressPicker.vue
@@ -0,0 +1,196 @@
+
+
+
+ {{ displayText || placeholder }}
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }} /
+ 请选择
+
+
+
+
+ {{ isSearching ? row.label : row.node.label }}
+ ›
+
+ 无匹配结果
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/components/StoreInputPicker.vue b/subPackages/sub_salesperson/components/StoreInputPicker.vue
new file mode 100644
index 0000000..4b00755
--- /dev/null
+++ b/subPackages/sub_salesperson/components/StoreInputPicker.vue
@@ -0,0 +1,141 @@
+
+
+
+ {{ summary || placeholder }}
+
+
+
+
+
+
+ 加载中...
+ 暂无预填门店
+
+
+ {{ item.name || '-' }}
+ {{ item.status_text }}
+
+ {{ item.mobile || '-' }}
+ 已选
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/components/business-page-layout.vue b/subPackages/sub_salesperson/components/business-page-layout.vue
new file mode 100644
index 0000000..3570eac
--- /dev/null
+++ b/subPackages/sub_salesperson/components/business-page-layout.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/components/clinic-page-layout.vue b/subPackages/sub_salesperson/components/clinic-page-layout.vue
new file mode 100644
index 0000000..f8f8aab
--- /dev/null
+++ b/subPackages/sub_salesperson/components/clinic-page-layout.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/doctor-input/detail.vue b/subPackages/sub_salesperson/doctor-input/detail.vue
new file mode 100644
index 0000000..1509487
--- /dev/null
+++ b/subPackages/sub_salesperson/doctor-input/detail.vue
@@ -0,0 +1,21 @@
+
+
+
+
diff --git a/subPackages/sub_salesperson/doctor-input/form.vue b/subPackages/sub_salesperson/doctor-input/form.vue
new file mode 100644
index 0000000..5da164d
--- /dev/null
+++ b/subPackages/sub_salesperson/doctor-input/form.vue
@@ -0,0 +1,552 @@
+
+
+
+
+
+
+
+ 基础信息
+
+
+
+
+
+
+
+
+ 上传头像
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击签名
+
+
+
+
+
+
+ 上传签名图
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 证照资料
+
+ *{{ item.label }}
+
+
+
+
+ 上传
+
+
+
+
+
+
+ 确认信息
+
+ 医生姓名{{ form.name || '-' }}
+ 手机号{{ form.mobile || '-' }}
+ 关联门店{{ selectedStoreNames || '-' }}
+ 科室/职称{{ selectedDepartLabel }} / {{ selectedTitleLabel }}
+ 身份{{ selectedTypeLabel }}
+ 签名{{ form.sign_image ? '已填写' : '-' }}
+
+
+
+
+
+
+
+
+
+ 草稿名称
+
+
+ 取消
+ 保存
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/doctor-input/index.vue b/subPackages/sub_salesperson/doctor-input/index.vue
new file mode 100644
index 0000000..8599282
--- /dev/null
+++ b/subPackages/sub_salesperson/doctor-input/index.vue
@@ -0,0 +1,29 @@
+
+
+
+
diff --git a/subPackages/sub_salesperson/home/index.vue b/subPackages/sub_salesperson/home/index.vue
new file mode 100644
index 0000000..c7dcf0e
--- /dev/null
+++ b/subPackages/sub_salesperson/home/index.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+ 业务工作台
+ {{ displayName }}
+ 今日业务进度更新
+
+
+
+
+
+
+
+
+ 门店 (录/通)
+
+ {{ stats.storeCount || 0 }}
+ /
+ {{ stats.storeApprovedCount || 0 }}
+
+
+
+ 医生 (录/通)
+
+ {{ stats.doctorCount || 0 }}
+ /
+ {{ stats.doctorApprovedCount || 0 }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+ {{ item.desc || '快捷进入' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_salesperson/input/InputDetailPage.vue b/subPackages/sub_salesperson/input/InputDetailPage.vue
new file mode 100644
index 0000000..bd1197d
--- /dev/null
+++ b/subPackages/sub_salesperson/input/InputDetailPage.vue
@@ -0,0 +1,353 @@
+
+
+ 加载中...
+ 暂无数据
+
+
+
+
+ {{ section.title }}
+
+
+ {{ field.label }}
+
+
+
+
+
+
+
+
+ {{ file.name }}
+
+ {{ fieldValue(field) }}
+
+
+
+
+
+ 关联医生
+ 暂无关联医生预填
+
+
+
+ {{ (doc.name || '?').charAt(0) }}
+
+
+ {{ doc.name || '-' }}
+ {{ doctorMetaText(doc) }}
+ {{ doctorStatusText(doc.status) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/input/InputListPage.vue b/subPackages/sub_salesperson/input/InputListPage.vue
new file mode 100644
index 0000000..bb35e9d
--- /dev/null
+++ b/subPackages/sub_salesperson/input/InputListPage.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+ {{ item.name }}
+ {{ statusText(item.status) }}
+
+ {{ item.mobile }} · {{ displayTime(item.created_at) }}
+
+
+
+
+
+
+ 暂无记录
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/my/index.vue b/subPackages/sub_salesperson/my/index.vue
new file mode 100644
index 0000000..995274a
--- /dev/null
+++ b/subPackages/sub_salesperson/my/index.vue
@@ -0,0 +1,59 @@
+
+
+
+
+ {{ avatarText }}
+
+ {{ displayName }}
+ {{ roleText }}
+
+
+
+
+ 退出登录
+
+
+
+
+
+
+
+
diff --git a/subPackages/sub_salesperson/store-input/detail.vue b/subPackages/sub_salesperson/store-input/detail.vue
new file mode 100644
index 0000000..db14840
--- /dev/null
+++ b/subPackages/sub_salesperson/store-input/detail.vue
@@ -0,0 +1,22 @@
+
+
+
+
diff --git a/subPackages/sub_salesperson/store-input/form.vue b/subPackages/sub_salesperson/store-input/form.vue
new file mode 100644
index 0000000..66399c0
--- /dev/null
+++ b/subPackages/sub_salesperson/store-input/form.vue
@@ -0,0 +1,522 @@
+
+
+
+
+
+
+
+
+
+
+
+ 基础信息
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ onPickConfirm('is_shipping_free', e)">
+
+
+
+
+ onPickConfirm('subscribe_price_change', e)">
+
+
+
+
+ {{ form.start_time || '开始时间' }}
+ -
+ {{ form.end_time || '结束时间' }}
+
+ onTimeConfirm('start_time', e)">
+ onTimeConfirm('end_time', e)">
+
+
+ 地址信息
+
+
+
+
+
+
+
+
+
+
+ 图片资料
+
+
+ 公章
+
+
+
+
+ 上传公章
+
+
+
+
+
+ *轮播图
+
+
+
+
+
+
+
+
+
+ 合同文件 (已传 {{ form.contract_files.length }} 个)
+
+
+ 添加合同
+
+
+
+ 销售比例
+
+
+
+
+
+
+
+
+
+
+ 银行卡信息
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提交成功
+ {{ form.name || '门店' }} 已提交,等待审核
+
+ 录入医生
+ 返回列表
+
+
+
+
+
+
+
+
+ 草稿名称
+
+
+ 取消
+ 保存
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/subPackages/sub_salesperson/store-input/index.vue b/subPackages/sub_salesperson/store-input/index.vue
new file mode 100644
index 0000000..6def9d4
--- /dev/null
+++ b/subPackages/sub_salesperson/store-input/index.vue
@@ -0,0 +1,30 @@
+
+
+
+
diff --git a/subPackages/sub_workbench/components/qr-code-preview/build-poster.js b/subPackages/sub_workbench/components/qr-code-preview/build-poster.js
new file mode 100644
index 0000000..8564975
--- /dev/null
+++ b/subPackages/sub_workbench/components/qr-code-preview/build-poster.js
@@ -0,0 +1,267 @@
+const ROOT_WIDTH = '560rpx'
+const CARD_BG = '#F8FAFF'
+
+function cardWrapper(views) {
+ return {
+ css: { width: ROOT_WIDTH },
+ views: [{
+ type: 'view',
+ css: {
+ width: ROOT_WIDTH,
+ borderRadius: '16rpx',
+ paddingBottom: '68rpx',
+ paddingTop: '30rpx',
+ backgroundColor: CARD_BG,
+ },
+ views,
+ }],
+ }
+}
+
+/**
+ * 强化居中组件 (仅用于诊所/推广员的标题,不影响医生)
+ */
+function centerText(text, css = {}) {
+ return {
+ type: 'view',
+ css: { width: ROOT_WIDTH, textAlign: 'center', marginTop: '8rpx', ...css },
+ views: [{ type: 'text', text: text || '', css: { color: '#333', fontSize: '28rpx', textAlign: 'center', ...css } }],
+ }
+}
+
+// ----------------------------------------------------------------
+// 医生海报 - 100% 还原为你最初始的代码,未作任何更改
+// ----------------------------------------------------------------
+function buildDoctorPoster(info) {
+ const doctor = info.DoctorInfo || {}
+ const store = (info.store && info.store.store) ? info.store.store : {}
+ const depart = (doctor.depart && doctor.depart.name) ? doctor.depart.name : ''
+ const titleName = (doctor.title && doctor.title.name) ? doctor.title.name : ''
+ let sex = 1
+ if (doctor.idcard) {
+ sex = doctor.idcard.charAt(16)
+ }
+ const defaultAvatar = `/static/image/${sex % 2 === 0 ? 'nv' : 'nan'}.png`
+ const avatar = doctor.avatar || defaultAvatar
+ const qrUrl = doctor.qr_code || ''
+
+ return cardWrapper([
+ {
+ type: 'image',
+ src: avatar,
+ css: {
+ width: '180rpx',
+ height: '180rpx',
+ borderRadius: '50%',
+ marginLeft: '190rpx',
+ },
+ },
+ {
+ type: 'view',
+ css: { textAlign: 'center', marginTop: '8rpx' },
+ views: [
+ { type: 'text', text: doctor.name || '', css: { color: '#000', fontSize: '36rpx' } },
+ {
+ type: 'text',
+ text: titleName,
+ css: { color: '#1E293B', fontSize: '28rpx', paddingTop: '10rpx', marginLeft: '8rpx' },
+ },
+ ],
+ },
+ {
+ type: 'view',
+ css: { textAlign: 'center', marginTop: '8rpx' },
+ views: [
+ { type: 'text', text: store.name || '', css: { color: '#475569', fontSize: '24rpx' } },
+ { type: 'text', text: depart, css: { color: '#475569', fontSize: '24rpx', marginLeft: '10rpx' } },
+ ],
+ },
+ {
+ type: 'view',
+ css: { textAlign: 'center', marginTop: '20rpx', marginBottom: '20rpx' },
+ views: [{
+ type: 'image',
+ src: qrUrl,
+ css: { width: '388rpx', height: '388rpx' },
+ }],
+ },
+ {
+ type: 'view',
+ css: { paddingLeft: '20rpx', paddingRight: '20rpx' },
+ views: [
+ {
+ type: 'text',
+ text: '专业擅长',
+ css: { color: '#6ACDBB', fontSize: '28rpx', textAlign: 'center', marginLeft: '56rpx' },
+ },
+ {
+ type: 'text',
+ text: doctor.good_at || '',
+ css: { color: '#000', fontSize: '24rpx', marginLeft: '8rpx', marginTop: '4rpx' },
+ },
+ ],
+ },
+ ])
+}
+
+// ----------------------------------------------------------------
+// 推广员海报 - 修复文本居中、图片居中、Label同行不换行
+// ----------------------------------------------------------------
+function buildSalespersonPoster(payload) {
+ const store = (payload.qr_code && payload.qr_code.store) ? payload.qr_code.store : {}
+ const qrUrl = (payload.qr_code && payload.qr_code.qr_code) ? payload.qr_code.qr_code : ''
+ const storeName = store.name || ''
+ const position = store.position || ''
+ const nickName = payload.nick_name || ''
+
+ return cardWrapper([
+ // 店铺名居中
+ centerText(storeName, { fontSize: '36rpx', fontWeight: 'bold', marginTop: '20rpx' }),
+
+ // 诊所地址 Label 和 具体地址拆分为两行居中(支持长文本折行)
+ centerText('诊所地址:', { color: '#3a8ee6', fontSize: '24rpx', marginTop: '20rpx' }),
+ {
+ type: 'view',
+ css: { width: ROOT_WIDTH, marginTop: '8rpx' },
+ views: [
+ {
+ type: 'text',
+ text: position,
+ css: {
+ color: '#333',
+ fontSize: '24rpx',
+ textAlign: 'center',
+ width: '512rpx',
+ marginLeft: '24rpx',
+ maxLines: 2,
+ lineHeight: '36rpx'
+ }
+ }
+ ],
+ },
+
+ // 还原回初始的图片容器写法:依靠 textAlign 居中图片,不干预 width
+ {
+ type: 'view',
+ css: { textAlign: 'center', marginTop: '24rpx', marginBottom: '24rpx' },
+ views: [{
+ type: 'image',
+ src: qrUrl,
+ css: { width: '388rpx', height: '388rpx' },
+ }],
+ },
+
+ // 推广员信息:保持在同一行(不换行),整体水平居中
+ {
+ type: 'view',
+ css: { width: ROOT_WIDTH, textAlign: 'center' },
+ views: [
+ { type: 'text', text: '推广员:', css: { color: '#3a8ee6', fontSize: '24rpx', display: 'inline-block' } },
+ { type: 'text', text: nickName, css: { color: '#333', fontSize: '28rpx', display: 'inline-block' } },
+ ]
+ }
+ ])
+}
+
+// ----------------------------------------------------------------
+// 诊所管理员海报 - 修复文本居中、图片居中、地址换行
+// ----------------------------------------------------------------
+function buildClinicPoster(payload) {
+ const title = payload.title || ''
+ const address = payload.address || ''
+ const qrUrl = payload.qr_code || ''
+
+ return cardWrapper([
+ // 诊所名称居中
+ centerText(title, { fontSize: '36rpx', fontWeight: 'bold', marginTop: '20rpx' }),
+
+ // 还原回初始的图片容器写法:依靠 textAlign 居中图片
+ {
+ type: 'view',
+ css: { textAlign: 'center', marginTop: '24rpx', marginBottom: '24rpx' },
+ views: [{
+ type: 'image',
+ src: qrUrl,
+ css: { width: '388rpx', height: '388rpx' },
+ }],
+ },
+
+ // 拆分诊所地址,使其换行居中,并支持过长折行
+ centerText('诊所地址:', { color: '#3a8ee6', fontSize: '24rpx' }),
+ {
+ type: 'view',
+ css: { width: ROOT_WIDTH, marginTop: '8rpx' },
+ views: [
+ {
+ type: 'text',
+ text: address,
+ css: {
+ color: '#333',
+ fontSize: '24rpx',
+ textAlign: 'center',
+ width: '512rpx',
+ marginLeft: '24rpx',
+ maxLines: 2,
+ lineHeight: '36rpx'
+ }
+ }
+ ],
+ },
+ ])
+}
+
+export function buildQrOnlyPoster(qrUrl) {
+ return {
+ css: { width: '420rpx' },
+ views: [{
+ type: 'view',
+ css: {
+ width: '420rpx',
+ padding: '24rpx',
+ backgroundColor: '#fff',
+ borderRadius: '16rpx',
+ textAlign: 'center',
+ },
+ views: [{
+ type: 'image',
+ src: qrUrl || '',
+ css: { width: '388rpx', height: '388rpx' },
+ }],
+ }],
+ }
+}
+
+export function buildPosterBoard(type, payload) {
+ if (type === 'salesperson') {
+ return buildSalespersonPoster(payload || {})
+ }
+ if (type === 'clinic') {
+ return buildClinicPoster(payload || {})
+ }
+ const info = payload || uni.getStorageSync('doctorInfo') || {}
+ return buildDoctorPoster(info)
+}
+
+export function resolveQrImageUrl(type, payload) {
+ if (type === 'salesperson') {
+ return (payload && payload.qr_code && payload.qr_code.qr_code) ? payload.qr_code.qr_code : ''
+ }
+ if (type === 'clinic') {
+ return (payload && payload.qr_code) ? payload.qr_code : ''
+ }
+ const info = payload || uni.getStorageSync('doctorInfo') || {}
+ return (info.DoctorInfo && info.DoctorInfo.qr_code) ? info.DoctorInfo.qr_code : ''
+}
+
+export function navTitleForType(type) {
+ if (type === 'salesperson') return '推广二维码'
+ if (type === 'clinic') return '诊所二维码'
+ return '医生码'
+}
+
+export function buttonLabelsForType(type) {
+ if (type === 'clinic') {
+ return { card: '保存诊所卡片图片', qr: '保存诊所二维码图片' }
+ }
+ return { card: '二维码卡片下载', qr: '二维码下载' }
+}
\ No newline at end of file
diff --git a/subPackages/sub_workbench/prescription_v2/components/modals/ChineseMedicineModal.vue b/subPackages/sub_workbench/prescription_v2/components/modals/ChineseMedicineModal.vue
index 80077cb..43e2b9d 100644
--- a/subPackages/sub_workbench/prescription_v2/components/modals/ChineseMedicineModal.vue
+++ b/subPackages/sub_workbench/prescription_v2/components/modals/ChineseMedicineModal.vue
@@ -197,6 +197,16 @@ export default {
initialSearchKey: {
type: String,
default: ''
+ },
+ /** 挂号 ID(取价门店) */
+ registerId: {
+ type: [String, Number],
+ default: ''
+ },
+ /** 是否可查看毛利率 0/1 */
+ seeRate: {
+ type: [String, Number],
+ default: 0
}
},
data() {
@@ -322,13 +332,17 @@ export default {
this.loading = true;
try {
const storeId = uni.getStorageSync('store_id') || 11001;
- const res = await getProductListDoctorReception({
+ const params = {
store_id: storeId,
type: 1, // 中药
name: name,
page: this.page,
page_size: this.pageSize
- });
+ };
+ if (this.registerId) {
+ params.register_id = this.registerId;
+ }
+ const res = await getProductListDoctorReception(params);
if (res && (res.code === 0 || res.errcode === 0)) {
const list = res.data || res.result || [];
@@ -499,6 +513,7 @@ export default {
drug_name: drugName,
number: drug._quantity,
price: drug.price || 0,
+ buy_price: drug.buy_price ?? 0,
way_id: (drug.drug && drug.drug.way_id) || drug.way_id || 0,
select_number: 1,
_wxKey: wxKeyBase ? `sch-${wxKeyBase}` : `sch${this.selectedDrugs.length}`,
diff --git a/subPackages/sub_workbench/prescription_v2/index.vue b/subPackages/sub_workbench/prescription_v2/index.vue
index 4662d8f..f6b88e1 100644
--- a/subPackages/sub_workbench/prescription_v2/index.vue
+++ b/subPackages/sub_workbench/prescription_v2/index.vue
@@ -234,6 +234,10 @@
@longpress.stop="onTcmTagLongPress">
{{it.drug_name || it.name}}
{{String(it.number)}}{{it.unit ? it.unit.name : 'g'}}
+ 毛利率{{ getChineseItemMargin(it) }}%
@@ -349,7 +353,13 @@
- 商品计费
+
+ 商品计费
+ 毛利率 {{ grossMarginText }}%
+
¥{{totalProductCost.toFixed(2)}}
@@ -427,6 +437,8 @@
v-model="showChineseMedicineModal"
:currentDrugs="currentDrugs"
:initial-search-key="chineseModalInitialKeyword"
+ :register-id="registerId"
+ :see-rate="seeRate"
@select="handleSelectChineseDrug"
/>
@@ -582,6 +594,8 @@ export default {
isSubmitting: false,
identity: uni.getStorageSync('role'),
registerStoreInfo: null,
+ /** 是否可查看毛利率 0/1(xk-api see_rate) */
+ seeRate: 0,
sendMode: 0,
selectedStoreId: null,
registerOrderType: null,
@@ -667,6 +681,15 @@ export default {
});
return total.toFixed(2);
},
+ grossMarginText() {
+ if (this.activeCategory !== 1 || Number(this.seeRate) !== 1) {
+ return '';
+ }
+ return PrescriptionCalculator.calculateChineseTotalGrossMarginPercent(
+ this.currentDrugs,
+ this.chineseConfig.dosage
+ );
+ },
supportsCommonPrescriptionTemplate() {
return [1, 2].includes(this.activeCategory);
},
@@ -905,12 +928,50 @@ export default {
console.error('加载基础配置数据失败:', error);
}
},
- async loadRegisterStoreInfo() {
- if (!this.registerId) return;
+ getChineseItemMargin(drug) {
+ if (Number(this.seeRate) !== 1) {
+ return '';
+ }
+ return PrescriptionCalculator.calculateItemGrossMarginPercent(
+ drug.price,
+ drug.buy_price
+ );
+ },
+ async fetchStoreSeeRate() {
try {
- const res = await getCurrentStoreTypeApi({ register_id: this.registerId });
+ const storeId = uni.getStorageSync('store_id');
+ const params = {};
+ if (storeId) {
+ params.store_id = storeId;
+ }
+ if (this.registerId) {
+ params.register_id = this.registerId;
+ }
+ if (!params.store_id && !params.register_id) {
+ return;
+ }
+ const res = await getCurrentStoreTypeApi(params);
+ if (res) {
+ this.seeRate = Number(res.see_rate ?? 0);
+ }
+ } catch (error) {
+ console.error('获取毛利率权限失败:', error);
+ }
+ },
+ async loadRegisterStoreInfo() {
+ if (!this.registerId) {
+ await this.fetchStoreSeeRate();
+ return;
+ }
+ try {
+ const storeId = uni.getStorageSync('store_id');
+ const res = await getCurrentStoreTypeApi({
+ register_id: this.registerId,
+ ...(storeId ? { store_id: storeId } : {})
+ });
if (res) {
this.registerStoreInfo = res;
+ this.seeRate = Number(res.see_rate ?? 0);
if (res.is_from_transfer === 1 && res.delegate_store_id) {
this.selectedStoreId = res.delegate_store_id;
this.sendMode = 1;
@@ -1993,6 +2054,11 @@ export default {
font-size: 26rpx;
color: #00A88A;
margin-left: 12rpx;
+ }
+ .tcm-margin {
+ font-size: 22rpx;
+ color: #ff9800;
+ margin-left: 8rpx;
font-weight: bold;
}
}
diff --git a/subPackages/sub_workbench/prescription_v2/utils/prescriptionCalculator.js b/subPackages/sub_workbench/prescription_v2/utils/prescriptionCalculator.js
index ab4fc52..a685bfe 100644
--- a/subPackages/sub_workbench/prescription_v2/utils/prescriptionCalculator.js
+++ b/subPackages/sub_workbench/prescription_v2/utils/prescriptionCalculator.js
@@ -20,6 +20,77 @@ export class PrescriptionCalculator {
}, 0);
}
+ static isValidBuyPrice(value) {
+ if (value === null || value === undefined || value === '') {
+ return false;
+ }
+ const n = parseFloat(value);
+ return !Number.isNaN(n);
+ }
+
+ /**
+ * 计算中药商品供货总价(仅含有效 buy_price 的药品)
+ */
+ static calculateChineseMedicineBuyTotal(drugs, dosage = 7) {
+ if (!drugs || drugs.length === 0) {
+ return 0;
+ }
+ return drugs.reduce((sum, drug) => {
+ if (!this.isValidBuyPrice(drug.buy_price)) {
+ return sum;
+ }
+ const buyPrice = parseFloat(drug.buy_price);
+ const quantity = parseFloat(drug.number ?? drug.select_number ?? 1);
+ return sum + (buyPrice * quantity * dosage);
+ }, 0);
+ }
+
+ /**
+ * 汇总毛利率(仅商品计费;任一味缺 buy_price 返回 --)
+ */
+ static calculateChineseTotalGrossMarginPercent(drugs, dosage = 7) {
+ if (!drugs || drugs.length === 0 || dosage <= 0) {
+ return '0.00';
+ }
+ let saleTotal = 0;
+ let buyTotal = 0;
+ for (const drug of drugs) {
+ if (!this.isValidBuyPrice(drug.buy_price)) {
+ return '--';
+ }
+ const qty = parseFloat(drug.number ?? drug.select_number ?? 1);
+ const price = parseFloat(drug.price || 0);
+ const buyPrice = parseFloat(drug.buy_price);
+ saleTotal += price * qty * dosage;
+ buyTotal += buyPrice * qty * dosage;
+ }
+ return this.calculateChineseGrossMarginPercent(saleTotal, buyTotal);
+ }
+
+ /**
+ * 汇总毛利率(仅商品计费)
+ */
+ static calculateChineseGrossMarginPercent(saleTotal, buyTotal) {
+ const sale = parseFloat(saleTotal);
+ const buy = parseFloat(buyTotal);
+ if (!sale || sale <= 0) {
+ return '0.00';
+ }
+ return (((sale - buy) / sale) * 100).toFixed(2);
+ }
+
+ /**
+ * 单味药毛利率
+ */
+ static calculateItemGrossMarginPercent(price, buyPrice) {
+ const p = parseFloat(price);
+ if (!p || p <= 0 || !this.isValidBuyPrice(buyPrice)) {
+ return '--';
+ }
+ const b = parseFloat(buyPrice);
+ return (((p - b) / p) * 100).toFixed(2);
+ }
+
/**
* 计算西药商品总价
* @param {Array} drugs - 药品列表
diff --git a/subPackages/sub_workbench/workbench_code.vue b/subPackages/sub_workbench/workbench_code.vue
index 768b81c..ba6ab08 100644
--- a/subPackages/sub_workbench/workbench_code.vue
+++ b/subPackages/sub_workbench/workbench_code.vue
@@ -1,240 +1,259 @@
-
-
-
-
-
-
- 保存图片
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ labels.card || '保存卡片' }}
+
+
-
\ No newline at end of file
+.qr-only-wrap {
+ position: fixed;
+ left: -9999rpx;
+ top: 0;
+ width: 420rpx;
+ height: 420rpx;
+ opacity: 0;
+ pointer-events: none;
+}
+
+/* 底部操作区:背景透明,仅保留底部安全距离 */
+.bottom-action-panel {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ background-color: transparent; /* 背景透明 */
+ padding: 48rpx 32rpx;
+ padding-bottom: calc(48rpx + env(safe-area-inset-bottom)); /* 核心:完美适配 iPhone 底部黑条 */
+}
+
diff --git a/subPackages/sub_workbench/workbench_upInfo/index.vue b/subPackages/sub_workbench/workbench_upInfo/index.vue
index 1966377..141d64c 100644
--- a/subPackages/sub_workbench/workbench_upInfo/index.vue
+++ b/subPackages/sub_workbench/workbench_upInfo/index.vue
@@ -439,7 +439,8 @@
saveCanvas(e) {
this.showHs = false
- this.$set(this.$refs.info.form, 'write', e)
+ const base64 = typeof e === 'string' ? e : (e && e.base64)
+ if (base64) this.$set(this.$refs.info.form, 'write', base64)
},
async confirm() {
switch (parseInt(this.identity - 1)) {
diff --git a/utils/loginSession.js b/utils/loginSession.js
index 7cf7bf4..aa20953 100644
--- a/utils/loginSession.js
+++ b/utils/loginSession.js
@@ -1,116 +1,252 @@
-import { getClinicAdminMyInfo } from '@/api/clinicAdmin.js';
-import { getUserInfo } from '@/api/all.js';
-
-function applyServiceUserProfile(user) {
- if (!user || !user.id) return;
- uni.setStorageSync('loginInfo', user);
- uni.setStorageSync('role', user.role);
- uni.setStorageSync('login_id', user.id);
- uni.setStorageSync('login_status', user.status);
-}
-
-export function saveLoginSession(result) {
- if (!result) return;
-
- const token = result.token ? String(result.token).trim() : '';
-
- if (result.account_type === 'admin') {
- uni.setStorageSync('loginMode', 'clinic_admin');
- uni.setStorageSync('clinic_admin_token', token);
- uni.setStorageSync('clinic_admin_user', result.user || {});
- uni.removeStorageSync('token');
- return;
- }
-
- uni.removeStorageSync('loginMode');
- uni.removeStorageSync('clinic_admin_token');
- uni.removeStorageSync('clinic_admin_user');
- uni.setStorageSync('token', token);
-
- const user = result.user || {};
- const storeDoctor = result.store_doctor || {};
- uni.setStorageSync('identity', user.role);
- uni.setStorageSync('logInfo', user);
- uni.setStorageSync('store_id', storeDoctor.store_id || '11001');
- if (user.id) {
- uni.setStorageSync('doctor_id', user.id);
- uni.setStorageSync('user_id', user.id);
- }
-}
-
-export async function fetchProfileAfterLogin(result) {
- if (result.account_type === 'admin') {
- const wrap = await getClinicAdminMyInfo();
- if (wrap && wrap.ok) {
- uni.setStorageSync('clinic_admin_user', wrap.data);
- }
- return;
- }
-
- if (result.user && result.user.id) {
- applyServiceUserProfile(result.user);
- return;
- }
-
- const data = {
- store_id: uni.getStorageSync('store_id') || '11001',
- };
- const res = await getUserInfo(data);
- if (res && res.errcode != -1) {
- applyServiceUserProfile(res.data);
- }
-}
-
-export function navigateAfterLogin(result) {
- const hint = result.redirect_hint;
- const role = Number(result.role || 0);
- const status = Number(result.status ?? result.user?.status ?? 0);
-
- if (result.account_type === 'admin' || hint === 'clinic_admin_home') {
- uni.reLaunch({ url: '/subPackages/sub_clinic_admin/home/index' });
- return;
- }
-
- if (hint === 'complete_profile' || status === 0) {
- uni.showToast({ title: '您还没有完善信息,请先完善信息', icon: 'none' });
- setTimeout(() => {
- uni.navigateTo({ url: '/subPackages/sub_workbench/workbench_upInfo/index' });
- }, 600);
- return;
- }
-
- if (hint === 'examine' || status === 1) {
- uni.showToast({ title: '您的账号还在审核中', icon: 'none' });
- setTimeout(() => {
- uni.reLaunch({ url: '/pages/workbench/examine' });
- }, 600);
- return;
- }
-
- if (status === 3) {
- setTimeout(() => {
- uni.reLaunch({ url: '/pages/workbench/examine' });
- }, 600);
- return;
- }
-
- if (hint === 'pharmacist_home' || role === 2) {
- setTimeout(() => {
- uni.reLaunch({ url: '/pages/pharmacist/index' });
- }, 400);
- return;
- }
-
- setTimeout(() => {
- uni.reLaunch({ url: '/pages/workbench/index' });
- }, 400);
-}
-
-export function clearLoginStorage() {
- uni.removeStorageSync('token');
- uni.removeStorageSync('clinic_admin_token');
- uni.removeStorageSync('clinic_admin_user');
- uni.removeStorageSync('loginMode');
- uni.removeStorageSync('loginInfo');
- uni.removeStorageSync('logInfo');
-}
+import { getClinicAdminMyInfo } from '@/api/clinicAdmin.js';
+import { getClinicSalespersonMyInfo } from '@/api/clinicSalesperson.js';
+import { getPlatformAdminMyInfo } from '@/api/platformAdmin.js';
+import { getSalespersonMyInfo } from '@/api/salesperson.js';
+import { getUserInfo } from '@/api/all.js';
+
+const ADMIN_HOME = {
+ platform_admin: '/subPackages/sub_platform_admin/home/index',
+ salesperson: '/subPackages/sub_salesperson/home/index',
+ clinic_salesperson: '/subPackages/sub_clinic_salesperson/home/index',
+ clinic_admin: '/subPackages/sub_clinic_admin/home/index',
+};
+
+const ADMIN_TOKEN_KEYS = {
+ platform_admin: 'platform_admin_token',
+ salesperson: 'salesperson_token',
+ clinic_salesperson: 'clinic_salesperson_token',
+ clinic_admin: 'clinic_admin_token',
+};
+
+function applyServiceUserProfile(user) {
+ if (!user || !user.id) return;
+ uni.setStorageSync('loginInfo', user);
+ uni.setStorageSync('role', user.role);
+ uni.setStorageSync('login_id', user.id);
+ uni.setStorageSync('login_status', user.status);
+}
+
+function clearBusinessAdminStorage() {
+ uni.removeStorageSync('clinic_admin_token');
+ uni.removeStorageSync('clinic_admin_user');
+ uni.removeStorageSync('platform_admin_token');
+ uni.removeStorageSync('platform_admin_user');
+ uni.removeStorageSync('salesperson_token');
+ uni.removeStorageSync('salesperson_user');
+ uni.removeStorageSync('clinic_salesperson_token');
+ uni.removeStorageSync('clinic_salesperson_user');
+}
+
+function clearServiceUserStorage() {
+ uni.removeStorageSync('token');
+ uni.removeStorageSync('loginInfo');
+ uni.removeStorageSync('logInfo');
+ uni.removeStorageSync('identity');
+ uni.removeStorageSync('role');
+ uni.removeStorageSync('store_id');
+ uni.removeStorageSync('doctor_id');
+ uni.removeStorageSync('user_id');
+ uni.removeStorageSync('login_id');
+ uni.removeStorageSync('login_status');
+ uni.removeStorageSync('doctorInfo');
+}
+
+/** 清除全部登录态(医生/药师 + 各角色管理员) */
+export function clearAllLoginStorage() {
+ clearBusinessAdminStorage();
+ clearServiceUserStorage();
+ uni.removeStorageSync('loginMode');
+ uni.removeStorageSync('qr_preview_payload');
+}
+
+function inferLoginMode() {
+ const stored = uni.getStorageSync('loginMode');
+ if (stored && ADMIN_TOKEN_KEYS[stored] && uni.getStorageSync(ADMIN_TOKEN_KEYS[stored])) {
+ return stored;
+ }
+ const modes = ['platform_admin', 'salesperson', 'clinic_salesperson', 'clinic_admin'];
+ for (let i = 0; i < modes.length; i++) {
+ const mode = modes[i];
+ if (uni.getStorageSync(ADMIN_TOKEN_KEYS[mode])) {
+ return mode;
+ }
+ }
+ return '';
+}
+
+/** 已登录时返回应跳转的首页,否则 null */
+export function resolveLoggedInTarget() {
+ const mode = inferLoginMode();
+ if (mode && ADMIN_HOME[mode]) {
+ return { url: ADMIN_HOME[mode] };
+ }
+ const token = uni.getStorageSync('token');
+ if (!token) return null;
+ const role = Number(uni.getStorageSync('identity') || uni.getStorageSync('role') || 0);
+ if (role === 2) {
+ return { url: '/pages/pharmacist/index' };
+ }
+ return { url: '/pages/workbench/index' };
+}
+
+export function redirectIfLoggedIn() {
+ const target = resolveLoggedInTarget();
+ if (target && target.url) {
+ uni.reLaunch({ url: target.url });
+ return true;
+ }
+ return false;
+}
+
+export function saveLoginSession(result) {
+ if (!result) return;
+
+ clearAllLoginStorage();
+
+ const token = result.token ? String(result.token).trim() : '';
+ const hint = result.redirect_hint || '';
+
+ if (result.account_type === 'admin') {
+ if (hint === 'platform_admin_home') {
+ uni.setStorageSync('loginMode', 'platform_admin');
+ uni.setStorageSync('platform_admin_token', token);
+ uni.setStorageSync('platform_admin_user', result.user || {});
+ return;
+ }
+ if (hint === 'salesperson_home') {
+ uni.setStorageSync('loginMode', 'salesperson');
+ uni.setStorageSync('salesperson_token', token);
+ uni.setStorageSync('salesperson_user', result.user || {});
+ return;
+ }
+ if (hint === 'clinic_salesperson_home') {
+ uni.setStorageSync('loginMode', 'clinic_salesperson');
+ uni.setStorageSync('clinic_salesperson_token', token);
+ uni.setStorageSync('clinic_salesperson_user', result.user || {});
+ return;
+ }
+ uni.setStorageSync('loginMode', 'clinic_admin');
+ uni.setStorageSync('clinic_admin_token', token);
+ uni.setStorageSync('clinic_admin_user', result.user || {});
+ return;
+ }
+
+ uni.setStorageSync('token', token);
+
+ const user = result.user || {};
+ const storeDoctor = result.store_doctor || {};
+ uni.setStorageSync('identity', user.role);
+ uni.setStorageSync('logInfo', user);
+ uni.setStorageSync('store_id', storeDoctor.store_id || '11001');
+ if (user.id) {
+ uni.setStorageSync('doctor_id', user.id);
+ uni.setStorageSync('user_id', user.id);
+ }
+}
+
+export async function fetchProfileAfterLogin(result) {
+ if (result.account_type === 'admin') {
+ const hint = result.redirect_hint || '';
+ if (hint === 'platform_admin_home') {
+ const wrap = await getPlatformAdminMyInfo();
+ if (wrap && wrap.ok) {
+ uni.setStorageSync('platform_admin_user', wrap.data);
+ }
+ return;
+ }
+ if (hint === 'salesperson_home') {
+ const wrap = await getSalespersonMyInfo();
+ if (wrap && wrap.ok) {
+ uni.setStorageSync('salesperson_user', wrap.data);
+ }
+ return;
+ }
+ if (hint === 'clinic_salesperson_home') {
+ const wrap = await getClinicSalespersonMyInfo();
+ if (wrap && wrap.ok) {
+ uni.setStorageSync('clinic_salesperson_user', wrap.data);
+ }
+ return;
+ }
+ const wrap = await getClinicAdminMyInfo();
+ if (wrap && wrap.ok) {
+ uni.setStorageSync('clinic_admin_user', wrap.data);
+ }
+ return;
+ }
+
+ if (result.user && result.user.id) {
+ applyServiceUserProfile(result.user);
+ return;
+ }
+
+ const data = {
+ store_id: uni.getStorageSync('store_id') || '11001',
+ };
+ const res = await getUserInfo(data);
+ if (res && res.errcode != -1) {
+ applyServiceUserProfile(res.data);
+ }
+}
+
+export function navigateAfterLogin(result) {
+ const hint = result.redirect_hint;
+ const role = Number(result.role || 0);
+ const status = Number(result.status ?? result.user?.status ?? 0);
+
+ if (hint === 'platform_admin_home') {
+ uni.reLaunch({ url: '/subPackages/sub_platform_admin/home/index' });
+ return;
+ }
+ if (hint === 'salesperson_home') {
+ uni.reLaunch({ url: '/subPackages/sub_salesperson/home/index' });
+ return;
+ }
+ if (hint === 'clinic_salesperson_home') {
+ uni.reLaunch({ url: '/subPackages/sub_clinic_salesperson/home/index' });
+ return;
+ }
+ if (result.account_type === 'admin' || hint === 'clinic_admin_home') {
+ uni.reLaunch({ url: '/subPackages/sub_clinic_admin/home/index' });
+ return;
+ }
+
+ if (hint === 'complete_profile' || status === 0) {
+ uni.showToast({ title: '您还没有完善信息,请先完善信息', icon: 'none' });
+ setTimeout(() => {
+ uni.navigateTo({ url: '/subPackages/sub_workbench/workbench_upInfo/index' });
+ }, 600);
+ return;
+ }
+
+ if (hint === 'examine' || status === 1) {
+ uni.showToast({ title: '您的账号还在审核中', icon: 'none' });
+ setTimeout(() => {
+ uni.reLaunch({ url: '/pages/workbench/examine' });
+ }, 600);
+ return;
+ }
+
+ if (status === 3) {
+ setTimeout(() => {
+ uni.reLaunch({ url: '/pages/workbench/examine' });
+ }, 600);
+ return;
+ }
+
+ if (hint === 'pharmacist_home' || role === 2) {
+ setTimeout(() => {
+ uni.reLaunch({ url: '/pages/pharmacist/index' });
+ }, 400);
+ return;
+ }
+
+ setTimeout(() => {
+ uni.reLaunch({ url: '/pages/workbench/index' });
+ }, 400);
+}
+
+export function clearLoginStorage() {
+ clearAllLoginStorage();
+ uni.$emit('user-logout');
+}
diff --git a/utils/qrCodePreview.js b/utils/qrCodePreview.js
new file mode 100644
index 0000000..4705eac
--- /dev/null
+++ b/utils/qrCodePreview.js
@@ -0,0 +1,54 @@
+const PAGE_PATH = '/subPackages/sub_workbench/workbench_code'
+const STORAGE_KEY = 'qr_preview_payload'
+
+/**
+ * 打开通用二维码预览页(与 PC SalespersonQrCodePreview / QrCodePreview 传参对齐)
+ * @param {{ type?: string, payload?: object, title?: string }} options
+ */
+export function openQrCodePreview(options = {}) {
+ const type = options.type || 'doctor'
+ const payload = options.payload != null ? options.payload : {}
+ uni.setStorageSync(STORAGE_KEY, {
+ type,
+ payload,
+ title: options.title || '',
+ })
+ uni.navigateTo({
+ url: `${PAGE_PATH}?type=${encodeURIComponent(type)}`,
+ })
+}
+
+export function consumeQrPreviewPayload() {
+ const raw = uni.getStorageSync(STORAGE_KEY)
+ uni.removeStorageSync(STORAGE_KEY)
+ return raw || null
+}
+
+export function buildSalespersonQrPayload(info) {
+ if (!info) return { type: 'salesperson', payload: {} }
+ return {
+ type: 'salesperson',
+ payload: {
+ nick_name: (info.salesperson && info.salesperson.nick_name) ? info.salesperson.nick_name : '',
+ qr_code: {
+ qr_code: info.qr_code || '',
+ store: info.store || {},
+ },
+ },
+ }
+}
+
+export function buildClinicQrPayload(store) {
+ if (!store) return { type: 'clinic', payload: {} }
+ const province = (store.province && store.province.name) ? store.province.name : ''
+ const city = (store.city && store.city.name) ? store.city.name : ''
+ const position = store.position || ''
+ return {
+ type: 'clinic',
+ payload: {
+ title: store.name || '',
+ address: `${province}${city}${position}`,
+ qr_code: store.qr_code || '',
+ },
+ }
+}