Browse Source

1

yuhongzhe
于宏哲PHP 10 months ago
parent
commit
d1c9185987
  1. 33
      admin/src/app/api/order_table.ts
  2. 3
      admin/src/app/lang/zh-cn/customer_resource_changes.customer_resource_changes.json
  3. 20
      admin/src/app/lang/zh-cn/customer_resources.customer_resources.json
  4. 54
      admin/src/app/lang/zh-cn/order_table.order_table.json
  5. 623
      admin/src/app/views/customer_resources/customer_resources.vue
  6. 610
      admin/src/app/views/order_table/components/order-table-edit.vue
  7. 607
      admin/src/app/views/order_table/order_table.vue
  8. 6
      niucloud/app/adminapi/controller/customer_resources/CustomerResources.php
  9. 49
      niucloud/app/adminapi/controller/order_table/OrderTable.php
  10. 10
      niucloud/app/adminapi/route/order_table.php
  11. 226
      niucloud/app/model/class_grade/ClassGrade.php
  12. 166
      niucloud/app/model/order_table/OrderTable.php
  13. 40
      niucloud/app/service/admin/customer_resources/CustomerResourcesService.php
  14. 42
      niucloud/app/service/admin/order_table/OrderTableService.php
  15. 12
      niucloud/app/validate/order_table/OrderTable.php

33
admin/src/app/api/order_table.ts

@ -1,5 +1,9 @@
import request from '@/utils/request' import request from '@/utils/request'
// USER_CODE_BEGIN -- order_table // USER_CODE_BEGIN -- order_table
/** /**
* *
@ -7,7 +11,7 @@ import request from '@/utils/request'
* @returns * @returns
*/ */
export function getOrderTableList(params: Record<string, any>) { export function getOrderTableList(params: Record<string, any>) {
return request.get(`order_table/order_table`, { params }) return request.get(`order_table/order_table`, {params})
} }
/** /**
@ -16,7 +20,7 @@ export function getOrderTableList(params: Record<string, any>) {
* @returns * @returns
*/ */
export function getOrderTableInfo(id: number) { export function getOrderTableInfo(id: number) {
return request.get(`order_table/order_table/${id}`) return request.get(`order_table/order_table/${id}`);
} }
/** /**
@ -25,10 +29,7 @@ export function getOrderTableInfo(id: number) {
* @returns * @returns
*/ */
export function addOrderTable(params: Record<string, any>) { export function addOrderTable(params: Record<string, any>) {
return request.post('order_table/order_table', params, { return request.post('order_table/order_table', params, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -38,10 +39,7 @@ export function addOrderTable(params: Record<string, any>) {
* @returns * @returns
*/ */
export function editOrderTable(params: Record<string, any>) { export function editOrderTable(params: Record<string, any>) {
return request.put(`order_table/order_table/${params.id}`, params, { return request.put(`order_table/order_table/${params.id}`, params, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true,
showSuccessMessage: true,
})
} }
/** /**
@ -50,10 +48,17 @@ export function editOrderTable(params: Record<string, any>) {
* @returns * @returns
*/ */
export function deleteOrderTable(id: number) { export function deleteOrderTable(id: number) {
return request.delete(`order_table/order_table/${id}`, { return request.delete(`order_table/order_table/${id}`, { showErrorMessage: true, showSuccessMessage: true })
showErrorMessage: true, }
showSuccessMessage: true,
}) export function getWithCustomerResourcesList(params: Record<string,any>){
return request.get('order_table/customer_resources_all', {params})
}export function getWithCourseList(params: Record<string,any>){
return request.get('order_table/course_all', {params})
}export function getWithClassGradeList(params: Record<string,any>){
return request.get('order_table/class_grade_all', {params})
}export function getWithPersonnelList(params: Record<string,any>){
return request.get('order_table/personnel_all', {params})
} }
// USER_CODE_END -- order_table // USER_CODE_END -- order_table

3
admin/src/app/lang/zh-cn/customer_resource_changes.customer_resource_changes.json

@ -18,4 +18,7 @@
"customerResourceChangesDeleteTips": "确定要删除该数据吗?", "customerResourceChangesDeleteTips": "确定要删除该数据吗?",
"startDate": "请选择开始时间", "startDate": "请选择开始时间",
"endDate": "请选择结束时间" "endDate": "请选择结束时间"
} }

20
admin/src/app/lang/zh-cn/customer_resources.customer_resources.json

@ -34,5 +34,23 @@
"updateCustomerResources":"编辑客户资源", "updateCustomerResources":"编辑客户资源",
"customerResourcesDeleteTips":"确定要删除该数据吗?", "customerResourcesDeleteTips":"确定要删除该数据吗?",
"startDate":"请选择开始时间", "startDate":"请选择开始时间",
"endDate":"请选择结束时间" "endDate":"请选择结束时间",
"resourceId":"资源",
"resourceIdPlaceholder":"请输入资源",
"orderStatus":"订单状态",
"orderStatusPlaceholder":"请输入订单状态",
"paymentType":"付款类型",
"paymentTypePlaceholder":"请输入付款类型",
"orderAmount":"订单金额",
"orderAmountPlaceholder":"请输入订单金额",
"courseId":"课程",
"courseIdPlaceholder":"请输入课程",
"classId":"班级",
"classIdPlaceholder":"请输入班级",
"staffId":"人员",
"paymentTime":"支付时间",
"addOrderTable":"添加订单",
"updateOrderTable":"编辑订单"
} }

54
admin/src/app/lang/zh-cn/order_table.order_table.json

@ -1,35 +1,21 @@
{ {
"id": "订单编号", "resourceId":"资源",
"idPlaceholder": "请输入订单编号", "resourceIdPlaceholder":"请输入资源",
"paymentId": "支付编号", "orderStatus":"订单状态",
"paymentIdPlaceholder": "请输入支付编号", "orderStatusPlaceholder":"请输入订单状态",
"orderStatus": "订单状态: pending-待支付, paid-已支付", "paymentType":"付款类型",
"orderStatusPlaceholder": "请输入订单状态: pending-待支付, paid-已支付", "paymentTypePlaceholder":"请输入付款类型",
"paymentType": "付款类型: cash-现金支付, scan_code-扫码支付, subscription-订阅支付", "orderAmount":"订单金额",
"paymentTypePlaceholder": "请输入付款类型: cash-现金支付, scan_code-扫码支付, subscription-订阅支付", "orderAmountPlaceholder":"请输入订单金额",
"orderAmount": "订单金额", "courseId":"课程",
"orderAmountPlaceholder": "请输入订单金额", "courseIdPlaceholder":"请输入课程",
"courseId": "课程ID", "classId":"班级",
"courseIdPlaceholder": "请输入课程ID", "classIdPlaceholder":"请输入班级",
"classId": "班级ID", "staffId":"人员",
"classIdPlaceholder": "请输入班级ID", "paymentTime":"支付时间",
"staffId": "人员ID", "addOrderTable":"添加订单",
"staffIdPlaceholder": "请输入人员ID", "updateOrderTable":"编辑订单",
"resourceId": "资源ID", "orderTableDeleteTips":"确定要删除该数据吗?",
"resourceIdPlaceholder": "请输入资源ID", "startDate":"请选择开始时间",
"afterSalesStatus": "售后状态", "endDate":"请选择结束时间"
"afterSalesStatusPlaceholder": "请输入售后状态", }
"afterSalesReason": "售后原因",
"afterSalesReasonPlaceholder": "请输入售后原因",
"afterSalesTime": "售后时间",
"afterSalesTimePlaceholder": "请输入售后时间",
"paymentTime": "支付时间",
"paymentTimePlaceholder": "请输入支付时间",
"subscriptionPaymentTime": "订阅支付生成时间",
"subscriptionPaymentTimePlaceholder": "请输入订阅支付生成时间",
"addOrderTable": "添加订单",
"updateOrderTable": "编辑订单",
"orderTableDeleteTips": "确定要删除该数据吗?",
"startDate": "请选择开始时间",
"endDate": "请选择结束时间"
}

623
admin/src/app/views/customer_resources/customer_resources.vue

@ -1,270 +1,353 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{pageName}}</span> <span class="text-lg">{{pageName}}</span>
<el-button type="primary" @click="addEvent" v-if="type == 'khzy'"> <el-button type="primary" @click="addEvent" v-if="customerResourcesTable.searchParam.type == 'khzy'">
{{ t('addCustomerResources') }} {{ t('addCustomerResources') }}
</el-button> </el-button>
</div> </div>
<el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never"> <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
<el-form :inline="true" :model="customerResourcesTable.searchParam" ref="searchFormRef"> <el-form :inline="true" :model="customerResourcesTable.searchParam" ref="searchFormRef">
<el-form-item :label="t('name')" prop="name"> <el-form-item :label="t('name')" prop="name">
<el-input v-model="customerResourcesTable.searchParam.name" :placeholder="t('namePlaceholder')" /> <el-input v-model="customerResourcesTable.searchParam.name"
</el-form-item> :placeholder="t('namePlaceholder')" />
<el-form-item :label="t('phoneNumber')" prop="phone_number"> </el-form-item>
<el-input v-model="customerResourcesTable.searchParam.phone_number" :placeholder="t('phoneNumberPlaceholder')" />
</el-form-item> <el-form-item label="年龄" prop="age">
<el-form-item> <el-input v-model="customerResourcesTable.searchParam.age" placeholder="请输入年龄" />
<el-button type="primary" @click="loadCustomerResourcesList()">{{ t('search') }}</el-button> </el-form-item>
<el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
</el-form-item>
</el-form> <el-form-item label="性别" prop="gender">
</el-card> <el-select v-model="customerResourcesTable.searchParam.gender" placeholder="请选择性别">
<el-option label="男性" value="male" />
<div class="mt-[10px]"> <el-option label="女性" value="female" />
<el-table :data="customerResourcesTable.data" size="large" v-loading="customerResourcesTable.loading"> <el-option label="其他" value="other" />
<template #empty> </el-select>
<span>{{ !customerResourcesTable.loading ? t('emptyData') : '' }}</span> </el-form-item>
</template>
<el-table-column :label="t('source')" min-width="180" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<div v-for="(item, index) in sourceList"> <el-form-item :label="t('phoneNumber')" prop="phone_number">
<div v-if="item.value == row.source">{{ item.name }}</div> <el-input v-model="customerResourcesTable.searchParam.phone_number"
</div> :placeholder="t('phoneNumberPlaceholder')" />
</template> </el-form-item>
</el-table-column>
<el-table-column prop="consultant_name" :label="t('consultant')" min-width="120" :show-overflow-tooltip="true"/> <el-form-item label="创建时间">
<el-date-picker v-model="customerResourcesTable.searchParam.created_at" type="daterange" range-separator=""
<el-table-column prop="name" :label="t('name')" min-width="120" :show-overflow-tooltip="true"/> start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" />
<el-table-column prop="age" :label="t('age')" min-width="120" :show-overflow-tooltip="true"/> </el-form-item>
<el-table-column :label="t('gender')" min-width="180" align="center" :show-overflow-tooltip="true"> <!-- 更新时间 -->
<template #default="{ row }"> <el-form-item label="更新时间">
<div v-for="(item, index) in genderList"> <el-date-picker v-model="customerResourcesTable.searchParam.updated_at" type="daterange" range-separator=""
<div v-if="item.value == row.gender">{{ item.name }}</div> start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD"
</div> value-format="YYYY-MM-DD" />
</template> </el-form-item>
</el-table-column>
<el-table-column prop="phone_number" :label="t('phoneNumber')" min-width="120" :show-overflow-tooltip="true"/> <el-form-item>
<el-button type="primary" @click="loadCustomerResourcesList()">{{ t('search') }}</el-button>
<el-table-column prop="decision_maker" :label="t('decisionMaker')" min-width="120" :show-overflow-tooltip="true"/> <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
</el-form-item>
<el-table-column :label="t('operation')" fixed="right" min-width="200" v-if="type == 'khzy'"> </el-form>
<template #default="{ row }"> </el-card>
<el-button type="primary" link @click="modificationLog(row.id)">六要素修改记录</el-button>
<el-button type="primary" link @click="resourceChanges(row.id)">客户信息修改记录</el-button> <div class="mt-[10px]">
<el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button> <el-table :data="customerResourcesTable.data" size="large" v-loading="customerResourcesTable.loading">
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button> <template #empty>
<span>{{ !customerResourcesTable.loading ? t('emptyData') : '' }}</span>
</template> </template>
</el-table-column> <el-table-column :label="t('source')" min-width="180" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
<div v-for="(item, index) in sourceList">
<div v-if="item.value == row.source">{{ item.name }}</div>
<el-table-column :label="t('operation')" fixed="right" min-width="200" v-if="type == 'yjfp'"> </div>
<template #default="{ row }"> </template>
<el-button type="primary" link @click="fpEvent(row)">分配</el-button> </el-table-column>
</template> <el-table-column prop="consultant_name" :label="t('consultant')" min-width="120"
</el-table-column> :show-overflow-tooltip="true" />
</el-table> <el-table-column prop="name" :label="t('name')" min-width="120" :show-overflow-tooltip="true" />
<div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="customerResourcesTable.page" v-model:page-size="customerResourcesTable.limit" <el-table-column prop="age" :label="t('age')" min-width="50" :show-overflow-tooltip="true" />
layout="total, sizes, prev, pager, next, jumper" :total="customerResourcesTable.total"
@size-change="loadCustomerResourcesList()" @current-change="loadCustomerResourcesList" /> <el-table-column :label="t('gender')" min-width="60" align="center" :show-overflow-tooltip="true">
</div> <template #default="{ row }">
</div> <div v-for="(item, index) in genderList">
<div v-if="item.value == row.gender">{{ item.name }}</div>
<edit ref="editCustomerResourcesDialog" @complete="loadCustomerResourcesList" /> </div>
</template>
<fp ref="fpCustomerResourcesDialog" @complete="loadCustomerResourcesList" /> </el-table-column>
</el-card> <el-table-column prop="phone_number" :label="t('phoneNumber')" min-width="120"
</div> :show-overflow-tooltip="true" />
</template>
<el-table-column prop="decision_maker" :label="t('decisionMaker')" min-width="120"
<script lang="ts" setup> :show-overflow-tooltip="true" />
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict' <el-table-column prop="created_at" label="添加时间" min-width="120" :show-overflow-tooltip="true" />
import { getCustomerResourcesList, deleteCustomerResources, getWithPersonnelList, getWithCampusList } from '@/app/api/customer_resources'
import { img } from '@/utils/common' <el-table-column prop="updated_at" label="修改时间" min-width="120" :show-overflow-tooltip="true" />
import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue'
import Fp from '@/app/views/customer_resources/components/fp.vue' <el-table-column :label="t('operation')" fixed="right" min-width="200" v-if="type == 'khzy'">
import { useRouter, useRoute } from 'vue-router' <template #default="{ row }">
const route = useRoute() <el-button type="primary" link @click="modificationLog(row.id)">六要素修改记录</el-button>
const pageName = route.meta.title; <el-button type="primary" link @click="resourceChanges(row.id)">客户信息修改记录</el-button>
const router = useRouter() <el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
const type = pageName == '业绩分配' ? 'yjfp' : 'khzy';
</template>
</el-table-column>
const modificationLog = (id: number) => {
router.push({ path: '/six_speed_modification_log/six_speed_modification_log', query: { id: id } })
} <el-table-column :label="t('operation')" fixed="right" min-width="200"
v-if="customerResourcesTable.searchParam.type == 'yjfp'">
const resourceChanges = (id: number) => { <template #default="{ row }">
router.push({ path: '/customer_resource_changes/customer_resource_changes', query: { id: id } }) <el-button type="primary" link @click="fpEvent(row)">分配</el-button>
} </template>
</el-table-column>
let customerResourcesTable = reactive({
page: 1, <el-table-column :label="t('operation')" fixed="right" min-width="200"
limit: 10, v-if="customerResourcesTable.searchParam.type == 'zylb'">
total: 0, <template #default="{ row }">
loading: true, <el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
data: [],
searchParam:{ <el-button type="primary" link @click="addOrder({'resource_id':row.id})">添加订单</el-button>
"name":"", </template>
"phone_number":"", </el-table-column>
'type':type
} </el-table>
}) <div class="mt-[16px] flex justify-end">
<el-pagination v-model:current-page="customerResourcesTable.page"
const searchFormRef = ref<FormInstance>() v-model:page-size="customerResourcesTable.limit"
layout="total, sizes, prev, pager, next, jumper" :total="customerResourcesTable.total"
// @size-change="loadCustomerResourcesList()" @current-change="loadCustomerResourcesList" />
const selectData = ref<any[]>([]) </div>
</div>
//
const sourceList = ref([] as any[]) <edit ref="editCustomerResourcesDialog" @complete="loadCustomerResourcesList" />
const sourceDictList = async () => {
sourceList.value = await (await useDictionary('source')).data.dictionary <fp ref="fpCustomerResourcesDialog" @complete="loadCustomerResourcesList" />
}
sourceDictList(); <Order ref="editOrderTableDialog" @complete="loadCustomerResourcesList" />
const source_channelList = ref([] as any[])
const source_channelDictList = async () => { </el-card>
source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary </div>
} </template>
source_channelDictList();
const genderList = ref([] as any[]) <script lang="ts" setup>
const genderDictList = async () => { import { reactive, ref, watch } from 'vue'
genderList.value = await (await useDictionary('zy_sex')).data.dictionary import { t } from '@/lang'
} import { useDictionary } from '@/app/api/dict'
genderDictList(); import { getCustomerResourcesList, deleteCustomerResources, getWithPersonnelList, getWithCampusList } from '@/app/api/customer_resources'
const purchasing_powerList = ref([] as any[]) import { img } from '@/utils/common'
const purchasing_powerDictList = async () => { import { ElMessageBox, FormInstance } from 'element-plus'
purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary import Edit from '@/app/views/customer_resources/components/customer-resources-edit.vue'
} import Fp from '@/app/views/customer_resources/components/fp.vue'
purchasing_powerDictList(); import Order from '@/app/views/order_table/components/order-table-edit.vue'
const cognitive_ideaList = ref([] as any[])
const cognitive_ideaDictList = async () => { import { useRouter, useRoute } from 'vue-router'
cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary const route = useRoute()
} const pageName = route.meta.title;
cognitive_ideaDictList(); const router = useRouter()
const initial_intentList = ref([] as any[])
const initial_intentDictList = async () => { let customerResourcesTable = reactive({
initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary page: 1,
} limit: 10,
initial_intentDictList(); total: 0,
const statusList = ref([] as any[]) loading: true,
const statusDictList = async () => { data: [],
statusList.value = await (await useDictionary('kh_status')).data.dictionary searchParam: {
} "name": "",
statusDictList(); "age": "",
"gender": "",
/** "phone_number": "",
* 获取客户资源列表 'type': '',
*/ "created_at" : "",
const loadCustomerResourcesList = (page: number = 1) => { "updated_at" : ""
customerResourcesTable.loading = true }
customerResourcesTable.page = page })
getCustomerResourcesList({ if (pageName == '业绩分配') {
page: customerResourcesTable.page, customerResourcesTable.searchParam.type = 'yjfp';
limit: customerResourcesTable.limit, } else if (pageName == '客户资源列表') {
...customerResourcesTable.searchParam customerResourcesTable.searchParam.type = 'khzy';
}).then(res => { } else if (pageName == '资源列表') {
customerResourcesTable.loading = false customerResourcesTable.searchParam.type = 'zylb';
customerResourcesTable.data = res.data.data }
customerResourcesTable.total = res.data.total
}).catch(() => { // const type = pageName == '' ? 'yjfp' : 'khzy';
customerResourcesTable.loading = false
})
}
loadCustomerResourcesList() const modificationLog = (id : number) => {
router.push({ path: '/six_speed_modification_log/six_speed_modification_log', query: { id: id } })
const editCustomerResourcesDialog: Record<string, any> | null = ref(null) }
const fpCustomerResourcesDialog: Record<string, any> | null = ref(null) const resourceChanges = (id : number) => {
router.push({ path: '/customer_resource_changes/customer_resource_changes', query: { id: id } })
/** }
* 添加客户资源
*/
const addEvent = () => { /**
editCustomerResourcesDialog.value.setFormData() * 添加订单
editCustomerResourcesDialog.value.showDialog = true */
} const editOrderTableDialog : Record<string, any> | null = ref(null)
const addOrder = (row : any) => {
/**
* 编辑客户资源 console.log(row);
* @param data editOrderTableDialog.value.setFormData(row)
*/ editOrderTableDialog.value.showDialog = true
const editEvent = (data: any) => { }
editCustomerResourcesDialog.value.setFormData(data)
editCustomerResourcesDialog.value.showDialog = true
} const searchFormRef = ref<FormInstance>()
const fpEvent = (data: any) => { //
fpCustomerResourcesDialog.value.setFormData(data) const selectData = ref<any[]>([])
fpCustomerResourcesDialog.value.showDialog = true
} //
const sourceList = ref([] as any[])
const sourceDictList = async () => {
/** sourceList.value = await (await useDictionary('source')).data.dictionary
* 删除客户资源 }
*/ sourceDictList();
const deleteEvent = (id: number) => { const source_channelList = ref([] as any[])
ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'), const source_channelDictList = async () => {
{ source_channelList.value = await (await useDictionary('SourceChannel')).data.dictionary
confirmButtonText: t('confirm'), }
cancelButtonText: t('cancel'), source_channelDictList();
type: 'warning', const genderList = ref([] as any[])
} const genderDictList = async () => {
).then(() => { genderList.value = await (await useDictionary('zy_sex')).data.dictionary
deleteCustomerResources(id).then(() => { }
loadCustomerResourcesList() genderDictList();
}).catch(() => { const purchasing_powerList = ref([] as any[])
}) const purchasing_powerDictList = async () => {
}) purchasing_powerList.value = await (await useDictionary('customer_purchasing_power')).data.dictionary
} }
purchasing_powerDictList();
const cognitive_ideaList = ref([] as any[])
const consultantList = ref([]) const cognitive_ideaDictList = async () => {
const setConsultantList = async () => { cognitive_ideaList.value = await (await useDictionary('cognitive_concept')).data.dictionary
consultantList.value = await (await getWithPersonnelList({})).data }
} cognitive_ideaDictList();
setConsultantList() const initial_intentList = ref([] as any[])
const campusList = ref([]) const initial_intentDictList = async () => {
const setCampusList = async () => { initial_intentList.value = await (await useDictionary('preliminarycustomerintention')).data.dictionary
campusList.value = await (await getWithCampusList({})).data }
} initial_intentDictList();
setCampusList() const statusList = ref([] as any[])
const statusDictList = async () => {
const resetForm = (formEl: FormInstance | undefined) => { statusList.value = await (await useDictionary('kh_status')).data.dictionary
if (!formEl) return }
formEl.resetFields() statusDictList();
loadCustomerResourcesList()
}
</script> /**
* 获取客户资源列表
<style lang="scss" scoped> */
/* 多行超出隐藏 */ const loadCustomerResourcesList = (page : number = 1) => {
.multi-hidden { customerResourcesTable.loading = true
word-break: break-all; customerResourcesTable.page = page
text-overflow: ellipsis;
overflow: hidden; getCustomerResourcesList({
display: -webkit-box; page: customerResourcesTable.page,
-webkit-line-clamp: 2; limit: customerResourcesTable.limit,
-webkit-box-orient: vertical; ...customerResourcesTable.searchParam
} }).then(res => {
</style> customerResourcesTable.loading = false
customerResourcesTable.data = res.data.data
customerResourcesTable.total = res.data.total
}).catch(() => {
customerResourcesTable.loading = false
})
}
loadCustomerResourcesList()
const editCustomerResourcesDialog : Record<string, any> | null = ref(null)
const fpCustomerResourcesDialog : Record<string, any> | null = ref(null)
/**
* 添加客户资源
*/
const addEvent = () => {
editCustomerResourcesDialog.value.setFormData()
editCustomerResourcesDialog.value.showDialog = true
}
/**
* 编辑客户资源
* @param data
*/
const editEvent = (data : any) => {
editCustomerResourcesDialog.value.setFormData(data)
editCustomerResourcesDialog.value.showDialog = true
}
const fpEvent = (data : any) => {
fpCustomerResourcesDialog.value.setFormData(data)
fpCustomerResourcesDialog.value.showDialog = true
}
/**
* 删除客户资源
*/
const deleteEvent = (id : number) => {
ElMessageBox.confirm(t('customerResourcesDeleteTips'), t('warning'),
{
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}
).then(() => {
deleteCustomerResources(id).then(() => {
loadCustomerResourcesList()
}).catch(() => {
})
})
}
const consultantList = ref([])
const setConsultantList = async () => {
consultantList.value = await (await getWithPersonnelList({})).data
}
setConsultantList()
const campusList = ref([])
const setCampusList = async () => {
campusList.value = await (await getWithCampusList({})).data
}
setCampusList()
const resetForm = (formEl : FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadCustomerResourcesList()
}
</script>
<style lang="scss" scoped>
/* 多行超出隐藏 */
.multi-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
</style>

610
admin/src/app/views/order_table/components/order-table-edit.vue

@ -1,343 +1,267 @@
<template> <template>
<el-dialog <el-dialog v-model="showDialog" :title="formData.id ? t('updateOrderTable') : t('addOrderTable')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true">
v-model="showDialog" <el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
:title="formData.id ? t('updateOrderTable') : t('addOrderTable')" <el-form-item :label="t('resourceId')" prop="resource_id">
width="50%" <el-select class="input-width" v-model="formData.resource_id" clearable :placeholder="t('resourceIdPlaceholder')">
class="diy-dialog-wrap" <el-option label="请选择" value=""></el-option>
:destroy-on-close="true" <el-option
> v-for="(item, index) in resourceIdList"
<el-form :key="index"
:model="formData" :label="item['name']"
label-width="120px" :value="item['id']"
ref="formRef" />
:rules="formRules" </el-select>
class="page-form" </el-form-item>
v-loading="loading"
> <el-form-item :label="t('orderStatus')" prop="order_status">
<el-form-item :label="t('paymentId')" prop="payment_id"> <el-select class="input-width" v-model="formData.order_status" clearable :placeholder="t('orderStatusPlaceholder')">
<el-input <el-option label="请选择" value=""></el-option>
v-model="formData.payment_id" <el-option
clearable v-for="(item, index) in order_statusList"
:placeholder="t('paymentIdPlaceholder')" :key="index"
class="input-width" :label="item.name"
/> :value="item.value"
</el-form-item> />
</el-select>
<el-form-item :label="t('orderStatus')" prop="order_status"> </el-form-item>
<el-input
v-model="formData.order_status" <el-form-item :label="t('paymentType')" prop="payment_type">
clearable <el-select class="input-width" v-model="formData.payment_type" clearable :placeholder="t('paymentTypePlaceholder')">
:placeholder="t('orderStatusPlaceholder')" <el-option label="请选择" value=""></el-option>
class="input-width" <el-option
/> v-for="(item, index) in payment_typeList"
</el-form-item> :key="index"
:label="item.name"
<el-form-item :label="t('paymentType')" prop="payment_type"> :value="item.value"
<el-input />
v-model="formData.payment_type" </el-select>
clearable </el-form-item>
:placeholder="t('paymentTypePlaceholder')"
class="input-width" <el-form-item :label="t('orderAmount')" prop="order_amount">
/> <el-input v-model="formData.order_amount" clearable :placeholder="t('orderAmountPlaceholder')" class="input-width" />
</el-form-item> </el-form-item>
<el-form-item :label="t('orderAmount')" prop="order_amount"> <el-form-item :label="t('courseId')" prop="course_id">
<el-input <el-select class="input-width" v-model="formData.course_id" clearable :placeholder="t('courseIdPlaceholder')">
v-model="formData.order_amount" <el-option label="请选择" value=""></el-option>
clearable <el-option
:placeholder="t('orderAmountPlaceholder')" v-for="(item, index) in courseIdList"
class="input-width" :key="index"
/> :label="item['course_name']"
</el-form-item> :value="item['id']"
/>
<el-form-item :label="t('courseId')" prop="course_id"> </el-select>
<el-input </el-form-item>
v-model="formData.course_id"
clearable <el-form-item :label="t('classId')" prop="class_id">
:placeholder="t('courseIdPlaceholder')" <el-select class="input-width" v-model="formData.class_id" clearable :placeholder="t('classIdPlaceholder')">
class="input-width" <el-option label="请选择" value=""></el-option>
/> <el-option
</el-form-item> v-for="(item, index) in classIdList"
:key="index"
<el-form-item :label="t('classId')" prop="class_id"> :label="item['class_name']"
<el-input :value="item['id']"
v-model="formData.class_id" />
clearable </el-select>
:placeholder="t('classIdPlaceholder')" </el-form-item>
class="input-width"
/> </el-form>
</el-form-item>
<template #footer>
<el-form-item :label="t('staffId')" prop="staff_id"> <span class="dialog-footer">
<el-input <el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
v-model="formData.staff_id" <el-button type="primary" :loading="loading" @click="confirm(formRef)">{{
clearable t('confirm')
:placeholder="t('staffIdPlaceholder')" }}</el-button>
class="input-width" </span>
/> </template>
</el-form-item> </el-dialog>
</template>
<el-form-item :label="t('resourceId')" prop="resource_id">
<el-input <script lang="ts" setup>
v-model="formData.resource_id" import { ref, reactive, computed, watch } from 'vue'
clearable import { useDictionary } from '@/app/api/dict'
:placeholder="t('resourceIdPlaceholder')" import { t } from '@/lang'
class="input-width" import type { FormInstance } from 'element-plus'
/> import { addOrderTable, editOrderTable, getOrderTableInfo, getWithCustomerResourcesList, getWithCourseList, getWithClassGradeList, getWithPersonnelList } from '@/app/api/order_table'
</el-form-item>
let showDialog = ref(false)
<el-form-item :label="t('afterSalesStatus')"> const loading = ref(false)
<el-input
v-model="formData.after_sales_status" /**
clearable * 表单数据
:placeholder="t('afterSalesStatusPlaceholder')" */
class="input-width" const initialFormData = {
/> id: '',
</el-form-item> resource_id: '',
order_status: '',
<el-form-item :label="t('afterSalesReason')"> payment_type: '',
<el-input order_amount: '',
v-model="formData.after_sales_reason" course_id: '',
clearable class_id: '',
:placeholder="t('afterSalesReasonPlaceholder')" }
class="input-width" const formData: Record<string, any> = reactive({ ...initialFormData })
/>
</el-form-item> const formRef = ref<FormInstance>()
<el-form-item :label="t('afterSalesTime')"> //
<el-input const formRules = computed(() => {
v-model="formData.after_sales_time" return {
clearable resource_id: [
:placeholder="t('afterSalesTimePlaceholder')" { required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' },
class="input-width"
/> ]
</el-form-item> ,
order_status: [
<el-form-item :label="t('paymentTime')"> { required: true, message: t('orderStatusPlaceholder'), trigger: 'blur' },
<el-input
v-model="formData.payment_time" ]
clearable ,
:placeholder="t('paymentTimePlaceholder')" payment_type: [
class="input-width" { required: true, message: t('paymentTypePlaceholder'), trigger: 'blur' },
/>
</el-form-item> ]
,
<el-form-item :label="t('subscriptionPaymentTime')"> order_amount: [
<el-input { required: true, message: t('orderAmountPlaceholder'), trigger: 'blur' },
v-model="formData.subscription_payment_time"
clearable ]
:placeholder="t('subscriptionPaymentTimePlaceholder')" ,
class="input-width" course_id: [
/> { required: true, message: t('courseIdPlaceholder'), trigger: 'blur' },
</el-form-item>
</el-form> ]
,
<template #footer> class_id: [
<span class="dialog-footer"> { required: true, message: t('classIdPlaceholder'), trigger: 'blur' },
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button>
<el-button ]
type="primary" ,
:loading="loading" }
@click="confirm(formRef)" })
>{{ t('confirm') }}</el-button
> const emit = defineEmits(['complete'])
</span>
</template> /**
</el-dialog> * 确认
</template> * @param formEl
*/
<script lang="ts" setup> const confirm = async (formEl: FormInstance | undefined) => {
import { ref, reactive, computed, watch } from 'vue' if (loading.value || !formEl) return
import { useDictionary } from '@/app/api/dict' let save = formData.id ? editOrderTable : addOrderTable
import { t } from '@/lang'
import type { FormInstance } from 'element-plus' await formEl.validate(async (valid) => {
import { if (valid) {
addOrderTable, loading.value = true
editOrderTable,
getOrderTableInfo, let data = formData
} from '@/app/api/order_table'
save(data).then(res => {
let showDialog = ref(false) loading.value = false
const loading = ref(false) showDialog.value = false
emit('complete')
/** }).catch(err => {
* 表单数据 loading.value = false
*/ })
const initialFormData = { }
id: '', })
payment_id: '', }
order_status: '',
payment_type: '', //
order_amount: '', let order_statusList = ref([])
course_id: '', const order_statusDictList = async () => {
class_id: '', order_statusList.value = await (await useDictionary('order_status')).data.dictionary
staff_id: '', }
resource_id: '', order_statusDictList();
after_sales_status: '', watch(() => order_statusList.value, () => { formData.order_status = order_statusList.value[0].value })
after_sales_reason: '', let payment_typeList = ref([])
after_sales_time: '', const payment_typeDictList = async () => {
payment_time: '', payment_typeList.value = await (await useDictionary('payment_type')).data.dictionary
subscription_payment_time: '', }
} payment_typeDictList();
const formData: Record<string, any> = reactive({ ...initialFormData }) watch(() => payment_typeList.value, () => { formData.payment_type = payment_typeList.value[0].value })
const formRef = ref<FormInstance>()
const resourceIdList = ref([] as any[])
// const setResourceIdList = async () => {
const formRules = computed(() => { resourceIdList.value = await (await getWithCustomerResourcesList({})).data
return { }
payment_id: [ setResourceIdList()
{ required: true, message: t('paymentIdPlaceholder'), trigger: 'blur' }, const courseIdList = ref([] as any[])
], const setCourseIdList = async () => {
order_status: [ courseIdList.value = await (await getWithCourseList({})).data
{ required: true, message: t('orderStatusPlaceholder'), trigger: 'blur' }, }
], setCourseIdList()
payment_type: [ const classIdList = ref([] as any[])
{ required: true, message: t('paymentTypePlaceholder'), trigger: 'blur' }, const setClassIdList = async () => {
], classIdList.value = await (await getWithClassGradeList({})).data
order_amount: [ }
{ required: true, message: t('orderAmountPlaceholder'), trigger: 'blur' }, setClassIdList()
], const staffIdList = ref([] as any[])
course_id: [ const setStaffIdList = async () => {
{ required: true, message: t('courseIdPlaceholder'), trigger: 'blur' }, staffIdList.value = await (await getWithPersonnelList({})).data
], }
class_id: [ setStaffIdList()
{ required: true, message: t('classIdPlaceholder'), trigger: 'blur' }, const setFormData = async (row: any = null) => {
], Object.assign(formData, initialFormData)
staff_id: [ Object.assign(formData, row)
{ required: true, message: t('staffIdPlaceholder'), trigger: 'blur' }, // formData.resource_id = row.resource_id;
], // console.log(0)
resource_id: [ // loading.value = true
{ required: true, message: t('resourceIdPlaceholder'), trigger: 'blur' }, // if(row){
], // const data = await (await getOrderTableInfo(row.id)).data
after_sales_status: [ // if (data) Object.keys(formData).forEach((key: string) => {
{ // if (data[key] != undefined) formData[key] = data[key]
required: true, // })
message: t('afterSalesStatusPlaceholder'), // }
trigger: 'blur', // loading.value = false
}, }
],
after_sales_reason: [ //
{ const mobileVerify = (rule: any, value: any, callback: any) => {
required: true, if (value && !/^1[3-9]\d{9}$/.test(value)) {
message: t('afterSalesReasonPlaceholder'), callback(new Error(t('generateMobile')))
trigger: 'blur', } else {
}, callback()
], }
after_sales_time: [ }
{
required: true, //
message: t('afterSalesTimePlaceholder'), const idCardVerify = (rule: any, value: any, callback: any) => {
trigger: 'blur', if (value && !/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)) {
}, callback(new Error(t('generateIdCard')))
], } else {
payment_time: [ callback()
{ required: true, message: t('paymentTimePlaceholder'), trigger: 'blur' }, }
], }
subscription_payment_time: [
{ //
required: true, const emailVerify = (rule: any, value: any, callback: any) => {
message: t('subscriptionPaymentTimePlaceholder'), if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
trigger: 'blur', callback(new Error(t('generateEmail')))
}, } else {
], callback()
} }
}) }
const emit = defineEmits(['complete']) //
const numberVerify = (rule: any, value: any, callback: any) => {
/** if (!Number.isInteger(value)) {
* 确认 callback(new Error(t('generateNumber')))
* @param formEl } else {
*/ callback()
const confirm = async (formEl: FormInstance | undefined) => { }
if (loading.value || !formEl) return }
let save = formData.id ? editOrderTable : addOrderTable
defineExpose({
await formEl.validate(async (valid) => { showDialog,
if (valid) { setFormData
loading.value = true })
</script>
let data = formData
<style lang="scss" scoped></style>
save(data) <style lang="scss">
.then((res) => { .diy-dialog-wrap .el-form-item__label{
loading.value = false height: auto !important;
showDialog.value = false }
emit('complete') </style>
})
.catch((err) => {
loading.value = false
})
}
})
}
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
if (row) {
const data = await (await getOrderTableInfo(row.id)).data
if (data)
Object.keys(formData).forEach((key: string) => {
if (data[key] != undefined) formData[key] = data[key]
})
}
loading.value = false
}
//
const mobileVerify = (rule: any, value: any, callback: any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile')))
} else {
callback()
}
}
//
const idCardVerify = (rule: any, value: any, callback: any) => {
if (
value &&
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
value
)
) {
callback(new Error(t('generateIdCard')))
} else {
callback()
}
}
//
const emailVerify = (rule: any, value: any, callback: any) => {
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) {
callback(new Error(t('generateEmail')))
} else {
callback()
}
}
//
const numberVerify = (rule: any, value: any, callback: any) => {
if (!Number.isInteger(value)) {
callback(new Error(t('generateNumber')))
} else {
callback()
}
}
defineExpose({
showDialog,
setFormData,
})
</script>
<style lang="scss" scoped></style>
<style lang="scss">
.diy-dialog-wrap .el-form-item__label {
height: auto !important;
}
</style>

607
admin/src/app/views/order_table/order_table.vue

@ -1,369 +1,238 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="box-card !border-none" shadow="never"> <el-card class="box-card !border-none" shadow="never">
<div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span> <div class="flex justify-between items-center">
<el-button type="primary" @click="addEvent"> <span class="text-lg">{{pageName}}</span>
{{ t('addOrderTable') }} <el-button type="primary" @click="addEvent">
</el-button> {{ t('addOrderTable') }}
</div> </el-button>
</div>
<el-card
class="box-card !border-none my-[10px] table-search-wrap" <el-card class="box-card !border-none my-[10px] table-search-wrap" shadow="never">
shadow="never" <el-form :inline="true" :model="orderTableTable.searchParam" ref="searchFormRef">
>
<el-form <el-form-item :label="t('orderStatus')" prop="order_status">
:inline="true" <el-select class="w-[280px]" v-model="orderTableTable.searchParam.order_status" clearable :placeholder="t('orderStatusPlaceholder')">
:model="orderTableTable.searchParam" <el-option label="全部" value=""></el-option>
ref="searchFormRef" <el-option
> v-for="(item, index) in order_statusList"
<el-form-item :label="t('paymentId')" prop="payment_id"> :key="index"
<el-input :label="item.name"
v-model="orderTableTable.searchParam.payment_id" :value="item.value"
:placeholder="t('paymentIdPlaceholder')" />
/> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('orderStatus')" prop="order_status">
<el-input
v-model="orderTableTable.searchParam.order_status" <el-form-item :label="t('paymentType')" prop="payment_type">
:placeholder="t('orderStatusPlaceholder')" <el-select class="w-[280px]" v-model="orderTableTable.searchParam.payment_type" clearable :placeholder="t('paymentTypePlaceholder')">
/> <el-option label="全部" value=""></el-option>
</el-form-item> <el-option
<el-form-item :label="t('paymentType')" prop="payment_type"> v-for="(item, index) in payment_typeList"
<el-input :key="index"
v-model="orderTableTable.searchParam.payment_type" :label="item.name"
:placeholder="t('paymentTypePlaceholder')" :value="item.value"
/> />
</el-form-item> </el-select>
<el-form-item :label="t('orderAmount')" prop="order_amount"> </el-form-item>
<el-input
v-model="orderTableTable.searchParam.order_amount" <el-form-item>
:placeholder="t('orderAmountPlaceholder')" <el-button type="primary" @click="loadOrderTableList()">{{ t('search') }}</el-button>
/> <el-button @click="resetForm(searchFormRef)">{{ t('reset') }}</el-button>
</el-form-item> </el-form-item>
<el-form-item :label="t('courseId')" prop="course_id"> </el-form>
<el-input </el-card>
v-model="orderTableTable.searchParam.course_id"
:placeholder="t('courseIdPlaceholder')" <div class="mt-[10px]">
/> <el-table :data="orderTableTable.data" size="large" v-loading="orderTableTable.loading">
</el-form-item> <template #empty>
<el-form-item :label="t('classId')" prop="class_id"> <span>{{ !orderTableTable.loading ? t('emptyData') : '' }}</span>
<el-input </template>
v-model="orderTableTable.searchParam.class_id" <el-table-column prop="resource_id_name" :label="t('resourceId')" min-width="120" :show-overflow-tooltip="true"/>
:placeholder="t('classIdPlaceholder')"
/> <el-table-column :label="t('orderStatus')" min-width="180" align="center" :show-overflow-tooltip="true">
</el-form-item> <template #default="{ row }">
<el-form-item :label="t('staffId')" prop="staff_id"> <div v-for="(item, index) in order_statusList">
<el-input <div v-if="item.value == row.order_status">{{ item.name }}</div>
v-model="orderTableTable.searchParam.staff_id" </div>
:placeholder="t('staffIdPlaceholder')" </template>
/> </el-table-column>
</el-form-item>
<el-form-item :label="t('resourceId')" prop="resource_id"> <el-table-column :label="t('paymentType')" min-width="180" align="center" :show-overflow-tooltip="true">
<el-input <template #default="{ row }">
v-model="orderTableTable.searchParam.resource_id" <div v-for="(item, index) in payment_typeList">
:placeholder="t('resourceIdPlaceholder')" <div v-if="item.value == row.payment_type">{{ item.name }}</div>
/> </div>
</el-form-item> </template>
<el-form-item </el-table-column>
:label="t('afterSalesStatus')"
prop="after_sales_status" <el-table-column prop="order_amount" :label="t('orderAmount')" min-width="120" :show-overflow-tooltip="true"/>
>
<el-input <el-table-column prop="course_id_name" :label="t('courseId')" min-width="120" :show-overflow-tooltip="true"/>
v-model="orderTableTable.searchParam.after_sales_status"
:placeholder="t('afterSalesStatusPlaceholder')" <el-table-column prop="class_id_name" :label="t('classId')" min-width="120" :show-overflow-tooltip="true"/>
/>
</el-form-item> <el-table-column prop="staff_id_name" :label="t('staffId')" min-width="120" :show-overflow-tooltip="true"/>
<el-form-item
:label="t('afterSalesReason')" <el-table-column prop="payment_time" :label="t('paymentTime')" min-width="120" :show-overflow-tooltip="true"/>
prop="after_sales_reason"
> <el-table-column :label="t('operation')" fixed="right" min-width="120">
<el-input <template #default="{ row }">
v-model="orderTableTable.searchParam.after_sales_reason" <el-button type="primary" link @click="editEvent(row)">{{ t('edit') }}</el-button>
:placeholder="t('afterSalesReasonPlaceholder')" <el-button type="primary" link @click="deleteEvent(row.id)">{{ t('delete') }}</el-button>
/> </template>
</el-form-item> </el-table-column>
<el-form-item :label="t('afterSalesTime')" prop="after_sales_time">
<el-input </el-table>
v-model="orderTableTable.searchParam.after_sales_time" <div class="mt-[16px] flex justify-end">
:placeholder="t('afterSalesTimePlaceholder')" <el-pagination v-model:current-page="orderTableTable.page" v-model:page-size="orderTableTable.limit"
/> layout="total, sizes, prev, pager, next, jumper" :total="orderTableTable.total"
</el-form-item> @size-change="loadOrderTableList()" @current-change="loadOrderTableList" />
<el-form-item :label="t('paymentTime')" prop="payment_time"> </div>
<el-input </div>
v-model="orderTableTable.searchParam.payment_time"
:placeholder="t('paymentTimePlaceholder')" <edit ref="editOrderTableDialog" @complete="loadOrderTableList" />
/> </el-card>
</el-form-item> </div>
<el-form-item </template>
:label="t('subscriptionPaymentTime')"
prop="subscription_payment_time" <script lang="ts" setup>
> import { reactive, ref, watch } from 'vue'
<el-input import { t } from '@/lang'
v-model="orderTableTable.searchParam.subscription_payment_time" import { useDictionary } from '@/app/api/dict'
:placeholder="t('subscriptionPaymentTimePlaceholder')" import { getOrderTableList, deleteOrderTable, getWithCustomerResourcesList, getWithCourseList, getWithClassGradeList, getWithPersonnelList } from '@/app/api/order_table'
/> import { img } from '@/utils/common'
</el-form-item> import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/order_table/components/order-table-edit.vue'
<el-form-item> import { useRoute } from 'vue-router'
<el-button type="primary" @click="loadOrderTableList()">{{ const route = useRoute()
t('search') const pageName = route.meta.title;
}}</el-button>
<el-button @click="resetForm(searchFormRef)">{{ let orderTableTable = reactive({
t('reset') page: 1,
}}</el-button> limit: 10,
</el-form-item> total: 0,
</el-form> loading: true,
</el-card> data: [],
searchParam:{
<div class="mt-[10px]"> "order_status":"",
<el-table "payment_type":""
:data="orderTableTable.data" }
size="large" })
v-loading="orderTableTable.loading"
> const searchFormRef = ref<FormInstance>()
<template #empty>
<span>{{ !orderTableTable.loading ? t('emptyData') : '' }}</span> //
</template> const selectData = ref<any[]>([])
<el-table-column
prop="payment_id" //
:label="t('paymentId')" const order_statusList = ref([] as any[])
min-width="120" const order_statusDictList = async () => {
:show-overflow-tooltip="true" order_statusList.value = await (await useDictionary('order_status')).data.dictionary
/> }
order_statusDictList();
<el-table-column const payment_typeList = ref([] as any[])
prop="order_status" const payment_typeDictList = async () => {
:label="t('orderStatus')" payment_typeList.value = await (await useDictionary('payment_type')).data.dictionary
min-width="120" }
:show-overflow-tooltip="true" payment_typeDictList();
/>
/**
<el-table-column * 获取订单列表
prop="payment_type" */
:label="t('paymentType')" const loadOrderTableList = (page: number = 1) => {
min-width="120" orderTableTable.loading = true
:show-overflow-tooltip="true" orderTableTable.page = page
/>
getOrderTableList({
<el-table-column page: orderTableTable.page,
prop="order_amount" limit: orderTableTable.limit,
:label="t('orderAmount')" ...orderTableTable.searchParam
min-width="120" }).then(res => {
:show-overflow-tooltip="true" orderTableTable.loading = false
/> orderTableTable.data = res.data.data
orderTableTable.total = res.data.total
<el-table-column }).catch(() => {
prop="course_id" orderTableTable.loading = false
:label="t('courseId')" })
min-width="120" }
:show-overflow-tooltip="true" loadOrderTableList()
/>
const editOrderTableDialog: Record<string, any> | null = ref(null)
<el-table-column
prop="class_id" /**
:label="t('classId')" * 添加订单
min-width="120" */
:show-overflow-tooltip="true" const addEvent = () => {
/> editOrderTableDialog.value.setFormData()
editOrderTableDialog.value.showDialog = true
<el-table-column }
prop="staff_id"
:label="t('staffId')" /**
min-width="120" * 编辑订单
:show-overflow-tooltip="true" * @param data
/> */
const editEvent = (data: any) => {
<el-table-column editOrderTableDialog.value.setFormData(data)
prop="resource_id" editOrderTableDialog.value.showDialog = true
:label="t('resourceId')" }
min-width="120"
:show-overflow-tooltip="true" /**
/> * 删除订单
*/
<el-table-column const deleteEvent = (id: number) => {
prop="after_sales_status" ElMessageBox.confirm(t('orderTableDeleteTips'), t('warning'),
:label="t('afterSalesStatus')" {
min-width="120" confirmButtonText: t('confirm'),
:show-overflow-tooltip="true" cancelButtonText: t('cancel'),
/> type: 'warning',
}
<el-table-column ).then(() => {
prop="after_sales_reason" deleteOrderTable(id).then(() => {
:label="t('afterSalesReason')" loadOrderTableList()
min-width="120" }).catch(() => {
:show-overflow-tooltip="true" })
/> })
}
<el-table-column
prop="after_sales_time"
:label="t('afterSalesTime')" const resourceIdList = ref([])
min-width="120" const setResourceIdList = async () => {
:show-overflow-tooltip="true" resourceIdList.value = await (await getWithCustomerResourcesList({})).data
/> }
setResourceIdList()
<el-table-column const courseIdList = ref([])
prop="payment_time" const setCourseIdList = async () => {
:label="t('paymentTime')" courseIdList.value = await (await getWithCourseList({})).data
min-width="120" }
:show-overflow-tooltip="true" setCourseIdList()
/> const classIdList = ref([])
const setClassIdList = async () => {
<el-table-column classIdList.value = await (await getWithClassGradeList({})).data
prop="subscription_payment_time" }
:label="t('subscriptionPaymentTime')" setClassIdList()
min-width="120" const staffIdList = ref([])
:show-overflow-tooltip="true" const setStaffIdList = async () => {
/> staffIdList.value = await (await getWithPersonnelList({})).data
}
<el-table-column setStaffIdList()
:label="t('operation')"
fixed="right" const resetForm = (formEl: FormInstance | undefined) => {
min-width="120" if (!formEl) return
> formEl.resetFields()
<template #default="{ row }"> loadOrderTableList()
<el-button type="primary" link @click="editEvent(row)">{{ }
t('edit') </script>
}}</el-button>
<el-button type="primary" link @click="deleteEvent(row.id)">{{ <style lang="scss" scoped>
t('delete') /* 多行超出隐藏 */
}}</el-button> .multi-hidden {
</template> word-break: break-all;
</el-table-column> text-overflow: ellipsis;
</el-table> overflow: hidden;
<div class="mt-[16px] flex justify-end"> display: -webkit-box;
<el-pagination -webkit-line-clamp: 2;
v-model:current-page="orderTableTable.page" -webkit-box-orient: vertical;
v-model:page-size="orderTableTable.limit" }
layout="total, sizes, prev, pager, next, jumper" </style>
:total="orderTableTable.total"
@size-change="loadOrderTableList()"
@current-change="loadOrderTableList"
/>
</div>
</div>
<edit ref="editOrderTableDialog" @complete="loadOrderTableList" />
</el-card>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue'
import { t } from '@/lang'
import { useDictionary } from '@/app/api/dict'
import { getOrderTableList, deleteOrderTable } from '@/app/api/order_table'
import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/order_table/components/order-table-edit.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
const pageName = route.meta.title
let orderTableTable = reactive({
page: 1,
limit: 10,
total: 0,
loading: true,
data: [],
searchParam: {
payment_id: '',
order_status: '',
payment_type: '',
order_amount: '',
course_id: '',
class_id: '',
staff_id: '',
resource_id: '',
after_sales_status: '',
after_sales_reason: '',
after_sales_time: '',
payment_time: '',
subscription_payment_time: '',
},
})
const searchFormRef = ref<FormInstance>()
//
const selectData = ref<any[]>([])
//
/**
* 获取订单列表
*/
const loadOrderTableList = (page: number = 1) => {
orderTableTable.loading = true
orderTableTable.page = page
getOrderTableList({
page: orderTableTable.page,
limit: orderTableTable.limit,
...orderTableTable.searchParam,
})
.then((res) => {
orderTableTable.loading = false
orderTableTable.data = res.data.data
orderTableTable.total = res.data.total
})
.catch(() => {
orderTableTable.loading = false
})
}
loadOrderTableList()
const editOrderTableDialog: Record<string, any> | null = ref(null)
/**
* 添加订单
*/
const addEvent = () => {
editOrderTableDialog.value.setFormData()
editOrderTableDialog.value.showDialog = true
}
/**
* 编辑订单
* @param data
*/
const editEvent = (data: any) => {
editOrderTableDialog.value.setFormData(data)
editOrderTableDialog.value.showDialog = true
}
/**
* 删除订单
*/
const deleteEvent = (id: number) => {
ElMessageBox.confirm(t('orderTableDeleteTips'), t('warning'), {
confirmButtonText: t('confirm'),
cancelButtonText: t('cancel'),
type: 'warning',
}).then(() => {
deleteOrderTable(id)
.then(() => {
loadOrderTableList()
})
.catch(() => {})
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
loadOrderTableList()
}
</script>
<style lang="scss" scoped>
/* 多行超出隐藏 */
.multi-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
</style>

6
niucloud/app/adminapi/controller/customer_resources/CustomerResources.php

@ -29,8 +29,12 @@ class CustomerResources extends BaseAdminController
public function lists(){ public function lists(){
$data = $this->request->params([ $data = $this->request->params([
["name",""], ["name",""],
["age",""],
["gender",""],
["phone_number",""], ["phone_number",""],
["type","khzy"] ["type","khzy"],
["created_at",[]],
["updated_at",[]],
]); ]);
return success((new CustomerResourcesService())->getPage($data)); return success((new CustomerResourcesService())->getPage($data));
} }

49
niucloud/app/adminapi/controller/order_table/OrderTable.php

@ -28,19 +28,8 @@ class OrderTable extends BaseAdminController
*/ */
public function lists(){ public function lists(){
$data = $this->request->params([ $data = $this->request->params([
["payment_id",""],
["order_status",""], ["order_status",""],
["payment_type",""], ["payment_type",""]
["order_amount",""],
["course_id",""],
["class_id",""],
["staff_id",""],
["resource_id",""],
["after_sales_status",""],
["after_sales_reason",""],
["after_sales_time",""],
["payment_time",""],
["subscription_payment_time",""]
]); ]);
return success((new OrderTableService())->getPage($data)); return success((new OrderTableService())->getPage($data));
} }
@ -60,19 +49,13 @@ class OrderTable extends BaseAdminController
*/ */
public function add(){ public function add(){
$data = $this->request->params([ $data = $this->request->params([
["payment_id",""], ["resource_id",0],
["order_status",""], ["order_status",""],
["payment_type",""], ["payment_type",""],
["order_amount",0.00], ["order_amount",0.00],
["course_id",0], ["course_id",0],
["class_id",0], ["class_id",0],
["staff_id",0],
["resource_id",0],
["after_sales_status",""],
["after_sales_reason",""],
["after_sales_time",1747388736],
["payment_time",1747388736],
["subscription_payment_time",1747388736]
]); ]);
$this->validate($data, 'app\validate\order_table\OrderTable.add'); $this->validate($data, 'app\validate\order_table\OrderTable.add');
$id = (new OrderTableService())->add($data); $id = (new OrderTableService())->add($data);
@ -86,19 +69,13 @@ class OrderTable extends BaseAdminController
*/ */
public function edit(int $id){ public function edit(int $id){
$data = $this->request->params([ $data = $this->request->params([
["payment_id",""], ["resource_id",0],
["order_status",""], ["order_status",""],
["payment_type",""], ["payment_type",""],
["order_amount",0.00], ["order_amount",0.00],
["course_id",0], ["course_id",0],
["class_id",0], ["class_id",0],
["staff_id",0],
["resource_id",0],
["after_sales_status",""],
["after_sales_reason",""],
["after_sales_time",1747388736],
["payment_time",1747388736],
["subscription_payment_time",1747388736]
]); ]);
$this->validate($data, 'app\validate\order_table\OrderTable.edit'); $this->validate($data, 'app\validate\order_table\OrderTable.edit');
(new OrderTableService())->edit($id, $data); (new OrderTableService())->edit($id, $data);
@ -116,4 +93,20 @@ class OrderTable extends BaseAdminController
} }
public function getCustomerResourcesAll(){
return success(( new OrderTableService())->getCustomerResourcesAll());
}
public function getCourseAll(){
return success(( new OrderTableService())->getCourseAll());
}
public function getClassGradeAll(){
return success(( new OrderTableService())->getClassGradeAll());
}
public function getPersonnelAll(){
return success(( new OrderTableService())->getPersonnelAll());
}
} }

10
niucloud/app/adminapi/route/order_table.php

@ -14,6 +14,8 @@ use think\facade\Route;
use app\adminapi\middleware\AdminCheckRole; use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken; use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog; use app\adminapi\middleware\AdminLog;
// USER_CODE_BEGIN -- order_table // USER_CODE_BEGIN -- order_table
Route::group('order_table', function () { Route::group('order_table', function () {
@ -29,6 +31,14 @@ Route::group('order_table', function () {
//删除订单 //删除订单
Route::delete('order_table/:id', 'order_table.OrderTable/del'); Route::delete('order_table/:id', 'order_table.OrderTable/del');
Route::get('customer_resources_all','order_table.OrderTable/getCustomerResourcesAll');
Route::get('course_all','order_table.OrderTable/getCourseAll');
Route::get('class_grade_all','order_table.OrderTable/getClassGradeAll');
Route::get('personnel_all','order_table.OrderTable/getPersonnelAll');
})->middleware([ })->middleware([
AdminCheckToken::class, AdminCheckToken::class,
AdminCheckRole::class, AdminCheckRole::class,

226
niucloud/app/model/class_grade/ClassGrade.php

@ -0,0 +1,226 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\model\class_grade;
use core\base\BaseModel;
use think\model\concern\SoftDelete;
use think\model\relation\HasMany;
use think\model\relation\HasOne;
/**
* 班级模型
* Class Class
* @package app\model\class
*/
class ClassGrade extends BaseModel
{
use SoftDelete;
/**
* 数据表主键
* @var string
*/
protected $pk = 'id';
/**
* 模型名称
* @var string
*/
protected $name = 'class';
/**
* 定义软删除标记字段.
* @var string
*/
protected $deleteTime = 'deleted_at';
/**
* 定义软删除字段的默认值.
* @var int
*/
protected $defaultSoftDelete = 0;
/**
* 搜索器:班级班级编号
* @param $value
* @param $data
*/
public function searchIdAttr($query, $value, $data)
{
if ($value) {
$query->where("id", $value);
}
}
/**
* 搜索器:班级校区ID
* @param $value
* @param $data
*/
public function searchCampusIdAttr($query, $value, $data)
{
if ($value) {
$query->where("campus_id", $value);
}
}
/**
* 搜索器:班级校区名称
* @param $value
* @param $data
*/
public function searchCampusNameAttr($query, $value, $data)
{
if ($value) {
$query->where("campus_name", $value);
}
}
/**
* 搜索器:班级班级名称
* @param $value
* @param $data
*/
public function searchClassNameAttr($query, $value, $data)
{
if ($value) {
$query->where("class_name", $value);
}
}
/**
* 搜索器:班级班级主教练
* @param $value
* @param $data
*/
public function searchHeadCoachAttr($query, $value, $data)
{
if ($value) {
$query->where("head_coach", $value);
}
}
/**
* 搜索器:班级班级授课年龄段
* @param $value
* @param $data
*/
public function searchAgeGroupAttr($query, $value, $data)
{
if ($value) {
$query->where("age_group", $value);
}
}
/**
* 搜索器:班级班级类型
* @param $value
* @param $data
*/
public function searchClassTypeAttr($query, $value, $data)
{
if ($value) {
$query->where("class_type", $value);
}
}
/**
* 搜索器:班级班级助教
* @param $value
* @param $data
*/
public function searchAssistantCoachAttr($query, $value, $data)
{
if ($value) {
$query->where("assistant_coach", $value);
}
}
/**
* 搜索器:班级创建时间
* @param $value
* @param $data
*/
public function searchCreatedAtAttr($query, $value, $data)
{
if ($value) {
$query->where("created_at", $value);
}
}
/**
* 搜索器:班级修改时间
* @param $value
* @param $data
*/
public function searchUpdatedAtAttr($query, $value, $data)
{
if ($value) {
$query->where("updated_at", $value);
}
}
/**
* 搜索器:班级逻辑删除时间
* @param $value
* @param $data
*/
public function searchDeletedAtAttr($query, $value, $data)
{
if ($value) {
$query->where("deleted_at", $value);
}
}
/**
* 搜索器:班级班级状态
* @param $value
* @param $data
*/
public function searchStatusAttr($query, $value, $data)
{
if ($value) {
$query->where("status", $value);
}
}
/**
* 搜索器:班级班级排序
* @param $value
* @param $data
*/
public function searchSortOrderAttr($query, $value, $data)
{
if ($value) {
$query->where("sort_order", $value);
}
}
/**
* 搜索器:班级班级备注
* @param $value
* @param $data
*/
public function searchRemarksAttr($query, $value, $data)
{
if ($value) {
$query->where("remarks", $value);
}
}
}

166
niucloud/app/model/order_table/OrderTable.php

@ -16,6 +16,14 @@ use think\model\concern\SoftDelete;
use think\model\relation\HasMany; use think\model\relation\HasMany;
use think\model\relation\HasOne; use think\model\relation\HasOne;
use app\model\customer_resources\CustomerResources;
use app\model\course\Course;
use app\model\class_grade\ClassGrade;
use app\model\personnel\Personnel;
/** /**
* 订单模型 * 订单模型
* Class OrderTable * Class OrderTable
@ -43,31 +51,7 @@ class OrderTable extends BaseModel
/** /**
* 搜索器:订单订单编号 * 搜索器:订单订单状态
* @param $value
* @param $data
*/
public function searchIdAttr($query, $value, $data)
{
if ($value) {
$query->where("id", $value);
}
}
/**
* 搜索器:订单支付编号
* @param $value
* @param $data
*/
public function searchPaymentIdAttr($query, $value, $data)
{
if ($value) {
$query->where("payment_id", $value);
}
}
/**
* 搜索器:订单订单状态: pending-待支付, paid-已支付
* @param $value * @param $value
* @param $data * @param $data
*/ */
@ -79,7 +63,7 @@ class OrderTable extends BaseModel
} }
/** /**
* 搜索器:订单付款类型: cash-现金支付, scan_code-扫码支付, subscription-订阅支付 * 搜索器:订单付款类型
* @param $value * @param $value
* @param $data * @param $data
*/ */
@ -90,129 +74,25 @@ class OrderTable extends BaseModel
} }
} }
/**
* 搜索器:订单订单金额
* @param $value
* @param $data
*/
public function searchOrderAmountAttr($query, $value, $data)
{
if ($value) {
$query->where("order_amount", $value);
}
}
/**
* 搜索器:订单课程ID
* @param $value
* @param $data
*/
public function searchCourseIdAttr($query, $value, $data)
{
if ($value) {
$query->where("course_id", $value);
}
}
/**
* 搜索器:订单班级ID
* @param $value
* @param $data
*/
public function searchClassIdAttr($query, $value, $data)
{
if ($value) {
$query->where("class_id", $value);
}
}
/**
* 搜索器:订单人员ID
* @param $value
* @param $data
*/
public function searchStaffIdAttr($query, $value, $data)
{
if ($value) {
$query->where("staff_id", $value);
}
}
/**
* 搜索器:订单资源ID
* @param $value
* @param $data
*/
public function searchResourceIdAttr($query, $value, $data)
{
if ($value) {
$query->where("resource_id", $value);
}
}
/**
* 搜索器:订单售后状态
* @param $value
* @param $data
*/
public function searchAfterSalesStatusAttr($query, $value, $data)
{
if ($value) {
$query->where("after_sales_status", $value);
}
}
/**
* 搜索器:订单售后原因
* @param $value
* @param $data
*/
public function searchAfterSalesReasonAttr($query, $value, $data)
{
if ($value) {
$query->where("after_sales_reason", $value);
}
}
/** public function customerResources(){
* 搜索器:订单售后时间 return $this->hasOne(CustomerResources::class, 'id', 'resource_id')->joinType('left')->withField('name,id')->bind(['resource_id_name'=>'name']);
* @param $value
* @param $data
*/
public function searchAfterSalesTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("after_sales_time", $value);
}
} }
/** public function course(){
* 搜索器:订单支付时间 return $this->hasOne(Course::class, 'id', 'course_id')->joinType('left')->withField('course_name,id')->bind(['course_id_name'=>'course_name']);
* @param $value
* @param $data
*/
public function searchPaymentTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("payment_time", $value);
}
} }
/** public function classGrade(){
* 搜索器:订单订阅支付生成时间 return $this->hasOne(ClassGrade::class, 'id', 'class_id')->joinType('left')->withField('class_name,id')->bind(['class_id_name'=>'class_name']);
* @param $value
* @param $data
*/
public function searchSubscriptionPaymentTimeAttr($query, $value, $data)
{
if ($value) {
$query->where("subscription_payment_time", $value);
}
} }
public function personnel(){
return $this->hasOne(Personnel::class, 'id', 'staff_id')->joinType('left')->withField('name,id')->bind(['staff_id_name'=>'name']);
}
} }

40
niucloud/app/service/admin/customer_resources/CustomerResourcesService.php

@ -42,6 +42,7 @@ class CustomerResourcesService extends BaseAdminService
*/ */
public function getPage(array $data = []) public function getPage(array $data = [])
{ {
// dump($data);die;
$field = 'a.*,b.id as shared_id'; $field = 'a.*,b.id as shared_id';
$order = 'a.id desc'; $order = 'a.id desc';
$where = []; $where = [];
@ -53,16 +54,39 @@ class CustomerResourcesService extends BaseAdminService
$where[] = ['a.name','=',$data['name']]; $where[] = ['a.name','=',$data['name']];
} }
if($data['age']){
$where[] = ['a.age','=',$data['age']];
}
if($data['gender']){
$where[] = ['a.gender','=',$data['gender']];
}
if($data['type'] == 'yjfp'){ if($data['type'] == 'yjfp'){
$where[] = ['b.shared_by','=',0]; $where[] = ['b.shared_by','=',0];
} }
$search_model = $this->model $search_model = $this->model
->alias("a") ->alias("a")
->join(['school_resource_sharing' => 'b'],'a.id = b.resource_id','left') ->join(['school_resource_sharing' => 'b'],'a.id = b.resource_id','left')
->where($where) ->where($where)
->with(['personnel'])->field($field)->order($order); ->with(['personnel'])->field($field)->order($order);
if (isset($data['created_at'][0]) && isset($data['created_at'][1])) {
$search_model->whereBetweenTime('created_at', $data['created_at'][0]."00:00:00", $data['created_at'][1]."23:59:59");
}
if (isset($data['updated_at'][0]) && isset($data['updated_at'][1])) {
$search_model->whereBetweenTime('updated_at', $data['updated_at'][0]."00:00:00", $data['updated_at'][1]."23:59:59");
}
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
@ -152,19 +176,19 @@ class CustomerResourcesService extends BaseAdminService
public function edit(int $id, array $data) public function edit(int $id, array $data)
{ {
$personnel = new Personnel(); $personnel = new Personnel();
$data['consultant'] = $personnel->where(['sys_user_id' => $this->uid])->value("id"); // $data['consultant'] = $personnel->where(['sys_user_id' => $this->uid])->value("id");
if(!$data['consultant']){ // if(!$data['consultant']){
return fail("操作失败"); // return fail("操作失败");
} // }
// $data['consultant'] = 1; $data['consultant'] = 1;
$res = $this->model->where([['id', '=', $id]])->findOrEmpty()->toArray(); $res = $this->model->where([['id', '=', $id]])->findOrEmpty()->toArray();
$this->model->where([['id', '=', $id]])->update([ $this->model->where([['id', '=', $id]])->update([
'source' => $data['source'], 'source' => $data['source'],
'source_channel' => $data['source_channel'], 'source_channel' => $data['source_channel'],
'consultant' => $data['consultant'], // 'consultant' => $data['consultant'],
'name' => $data['name'], 'name' => $data['name'],
'age' => $data['age'], 'age' => $data['age'],
'gender' => $data['gender'], 'gender' => $data['gender'],
@ -201,7 +225,7 @@ class CustomerResourcesService extends BaseAdminService
if($data['purchase_power']){ if($data['purchase_power']){
$sixSpeedModificationLog = new SixSpeedModificationLog(); $sixSpeedModificationLog = new SixSpeedModificationLog();
$six_id = $sixSpeed->where(['resource_id' => $id])->value("id"); $six_id = $sixSpeed->where(['resource_id' => $id])->value("id");
$data['staff_id'] = $data['consultant']; // $data['staff_id'] = $data['consultant'];
@ -217,7 +241,7 @@ class CustomerResourcesService extends BaseAdminService
'first_visit_status' => $data['first_visit_status'], 'first_visit_status' => $data['first_visit_status'],
'second_visit_status' => $data['second_visit_status'], 'second_visit_status' => $data['second_visit_status'],
'is_closed' => $data['is_closed'], 'is_closed' => $data['is_closed'],
'staff_id' => $data['staff_id'], // 'staff_id' => $data['staff_id'],
'resource_id' => $id 'resource_id' => $id
]; ];
if($six_id){ if($six_id){

42
niucloud/app/service/admin/order_table/OrderTableService.php

@ -12,6 +12,10 @@
namespace app\service\admin\order_table; namespace app\service\admin\order_table;
use app\model\order_table\OrderTable; use app\model\order_table\OrderTable;
use app\model\customer_resources\CustomerResources;
use app\model\course\Course;
use app\model\class_grade\ClassGrade;
use app\model\personnel\Personnel;
use core\base\BaseAdminService; use core\base\BaseAdminService;
@ -36,10 +40,10 @@ class OrderTableService extends BaseAdminService
*/ */
public function getPage(array $where = []) public function getPage(array $where = [])
{ {
$field = 'id,payment_id,order_status,payment_type,order_amount,course_id,class_id,staff_id,resource_id,after_sales_status,after_sales_reason,after_sales_time,created_at,updated_at,payment_time,subscription_payment_time'; $field = 'id,resource_id,payment_id,order_status,payment_type,order_amount,course_id,class_id,staff_id,after_sales_status,after_sales_reason,after_sales_time,created_at,updated_at,payment_time,subscription_payment_time';
$order = 'id desc'; $order = 'id desc';
$search_model = $this->model->withSearch(["id","payment_id","order_status","payment_type","order_amount","course_id","class_id","staff_id","resource_id","after_sales_status","after_sales_reason","after_sales_time","payment_time","subscription_payment_time"], $where)->field($field)->order($order); $search_model = $this->model->withSearch(["order_status","payment_type"], $where)->with(['customerResources','course','classGrade','personnel'])->field($field)->order($order);
$list = $this->pageQuery($search_model); $list = $this->pageQuery($search_model);
return $list; return $list;
} }
@ -51,9 +55,9 @@ class OrderTableService extends BaseAdminService
*/ */
public function getInfo(int $id) public function getInfo(int $id)
{ {
$field = 'id,payment_id,order_status,payment_type,order_amount,course_id,class_id,staff_id,resource_id,after_sales_status,after_sales_reason,after_sales_time,created_at,updated_at,payment_time,subscription_payment_time'; $field = 'id,resource_id,payment_id,order_status,payment_type,order_amount,course_id,class_id,staff_id,after_sales_status,after_sales_reason,after_sales_time,created_at,updated_at,payment_time,subscription_payment_time';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray(); $info = $this->model->field($field)->where([['id', "=", $id]])->with(['customerResources','course','classGrade','personnel'])->findOrEmpty()->toArray();
return $info; return $info;
} }
@ -64,6 +68,14 @@ class OrderTableService extends BaseAdminService
*/ */
public function add(array $data) public function add(array $data)
{ {
$personnel = new Personnel();
$data['staff_id'] = $personnel->where(['sys_user_id' => $this->uid])->value("id");
if(!$data['staff_id']){
return fail("操作失败");
}
// $data['staff_id'] = 1;
$res = $this->model->create($data); $res = $this->model->create($data);
return $res->id; return $res->id;
@ -94,6 +106,26 @@ class OrderTableService extends BaseAdminService
return $res; return $res;
} }
public function getCustomerResourcesAll(){
$customerResourcesModel = new CustomerResources();
return $customerResourcesModel->select()->toArray();
}
public function getCourseAll(){
$courseModel = new Course();
return $courseModel->select()->toArray();
}
public function getClassGradeAll(){
$classGradeModel = new ClassGrade();
return $classGradeModel->select()->toArray();
}
public function getPersonnelAll(){
$personnelModel = new Personnel();
return $personnelModel->select()->toArray();
}
} }

12
niucloud/app/validate/order_table/OrderTable.php

@ -20,30 +20,26 @@ class OrderTable extends BaseValidate
{ {
protected $rule = [ protected $rule = [
'payment_id' => 'require', 'resource_id' => 'require',
'order_status' => 'require', 'order_status' => 'require',
'payment_type' => 'require', 'payment_type' => 'require',
'order_amount' => 'require', 'order_amount' => 'require',
'course_id' => 'require', 'course_id' => 'require',
'class_id' => 'require', 'class_id' => 'require',
'staff_id' => 'require',
'resource_id' => 'require',
]; ];
protected $message = [ protected $message = [
'payment_id.require' => ['common_validate.require', ['payment_id']], 'resource_id.require' => ['common_validate.require', ['resource_id']],
'order_status.require' => ['common_validate.require', ['order_status']], 'order_status.require' => ['common_validate.require', ['order_status']],
'payment_type.require' => ['common_validate.require', ['payment_type']], 'payment_type.require' => ['common_validate.require', ['payment_type']],
'order_amount.require' => ['common_validate.require', ['order_amount']], 'order_amount.require' => ['common_validate.require', ['order_amount']],
'course_id.require' => ['common_validate.require', ['course_id']], 'course_id.require' => ['common_validate.require', ['course_id']],
'class_id.require' => ['common_validate.require', ['class_id']], 'class_id.require' => ['common_validate.require', ['class_id']],
'staff_id.require' => ['common_validate.require', ['staff_id']],
'resource_id.require' => ['common_validate.require', ['resource_id']],
]; ];
protected $scene = [ protected $scene = [
"add" => ['payment_id', 'order_status', 'payment_type', 'order_amount', 'course_id', 'class_id', 'staff_id', 'resource_id', 'after_sales_status', 'after_sales_reason', 'after_sales_time', 'payment_time', 'subscription_payment_time'], "add" => ['resource_id', 'order_status', 'payment_type', 'order_amount', 'course_id', 'class_id'],
"edit" => ['payment_id', 'order_status', 'payment_type', 'order_amount', 'course_id', 'class_id', 'staff_id', 'resource_id', 'after_sales_status', 'after_sales_reason', 'after_sales_time', 'payment_time', 'subscription_payment_time'] "edit" => ['resource_id', 'order_status', 'payment_type', 'order_amount', 'course_id', 'class_id']
]; ];
} }

Loading…
Cancel
Save