| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456 |
- /**
- * 省市区管理API接口系统
- * 支持省市区数据的增删改查、层级管理
- */
- class LocationApiService {
- constructor() {
- this.listeners = []; // 数据变化监听器
- this.initLocationData();
- }
- // 初始化省市区数据
- initLocationData() {
- const locations = this.getAllLocations();
- if (locations.length === 0) {
- const sampleLocations = [
- // 省份
- {
- id: 'province_001',
- name: '北京市',
- code: '110000',
- level: 'province',
- parentId: null,
- sort: 1,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- },
- {
- id: 'province_002',
- name: '上海市',
- code: '310000',
- level: 'province',
- parentId: null,
- sort: 2,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- },
- {
- id: 'province_003',
- name: '广东省',
- code: '440000',
- level: 'province',
- parentId: null,
- sort: 3,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- },
- // 城市
- {
- id: 'city_001',
- name: '北京市',
- code: '110100',
- level: 'city',
- parentId: 'province_001',
- sort: 1,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- },
- {
- id: 'city_002',
- name: '上海市',
- code: '310100',
- level: 'city',
- parentId: 'province_002',
- sort: 1,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- },
- {
- id: 'city_003',
- name: '广州市',
- code: '440100',
- level: 'city',
- parentId: 'province_003',
- sort: 1,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- },
- {
- id: 'city_004',
- name: '深圳市',
- code: '440300',
- level: 'city',
- parentId: 'province_003',
- sort: 2,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- },
- // 区县
- {
- id: 'district_001',
- name: '朝阳区',
- code: '110105',
- level: 'district',
- parentId: 'city_001',
- sort: 1,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- },
- {
- id: 'district_002',
- name: '海淀区',
- code: '110108',
- level: 'district',
- parentId: 'city_001',
- sort: 2,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- },
- {
- id: 'district_003',
- name: '东城区',
- code: '110101',
- level: 'district',
- parentId: 'city_001',
- sort: 3,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- },
- {
- id: 'district_004',
- name: '黄浦区',
- code: '310101',
- level: 'district',
- parentId: 'city_002',
- sort: 1,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- },
- {
- id: 'district_005',
- name: '浦东新区',
- code: '310115',
- level: 'district',
- parentId: 'city_002',
- sort: 2,
- status: 'active',
- createTime: '2024-01-15 10:00:00',
- updateTime: '2024-01-15 10:00:00'
- }
- ];
- this.saveLocations(sampleLocations);
- }
- }
- // 获取所有地区
- getAllLocations() {
- try {
- return wx.getStorageSync('locations') || [];
- } catch (error) {
- console.error('获取地区数据失败:', error);
- return [];
- }
- }
- // 保存地区数据
- saveLocations(locations) {
- try {
- wx.setStorageSync('locations', locations);
- this.notifyListeners(locations);
- return true;
- } catch (error) {
- console.error('保存地区数据失败:', error);
- return false;
- }
- }
- // 根据ID获取地区
- getLocationById(locationId) {
- const locations = this.getAllLocations();
- return locations.find(location => location.id === locationId);
- }
- // 根据层级获取地区
- getLocationsByLevel(level) {
- const locations = this.getAllLocations();
- return locations.filter(location => location.level === level);
- }
- // 根据父级ID获取子地区
- getLocationsByParentId(parentId) {
- const locations = this.getAllLocations();
- return locations.filter(location => location.parentId === parentId);
- }
- // 获取省份列表
- getProvinces() {
- return this.getLocationsByLevel('province');
- }
- // 获取城市列表
- getCities(provinceId = null) {
- if (provinceId) {
- return this.getLocationsByParentId(provinceId);
- }
- return this.getLocationsByLevel('city');
- }
- // 获取区县列表
- getDistricts(cityId = null) {
- if (cityId) {
- return this.getLocationsByParentId(cityId);
- }
- return this.getLocationsByLevel('district');
- }
- // 创建地区
- createLocation(locationData) {
- const locations = this.getAllLocations();
- const newLocation = {
- ...locationData,
- id: this.generateLocationId(locationData.level),
- createTime: new Date().toISOString().replace('T', ' ').substring(0, 19),
- updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19),
- status: locationData.status || 'active'
- };
-
- locations.push(newLocation);
- this.saveLocations(locations);
- return newLocation;
- }
- // 更新地区
- updateLocation(locationId, updateData) {
- const locations = this.getAllLocations();
- const locationIndex = locations.findIndex(location => location.id === locationId);
-
- if (locationIndex === -1) {
- throw new Error('地区不存在');
- }
- locations[locationIndex] = {
- ...locations[locationIndex],
- ...updateData,
- updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19)
- };
- this.saveLocations(locations);
- return locations[locationIndex];
- }
- // 删除地区
- deleteLocation(locationId) {
- const locations = this.getAllLocations();
-
- // 检查是否有子地区
- const children = this.getLocationsByParentId(locationId);
- if (children.length > 0) {
- throw new Error('该地区下还有子地区,无法删除');
- }
- const filteredLocations = locations.filter(location => location.id !== locationId);
-
- if (filteredLocations.length === locations.length) {
- throw new Error('地区不存在');
- }
- this.saveLocations(filteredLocations);
- return true;
- }
- // 搜索地区
- searchLocations(searchParams) {
- const locations = this.getAllLocations();
- let filteredLocations = [...locations];
- // 按名称搜索
- if (searchParams.name) {
- filteredLocations = filteredLocations.filter(location =>
- location.name.includes(searchParams.name)
- );
- }
- // 按层级搜索
- if (searchParams.level) {
- filteredLocations = filteredLocations.filter(location =>
- location.level === searchParams.level
- );
- }
- // 按父级ID搜索
- if (searchParams.parentId) {
- filteredLocations = filteredLocations.filter(location =>
- location.parentId === searchParams.parentId
- );
- }
- // 按状态搜索
- if (searchParams.status) {
- filteredLocations = filteredLocations.filter(location =>
- location.status === searchParams.status
- );
- }
- // 排序
- const sortBy = searchParams.sortBy || 'sort';
- const sortOrder = searchParams.sortOrder || 'asc';
-
- filteredLocations.sort((a, b) => {
- let aValue = a[sortBy];
- let bValue = b[sortBy];
-
- if (sortOrder === 'asc') {
- return aValue > bValue ? 1 : -1;
- } else {
- return aValue < bValue ? 1 : -1;
- }
- });
- return {
- locations: filteredLocations,
- total: filteredLocations.length,
- page: searchParams.page || 1,
- pageSize: searchParams.pageSize || 20
- };
- }
- // 获取地区统计信息
- getLocationStatistics() {
- const locations = this.getAllLocations();
-
- const stats = {
- total: locations.length,
- byLevel: {},
- byStatus: {},
- byParent: {}
- };
- locations.forEach(location => {
- // 按层级统计
- stats.byLevel[location.level] = (stats.byLevel[location.level] || 0) + 1;
-
- // 按状态统计
- stats.byStatus[location.status] = (stats.byStatus[location.status] || 0) + 1;
-
- // 按父级统计
- if (location.parentId) {
- stats.byParent[location.parentId] = (stats.byParent[location.parentId] || 0) + 1;
- }
- });
- return stats;
- }
- // 批量更新地区状态
- batchUpdateLocationStatus(locationIds, status) {
- const locations = this.getAllLocations();
- const updatedLocations = locations.map(location => {
- if (locationIds.includes(location.id)) {
- return {
- ...location,
- status,
- updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19)
- };
- }
- return location;
- });
- this.saveLocations(updatedLocations);
- return true;
- }
- // 获取地区树形结构
- getLocationTree() {
- const locations = this.getAllLocations();
- const tree = [];
- const locationMap = {};
- // 创建地区映射
- locations.forEach(location => {
- locationMap[location.id] = { ...location, children: [] };
- });
- // 构建树形结构
- locations.forEach(location => {
- if (location.parentId) {
- if (locationMap[location.parentId]) {
- locationMap[location.parentId].children.push(locationMap[location.id]);
- }
- } else {
- tree.push(locationMap[location.id]);
- }
- });
- return tree;
- }
- // 导出地区数据
- exportLocations(searchParams = {}) {
- const result = this.searchLocations(searchParams);
- return {
- locations: result.locations,
- exportTime: new Date().toISOString(),
- total: result.total,
- searchParams
- };
- }
- // 生成地区ID
- generateLocationId(level) {
- const timestamp = Date.now();
- const random = Math.floor(Math.random() * 1000).toString().padStart(3, '0');
- const levelPrefix = {
- 'province': 'province',
- 'city': 'city',
- 'district': 'district'
- };
- return `${levelPrefix[level]}_${timestamp}_${random}`;
- }
- // 监听器管理
- addListener(callback) {
- this.listeners.push(callback);
- }
- removeListener(callback) {
- const index = this.listeners.indexOf(callback);
- if (index > -1) {
- this.listeners.splice(index, 1);
- }
- }
- notifyListeners(locations) {
- this.listeners.forEach(callback => {
- try {
- callback(locations);
- } catch (error) {
- console.error('地区数据监听器回调执行失败:', error);
- }
- });
- }
- // 同步地区数据
- syncLocationData() {
- const locations = this.getAllLocations();
- this.notifyListeners(locations);
- return locations;
- }
- }
- // 创建单例实例
- const locationApiService = new LocationApiService();
- export default locationApiService;
|