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 @@ @@ -104,7 +105,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 @@ - + + + + + + + + @@ -80,9 +92,12 @@ diff --git a/src/views/Clue/Order/Comp/DialogOrder.vue b/src/views/Clue/Order/Comp/DialogOrder.vue index e16714c..e2f7e5c 100644 --- a/src/views/Clue/Order/Comp/DialogOrder.vue +++ b/src/views/Clue/Order/Comp/DialogOrder.vue @@ -7,13 +7,20 @@ - 成交产品 + + 成交产品,应收:{{ prodTotalPrice }} + - - + + + + + {{ scope.row.warehouseName ? '已发货' : '待发货' }} + + - 其他费用 + + 其他费用,应收:{{ extraTotalPrice }} + + + 合计应收:{{ prodTotalPrice + extraTotalPrice }} + - 额外支出 + + 额外支出,合计:{{ extraPayTotalFee }} + @@ -86,11 +104,31 @@ import { formatDate } from '@/utils/formatTime' const tabName = ref('clueInfo') const show = ref(false) const clueInfo = ref({}) -const orderInfo = ref({}) +const orderInfo = ref({ + signProducts: [], + extraPay: [] +}) const returnRecordList = ref([]) const aftersaleList = ref([]) const extraPayList = ref([]) +const prodTotalPrice = computed(() => { + return orderInfo.value.signProducts.reduce( + (pre, cur) => pre + (cur?.price || 0) * (cur?.signNum || 0), + 0 + ) +}) + +// 其他费用 +const extraTotalPrice = computed(() => { + return orderInfo.value.extraPay.reduce((pre, cur) => pre + cur.extraPayMoney, 0) +}) + +// 额外支出 +const extraPayTotalFee = computed(() => { + return extraPayList.value.reduce((pre, cur) => pre + cur.extraPayMoney, 0) +}) + function open(clueId, orderId) { try { show.value = true @@ -122,6 +160,9 @@ const orderSchema = ref([]) function getFields() { getClueFieldList().then((data) => { const arr = useCrudSchemas(data).allSchemas.detailSchema + if (arr.length % 2 != 0) { + arr.push({}) + } clueSchema.value = [ ...arr, { @@ -140,6 +181,9 @@ function getFields() { getOrderFieldList().then((data) => { const arr = useCrudSchemas(data).allSchemas.detailSchema + if (arr.length % 2 != 0) { + arr.push({}) + } orderSchema.value = [ ...arr, { diff --git a/src/views/Clue/Order/Comp/MallOrderList.vue b/src/views/Clue/Order/Comp/MallOrderList.vue index bcb6b3c..f2f75ca 100644 --- a/src/views/Clue/Order/Comp/MallOrderList.vue +++ b/src/views/Clue/Order/Comp/MallOrderList.vue @@ -68,9 +68,14 @@ - - - + + + + + {{ scope.row.warehouseName ? '已发货' : '待发货' }} + + + { - const arr = [ + const arr1 = [...props.schema] + if (arr1.length % 2 != 0) { + arr1.push({}) + } + const arr2 = [ { field: 'requirement', label: '诉求', @@ -192,7 +196,7 @@ const showSchema = computed(() => { isEditor: true } ] - return [...props.schema, ...arr] + return [...arr1, ...arr2] }) const followList = ref([]) diff --git a/src/views/MiniMall/Purchase/Comp/DialogAdd.vue b/src/views/MiniMall/Purchase/Comp/DialogAdd.vue index 7be7701..9c672aa 100644 --- a/src/views/MiniMall/Purchase/Comp/DialogAdd.vue +++ b/src/views/MiniMall/Purchase/Comp/DialogAdd.vue @@ -42,7 +42,13 @@ - + @@ -51,6 +57,7 @@ Date: Thu, 27 Jun 2024 15:29:54 +0800 Subject: [PATCH 06/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/DialogDelivery.vue | 12 +++++++++--- src/views/Clue/Order/Comp/DialogOrder.vue | 1 - src/views/Clue/Order/Comp/MallOrderList.vue | 1 - 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/views/Clue/Order/Comp/DialogDelivery.vue b/src/views/Clue/Order/Comp/DialogDelivery.vue index f9c5652..8398971 100644 --- a/src/views/Clue/Order/Comp/DialogDelivery.vue +++ b/src/views/Clue/Order/Comp/DialogDelivery.vue @@ -7,9 +7,9 @@ :{{ form.sendTotalNum }} - + - + 立即采购发货 使用库存发货 @@ -82,7 +82,13 @@ - + diff --git a/src/views/Clue/Order/Comp/DialogOrder.vue b/src/views/Clue/Order/Comp/DialogOrder.vue index e2f7e5c..eac284e 100644 --- a/src/views/Clue/Order/Comp/DialogOrder.vue +++ b/src/views/Clue/Order/Comp/DialogOrder.vue @@ -15,7 +15,6 @@ - {{ scope.row.warehouseName ? '已发货' : '待发货' }} diff --git a/src/views/Clue/Order/Comp/MallOrderList.vue b/src/views/Clue/Order/Comp/MallOrderList.vue index f2f75ca..ecfbf13 100644 --- a/src/views/Clue/Order/Comp/MallOrderList.vue +++ b/src/views/Clue/Order/Comp/MallOrderList.vue @@ -69,7 +69,6 @@ - {{ scope.row.warehouseName ? '已发货' : '待发货' }} From 906b63feee0f8ff742c04907450f50b17c04eb22 Mon Sep 17 00:00:00 2001 From: qsh <> Date: Thu, 27 Jun 2024 17:14:30 +0800 Subject: [PATCH 07/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/layout/components/Setting/src/Setting.vue | 5 + .../src/components/InterfaceDisplay.vue | 1 - src/views/Home/Index.vue | 116 +++++++++--------- src/views/MiniMall/Product/add.vue | 4 +- src/views/MiniMall/Purchase/index.data.js | 2 +- 5 files changed, 63 insertions(+), 65 deletions(-) diff --git a/src/layout/components/Setting/src/Setting.vue b/src/layout/components/Setting/src/Setting.vue index bdeb2ca..3420e5a 100644 --- a/src/layout/components/Setting/src/Setting.vue +++ b/src/layout/components/Setting/src/Setting.vue @@ -12,6 +12,11 @@ import { ThemeSwitch } from '@/layout/components/ThemeSwitch' import ColorRadioPicker from './components/ColorRadioPicker.vue' // import InterfaceDisplay from './components/InterfaceDisplay.vue' // import LayoutRadioPicker from './components/LayoutRadioPicker.vue' +import { useWatermark } from '@/hooks/web/useWatermark' + +const { setWatermark } = useWatermark() + +setWatermark('安徽莳松科技有限公司') const { t } = useI18n() const appStore = useAppStore() diff --git a/src/layout/components/Setting/src/components/InterfaceDisplay.vue b/src/layout/components/Setting/src/components/InterfaceDisplay.vue index 598d2c8..b791a85 100644 --- a/src/layout/components/Setting/src/components/InterfaceDisplay.vue +++ b/src/layout/components/Setting/src/components/InterfaceDisplay.vue @@ -124,7 +124,6 @@ const fixedMenuChange = (show: boolean) => { const setWater = () => { setWatermark(water.value) } -setWater() const layout = computed(() => appStore.getLayout) diff --git a/src/views/Home/Index.vue b/src/views/Home/Index.vue index b362e9f..0a5ee37 100644 --- a/src/views/Home/Index.vue +++ b/src/views/Home/Index.vue @@ -67,8 +67,61 @@ - - + + NO.{{ index + 1 }} + {{ item.username }} + 已跟进{{ item.followNum }}条线索 + + + + + + + + + 本月成交榜Top10 + + + + + + + + + + + + - - - - - 成交率 - - - - - - - - - - - - - - 跟进榜Top10 - - 本日 - 本月 - - - - - - - - NO.{{ index + 1 }} - {{ item.username }} - 已跟进{{ item.followNum }}条线索 - - - - - - - - - - - 本月成交榜Top10 - - - - - - - - - - - -