From b6bd32430b1663eb5e454c18ceaa941a85901078 Mon Sep 17 00:00:00 2001 From: qsh <> Date: Mon, 24 Jun 2024 23:28:56 +0800 Subject: [PATCH 01/25] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/Basic/GeneralSet/Comp/BSClue.vue | 2 +- src/views/Clue/Order/Comp/MallOrderList.vue | 10 +++++++++- src/views/Clue/Order/Comp/OrderList.vue | 10 +++++++++- src/views/Clue/Pool/index.vue | 2 +- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/views/Basic/GeneralSet/Comp/BSClue.vue b/src/views/Basic/GeneralSet/Comp/BSClue.vue index 8a2b1c5..7ca45c9 100644 --- a/src/views/Basic/GeneralSet/Comp/BSClue.vue +++ b/src/views/Basic/GeneralSet/Comp/BSClue.vue @@ -10,7 +10,7 @@ Date: Tue, 25 Jun 2024 16:58:37 +0800 Subject: [PATCH 02/25] =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/school/place/index.js | 2 +- src/components/Form/src/Form.vue | 1 + src/views/Clue/Order/Comp/MallOrderList.vue | 2 +- src/views/Clue/Order/Comp/OrderList.vue | 19 ++++++++++++++- src/views/Clue/Set/Comp/GeneralSet.vue | 9 ++++++- src/views/Clue/Set/index.vue | 6 ++++- src/views/SchoolManagement/Place/index.vue | 26 +++++++++++++++------ 7 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/api/school/place/index.js b/src/api/school/place/index.js index 6e61327..f0c1dec 100644 --- a/src/api/school/place/index.js +++ b/src/api/school/place/index.js @@ -35,5 +35,5 @@ export const updatePlaceStatus = async (id, status) => { id, status } - return request.put({ url: '/admin-api/crm/sch-place/update-status', data: data }) + return request.put({ url: '/admin-api/crm/sch-place/status/update', data: data }) } diff --git a/src/components/Form/src/Form.vue b/src/components/Form/src/Form.vue index f78267d..d3a00bf 100644 --- a/src/components/Form/src/Form.vue +++ b/src/components/Form/src/Form.vue @@ -233,6 +233,7 @@ export default defineComponent({ vModel={formModel.value[item.field]} {...(autoSetPlaceholder && setTextPlaceholder(item))} {...setComponentProps(item)} + filterable format={item.component == 'DatePicker' ? 'YYYY-MM-DD' : null} value-format={item.component == 'DatePicker' ? 'YYYY-MM-DD' : null} style={baseSty + item.componentProps?.style} diff --git a/src/views/Clue/Order/Comp/MallOrderList.vue b/src/views/Clue/Order/Comp/MallOrderList.vue index 689bcc0..bcb6b3c 100644 --- a/src/views/Clue/Order/Comp/MallOrderList.vue +++ b/src/views/Clue/Order/Comp/MallOrderList.vue @@ -152,7 +152,7 @@ class="mr-10px" link style="padding: 0; margin-left: 0" - v-if="scope.row.isPayoff == false" + v-if="scope.row.isPayoff == '未结清'" v-hasPermi="['clue:order:return']" @click="feeBack(scope.row)" > diff --git a/src/views/Clue/Order/Comp/OrderList.vue b/src/views/Clue/Order/Comp/OrderList.vue index 35c5190..58ab559 100644 --- a/src/views/Clue/Order/Comp/OrderList.vue +++ b/src/views/Clue/Order/Comp/OrderList.vue @@ -115,12 +115,22 @@ class="mr-10px" link style="padding: 0; margin-left: 0" - v-if="scope.row.isPayoff == false" + v-if="scope.row.isPayoff == '未结清'" v-hasPermi="['clue:order:return']" @click="feeBack(scope.row)" > 回款 + + 添加支出 + + @@ -152,6 +163,7 @@ import { getClassTypePage } from '@/api/school/class' import DialogOrder from './DialogOrder.vue' import DialogFeeback from './DialogFeeback.vue' import DialogAfterSale from './DialogAfterSale.vue' +import DialogExtraFee from './DialogExtraPay.vue' import { removeNullField } from '@/utils' @@ -257,6 +269,11 @@ function feeBack(row) { feedbackDialog.value.open(row.signId) } +const extraFeeDialog = ref() +function handleAddFee(row) { + extraFeeDialog.value.open(row.signId) +} + // 取消登记 async function cancelDeal(row) { try { diff --git a/src/views/Clue/Set/Comp/GeneralSet.vue b/src/views/Clue/Set/Comp/GeneralSet.vue index 6d6060d..7f5f92d 100644 --- a/src/views/Clue/Set/Comp/GeneralSet.vue +++ b/src/views/Clue/Set/Comp/GeneralSet.vue @@ -18,7 +18,7 @@ - + @@ -124,6 +151,7 @@ import * as FollowApi from '@/api/clue/followRecord' import { getPlaceList } from '@/api/school/place' import DialogFollow from './DialogFollow.vue' +import DialogSchoolInfo from './DialogSchoolInfo.vue' import AMapLoader from '@amap/amap-jsapi-loader' import { formatDate, dateFormatter } from '@/utils/formatTime' @@ -214,8 +242,8 @@ async function open(id) { infoIndex.value = 'followRecord' if (appStore.getAppInfo?.instanceType == 1 && !dialogMap.value) { - nextTick(() => { - getSchoolPlace() + nextTick(async () => { + await getSchoolPlace() initMap(info.value) }) } @@ -225,10 +253,9 @@ async function open(id) { } const placeList = ref([]) -function getSchoolPlace() { - getPlaceList().then((data) => { - placeList.value = data.placeList - }) +async function getSchoolPlace() { + const data = await getPlaceList() + placeList.value = data.placeList } const defaultLatLng = ref({ @@ -249,7 +276,7 @@ function initMap(data) { } } dialogMap.value = new AMap.Map('dialogMap', { - zoom: 12, + zoom: 14, zooms: [2, 22], center: [defaultLatLng.value.lng, defaultLatLng.value.lat] }) @@ -285,6 +312,7 @@ function handleShowSchool() { extData: place, clickable: true }) + marker.on('click', (ev) => showSchoolInfo(ev.target.getExtData())) schoolMarkers.value.push(marker) } } else { @@ -302,7 +330,82 @@ function addmark(lat, lng, AMap) { }) dialogMap.value.add(marker.value) dialogMap.value.setCenter([lat, lng], '', 500) + getNearbySchool({ lat: lng, lng: lat }) } + +const collaspeKey = ref('nearbySchool') +const nearbySchoolSearching = ref(false) +const nearbySchoolList = ref([]) +function getNearbySchool(info) { + if (info.lng && info.lat) { + nearbySchoolList.value = [] + nearbySchoolSearching.value = true + // 推荐的场地 + let places1 = [] + // 普通的场地 + let places2 = [] + + const p2 = [info.lng, info.lat] + for (let i = 0; i < placeList.value.length; i++) { + const element = placeList.value[i] + const p1 = [element.lng, element.lat] + // 计算直线距离 + element.distance = (aMap.value.GeometryUtil.distance(p1, p2) / 1000).toFixed(2) + element.recommend ? places1.push(element) : places2.push(element) + } + // 按直线距离排序 + // 排序 + if (places1.length > 1) { + places1 = places1.sort((a, b) => a.distance - b.distance) + } + // 排序 + if (places2.length > 1) { + places2 = places2.sort((a, b) => a.distance - b.distance) + } + // 取普通场地和推荐场地,组合, 取四个 + nearbySchoolList.value = [] + for (let i = 0; i < 4; i++) { + places1.length > i && nearbySchoolList.value.push(places1[i]) + places2.length > i && nearbySchoolList.value.push(places2[i]) + if (nearbySchoolList.value.length === 4) { + break + } + } + // 计算步行距离 + nearbySchoolList.value.map(async (item) => { + const p1 = [item.lng, item.lat] + const resp = await getWalkingDistance(p1, p2) + item.walkdistance = resp + }) + nearbySchoolSearching.value = false + } +} + +// 获取两点之间的步行距离 +async function getWalkingDistance(start, end) { + return new Promise((resolve) => { + aMap.value.plugin('AMap.Walking', () => { + const walking = new aMap.value.Walking() + let num = 0 + walking.search(start, end, (status, result) => { + if (status === 'complete') { + result.routes.forEach((item) => { + num += item.distance + }) + resolve(num > 1000 ? `${(num / 1000).toFixed(2)} 公里` : `${num} 米`) + } else { + resolve('步行数据无法确定') + } + }) + }) + }) +} + +const schoolInfoDialog = ref() +function showSchoolInfo(val) { + schoolInfoDialog.value.open(val) +} + function removeMarker() { dialogMap.value.remove(marker.value) } diff --git a/src/views/SchoolManagement/Place/index.vue b/src/views/SchoolManagement/Place/index.vue index 660cb57..520789a 100644 --- a/src/views/SchoolManagement/Place/index.vue +++ b/src/views/SchoolManagement/Place/index.vue @@ -539,7 +539,7 @@ async function changePlaceStatus(row) { const text = row.status == 0 ? '启用' : '停用' await message.confirm('确认要"' + text + '""' + row.name + '"场地吗?') // 发起修改状态 - await PlaceApi.updatePlaceStatus({ placeId: row.placeId, status: row.status }) + await PlaceApi.updatePlaceStatus(row.placeId, row.status) message.success('修改成功') // 刷新列表 // await getList() From 848830a21b9172c3c96617ecc39b1dee2ebef50f Mon Sep 17 00:00:00 2001 From: qsh <> Date: Wed, 26 Jun 2024 18:24:45 +0800 Subject: [PATCH 04/25] =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/Clue/Order/Comp/DialogOrder.vue | 17 +- src/views/Clue/Pool/Comp/DialogClue.vue | 8 +- src/views/Clue/Pool/Comp/DialogFollow.vue | 24 ++- src/views/Clue/Pool/Comp/DialogSchoolInfo.vue | 2 +- src/views/Clue/Pool/Comp/DialogSuccess.vue | 34 ++- src/views/Clue/Pool/Comp/DrawerClue.vue | 11 +- src/views/Clue/Pool/index.vue | 5 +- src/views/MiniMall/Product/add.vue | 11 +- src/views/SchoolManagement/Class/index.vue | 202 ++++++++---------- 9 files changed, 169 insertions(+), 145 deletions(-) diff --git a/src/views/Clue/Order/Comp/DialogOrder.vue b/src/views/Clue/Order/Comp/DialogOrder.vue index 309dcb6..e16714c 100644 --- a/src/views/Clue/Order/Comp/DialogOrder.vue +++ b/src/views/Clue/Order/Comp/DialogOrder.vue @@ -38,13 +38,15 @@ - 额外支出 - - - - - - +
+ 额外支出 + + + + + + +
@@ -78,6 +80,7 @@ import { getSimpleFieldList as getOrderFieldList } from '@/api/clue/orderField' import { getPaymentPage } from '@/api/clue/payment' import { getAfterSalePage } from '@/api/clue/afterSale' +import { checkPermi } from '@/utils/permission' import { formatDate } from '@/utils/formatTime' const tabName = ref('clueInfo') diff --git a/src/views/Clue/Pool/Comp/DialogClue.vue b/src/views/Clue/Pool/Comp/DialogClue.vue index 803a903..259f197 100644 --- a/src/views/Clue/Pool/Comp/DialogClue.vue +++ b/src/views/Clue/Pool/Comp/DialogClue.vue @@ -24,10 +24,10 @@
- +