diff --git a/admin/src/app/api/school_approval/process.ts b/admin/src/app/api/school_approval/process.ts index 133cd457..1ee13814 100644 --- a/admin/src/app/api/school_approval/process.ts +++ b/admin/src/app/api/school_approval/process.ts @@ -5,7 +5,7 @@ import request from '@/utils/request' * @param params */ export function getProcessList(params?: Record) { - return request.get({ url: '/school_approval/process/lists', params }) + return request.get('/school_approval/process/lists', { params }) } /** @@ -13,7 +13,7 @@ export function getProcessList(params?: Record) { * @param params */ export function getProcessInfo(params: { id: number }) { - return request.get({ url: '/school_approval/process/info', params }) + return request.get('/school_approval/process/info', { params }) } /** @@ -21,7 +21,7 @@ export function getProcessInfo(params: { id: number }) { * @param params */ export function createProcess(params: any) { - return request.post({ url: '/school_approval/process/create', data: params }) + return request.post('/school_approval/process/create', params) } /** @@ -29,7 +29,7 @@ export function createProcess(params: any) { * @param params */ export function approveProcess(params: { process_id: number; status: string; remarks?: string }) { - return request.post({ url: '/school_approval/process/approve', data: params }) + return request.post('/school_approval/process/approve', params) } /** @@ -37,5 +37,5 @@ export function approveProcess(params: { process_id: number; status: string; rem * @param params */ export function cancelProcess(params: { process_id: number }) { - return request.post({ url: '/school_approval/process/cancel', data: params }) + return request.post('/school_approval/process/cancel', params) } \ No newline at end of file diff --git a/admin/src/app/api/service_logs.js b/admin/src/app/api/service_logs.js new file mode 100644 index 00000000..9eec98b6 --- /dev/null +++ b/admin/src/app/api/service_logs.js @@ -0,0 +1,13 @@ +import request from '@/utils/request' + + +// USER_CODE_BEGIN -- service_logs +/** + * + * @param params + * @returns + */ +export function getServiceLogsList(params) { + return request.get(`service_logs/service_logs`, {params}) +} + diff --git a/admin/src/app/api/sys.ts b/admin/src/app/api/sys.ts index 71867e9e..16e1a4b2 100644 --- a/admin/src/app/api/sys.ts +++ b/admin/src/app/api/sys.ts @@ -796,3 +796,16 @@ export function setDocument(params: Record) { export function getScsjtj(params: Record) { return request.post('sys/scsjtj', params) } + +export function person_all() { + return request.get('sys/person_all') +} + + +export function role_all() { + return request.get('sys/role_all') +} + +export function departments_all() { + return request.get('sys/departments_all') +} diff --git a/admin/src/app/views/customer_resources/components/UserProfile.vue b/admin/src/app/views/customer_resources/components/UserProfile.vue new file mode 100644 index 00000000..666f903a --- /dev/null +++ b/admin/src/app/views/customer_resources/components/UserProfile.vue @@ -0,0 +1,141 @@ + + + + + \ No newline at end of file diff --git a/admin/src/app/views/customer_resources/customer_resources.vue b/admin/src/app/views/customer_resources/customer_resources.vue index fd0a598b..e8d0d138 100644 --- a/admin/src/app/views/customer_resources/customer_resources.vue +++ b/admin/src/app/views/customer_resources/customer_resources.vue @@ -127,6 +127,9 @@ 客户信息修改记录 + + 客户详情 + {{ t('edit') }} @@ -180,6 +183,7 @@ + @@ -195,6 +199,8 @@ import Fp from '@/app/views/customer_resources/components/fp.vue' import Order from '@/app/views/order_table/components/order-table-edit.vue' import Tc from '@/app/views/tc_dialog/tc_dialog.vue' + import User from '@/app/views/customer_resources/components/UserProfile.vue' + import { ArrowDown } from '@element-plus/icons-vue' import { getMemberLabelAll } from '@/app/api/member' @@ -244,6 +250,9 @@ case 'deleteEvent': deleteEvent(row.id) break + case 'UserProfile': + UserProfile(row) + break } } @@ -276,7 +285,8 @@ editOrderTableDialog.value.setFormData(row) editOrderTableDialog.value.showDialog = true } - + + const TcCustomerResourcesDialog : Record | null = ref(null) const tcEvent = (row : any) => { @@ -290,8 +300,13 @@ } + const UserProfileDialog : Record | null = ref(null) - + const UserProfile = (row : any) => { + UserProfileDialog.value.setFormData(row) + UserProfileDialog.value.showDialog = true + } + const searchFormRef = ref() // 选中数据 diff --git a/admin/src/app/views/school_approval/config/index.vue b/admin/src/app/views/school_approval/config/index.vue index 8cb1d743..2b3b9b32 100644 --- a/admin/src/app/views/school_approval/config/index.vue +++ b/admin/src/app/views/school_approval/config/index.vue @@ -1,638 +1,625 @@ \ No newline at end of file + diff --git a/admin/src/app/views/school_approval/process/index.vue b/admin/src/app/views/school_approval/process/index.vue index f1426540..cad1d932 100644 --- a/admin/src/app/views/school_approval/process/index.vue +++ b/admin/src/app/views/school_approval/process/index.vue @@ -5,14 +5,14 @@
- {{ $t('approval.process.create') }} + {{ '创建(测试暂留)' }}
- - - + + + - {{ $t('common.search') }} + {{ '搜索' }} - {{ $t('common.reset') }} + {{ '重置' }}
- - - + + + - - - - - - + + + + + + - + @@ -103,7 +103,7 @@ - + - + - + @@ -154,7 +154,7 @@ - + - {{ $t('approval.process.approved') }} - {{ $t('approval.process.rejected') }} + {{ '已审批' }} + {{ '已拒绝' }} - + @@ -191,41 +191,41 @@ - + {{ state.detailDialog.info.id }} - + {{ state.detailDialog.info.process_name }} - - {{ state.detailDialog.info.applicant_id }} + + {{ state.detailDialog.info.applicant_name }} - + {{ state.detailDialog.info.application_time }} - - {{ state.detailDialog.info.current_approver_id }} + + {{ state.detailDialog.info.current_approver_name }} - + {{ getStatusText(state.detailDialog.info.approval_status) }} - + {{ state.detailDialog.info.approval_time || '-' }} - + {{ state.detailDialog.info.remarks || '-' }}
-
{{ $t('approval.process.participants') }}
+
{{ '参与者' }}
- {{ $t('approval.process.participantLabel', { index: index + 1 }) }} + {{ '参与者' + (index + 1) }}
- {{ $t('approval.process.participantId') }}:{{ node.participant_id }} + {{ '参与者' }}:{{ node.name }}
- {{ $t('approval.process.sequence') }}:{{ node.sequence }} + {{ '顺序' }}:{{ node.sequence }}
- {{ $t('approval.process.status') }}:{{ getStatusText(node.status) }} + {{ '状态' }}:{{ getStatusText(node.status) }}
- {{ $t('approval.process.signType') }}:{{ node.sign_type === 'or_sign' ? $t('approval.process.orSign') : $t('approval.process.andSign') }} + {{ '签名类型' }}:{{ node.sign_type === 'or_sign' ? '或签名' : '和签名' }}
- {{ $t('approval.process.remarks') }}:{{ node.remarks || '-' }} + {{ '备注' }}:{{ node.remarks || '-' }}
@@ -263,23 +263,39 @@ import { reactive, ref, onMounted } from 'vue' import { ElMessage, ElMessageBox, FormInstance } from 'element-plus' import { getProcessList, getProcessInfo, createProcess, approveProcess, cancelProcess } from '@/app/api/school_approval/process' import { getConfigList } from '@/app/api/school_approval/config' -import { useI18n } from 'vue-i18n' +// import { useI18n } from 'vue-i18n' // import { useUserInfo } from '@/stores/userInfo' -const { t } = useI18n() +// const { t } = useI18n() // const userInfo = useUserInfo() // 表单引用 const createFormRef = ref() const approveFormRef = ref() +// 在script区域顶部添加接口定义 +interface ConfigOption { + label: string; + value: number; +} + +interface Participant { + participant_id: number; + sequence: number; + status: string; + sign_type: string; + remarks?: string; +} + // 状态 const state = reactive({ loading: false, processList: [], total: 0, activeTab: 'all', - userInfo: null, + userInfo: { + uid: 1 // 提供一个默认的用户ID,实际项目中应该从store获取 + }, searchParams: { page: 1, limit: 10, @@ -288,7 +304,7 @@ const state = reactive({ applicant_id: 0, approver_id: 0 }, - configOptions: [], // 审批流配置选项 + configOptions: [] as ConfigOption[], // 添加类型标注 createDialog: { visible: false, loading: false, @@ -299,10 +315,10 @@ const state = reactive({ }, rules: { process_name: [ - { required: true, message: t('approval.process.processNameRequired'), trigger: 'blur' } + { required: true, message: '请输入流程名称', trigger: 'blur' } ], config_id: [ - { required: true, message: t('approval.process.configIdRequired'), trigger: 'change' } + { required: true, message: '请选择审批流配置', trigger: 'change' } ] } }, @@ -316,13 +332,23 @@ const state = reactive({ }, rules: { status: [ - { required: true, message: t('approval.process.statusRequired'), trigger: 'change' } + { required: true, message: '请选择审批状态', trigger: 'change' } ] } }, detailDialog: { visible: false, - info: {} + info: { + id: 0, + process_name: '', + applicant_id: 0, + application_time: '', + current_approver_id: 0, + approval_status: '', + approval_time: '', + remarks: '', + participants: [] as Participant[] // 添加类型标注 + } } }) @@ -394,11 +420,11 @@ function handleTabChange() { async function getConfigOptions() { try { const res = await getConfigList({ status: 1 }) - state.configOptions = res.data.list.map((item: any) => { + state.configOptions = (res.data.list || []).map((item: any) => { return { - label: item.config_name, - value: item.id - } + label: item.config_name || '', + value: item.id || 0 + } as ConfigOption }) } catch (error) { console.error(error) @@ -425,7 +451,7 @@ async function handleCreateSubmit() { state.createDialog.loading = true try { await createProcess(state.createDialog.form) - ElMessage.success(t('approval.process.createSuccess')) + ElMessage.success('创建成功') state.createDialog.visible = false getList() } catch (error) { @@ -460,7 +486,7 @@ async function handleApproveSubmit() { status: state.approveDialog.form.status, remarks: state.approveDialog.form.remarks }) - ElMessage.success(t('approval.process.approveSuccess')) + ElMessage.success('审批成功') state.approveDialog.visible = false getList() } catch (error) { @@ -473,15 +499,15 @@ async function handleApproveSubmit() { // 撤销 function handleCancel(row: any) { - ElMessageBox.confirm(t('approval.process.confirmCancel'), t('common.warning'), { - confirmButtonText: t('common.confirm'), - cancelButtonText: t('common.cancel'), + ElMessageBox.confirm('确认取消审批?', '警告', { + confirmButtonText: '确认', + cancelButtonText: '取消', type: 'warning' }) .then(async () => { try { await cancelProcess({ process_id: row.id }) - ElMessage.success(t('approval.process.cancelSuccess')) + ElMessage.success('取消成功') getList() } catch (error) { console.error(error) @@ -514,9 +540,9 @@ function getStatusType(status: string) { // 获取状态文本 function getStatusText(status: string) { const map: Record = { - pending: t('approval.process.pending'), - approved: t('approval.process.approved'), - rejected: t('approval.process.rejected') + pending: '待审批', + approved: '已审批', + rejected: '已拒绝' } return map[status] || status } diff --git a/admin/src/app/views/service_logs/service_logs.vue b/admin/src/app/views/service_logs/service_logs.vue new file mode 100644 index 00000000..72cad48a --- /dev/null +++ b/admin/src/app/views/service_logs/service_logs.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/admin/src/app/views/student_course_usage/student_course_usage.vue b/admin/src/app/views/student_course_usage/student_course_usage.vue index 98cbf43d..7bec15fc 100644 --- a/admin/src/app/views/student_course_usage/student_course_usage.vue +++ b/admin/src/app/views/student_course_usage/student_course_usage.vue @@ -3,9 +3,6 @@
{{ pageName }} - - {{ t('addStudentCourseUsage') }} -
- + - - - - - - + + + + + + + + + {{ @@ -58,41 +58,23 @@ !studentCourseUsageTable.loading ? t('emptyData') : '' }} - - - - - - - - - + + + + + + + + + + + + + + + + +
5000) { diff --git a/niucloud/app/adminapi/controller/person_course_schedule/PersonCourseSchedule.php b/niucloud/app/adminapi/controller/person_course_schedule/PersonCourseSchedule.php index c96aa60d..9a07a94d 100644 --- a/niucloud/app/adminapi/controller/person_course_schedule/PersonCourseSchedule.php +++ b/niucloud/app/adminapi/controller/person_course_schedule/PersonCourseSchedule.php @@ -50,14 +50,11 @@ class PersonCourseSchedule extends BaseAdminController */ public function add(){ $data = $this->request->params([ - ["person_id",0], - ["person_type",""], + ["resources_id",[]], ["schedule_id",0], - ["course_date","2025-05-29 17:03:27"], - ["time_slot",""], + ["student_ids",[]], ]); - $this->validate($data, 'app\validate\person_course_schedule\PersonCourseSchedule.add'); $id = (new PersonCourseScheduleService())->add($data); return success('ADD_SUCCESS', ['id' => $id]); } @@ -69,14 +66,11 @@ class PersonCourseSchedule extends BaseAdminController */ public function edit(int $id){ $data = $this->request->params([ - ["person_id",0], - ["person_type",""], - ["schedule_id",0], - ["course_date","2025-05-29 17:03:27"], - ["time_slot",""], + ["resources_id",[]], + ["schedule_id",0], + ["student_ids",[]], ]); - $this->validate($data, 'app\validate\person_course_schedule\PersonCourseSchedule.edit'); (new PersonCourseScheduleService())->edit($id, $data); return success('EDIT_SUCCESS'); } diff --git a/niucloud/app/adminapi/controller/school_approval/Process.php b/niucloud/app/adminapi/controller/school_approval/Process.php index e676aa25..01d37c3c 100644 --- a/niucloud/app/adminapi/controller/school_approval/Process.php +++ b/niucloud/app/adminapi/controller/school_approval/Process.php @@ -34,32 +34,32 @@ class Process extends BaseAdminController $page = input('page', 1); $limit = input('limit', 10); $status = input('approval_status', ''); - + $where = []; if ($status !== '') { - $where[] = ['approval_status', '=', $status]; + $where[] = ['a.approval_status', '=', $status]; } - + $process_name = input('process_name', ''); if (!empty($process_name)) { - $where[] = ['process_name', 'like', "%{$process_name}%"]; + $where[] = ['a.process_name', 'like', "%{$process_name}%"]; } - + // 我发起的审批 $applicant_id = input('applicant_id', 0); if (!empty($applicant_id)) { - $where[] = ['applicant_id', '=', $applicant_id]; + $where[] = ['a.applicant_id', '=', $applicant_id]; } - + // 待我审批的 $approver_id = input('approver_id', 0); if (!empty($approver_id)) { - $where[] = ['current_approver_id', '=', $approver_id]; - $where[] = ['approval_status', '=', 'pending']; + $where[] = ['a.current_approver_id', '=', $approver_id]; + $where[] = ['a.approval_status', '=', 'pending']; } - - $data = $this->service->getList($where, $page, $limit); - + + $data = $this->service->getList($where, (int)$page, (int)$limit); + return success($data); } @@ -72,12 +72,12 @@ class Process extends BaseAdminController if (empty($id)) { return fail('参数错误'); } - - $info = $this->service->getInfo($id); + + $info = $this->service->getInfo((int)$id); if (empty($info)) { return fail('审批流程不存在'); } - + return success($info); } @@ -88,19 +88,19 @@ class Process extends BaseAdminController { $data = Request::only(['process_name', 'remarks']); $config_id = input('config_id', 0); - + // 验证参数 if (empty($data['process_name'])) { return fail('流程名称不能为空'); } - + if (empty($config_id)) { return fail('请选择审批流配置'); } - + // 设置申请人ID - $data['applicant_id'] = $this->user_info['uid']; - + $data['applicant_id'] = $this->request->uid(); + try { $process_id = $this->service->create($data, $config_id); return success(['id' => $process_id]); @@ -117,17 +117,17 @@ class Process extends BaseAdminController $process_id = input('process_id', 0); $status = input('status', ''); $remarks = input('remarks', ''); - + if (empty($process_id)) { return fail('参数错误'); } - + if (empty($status) || !in_array($status, ['approved', 'rejected'])) { return fail('请选择审批结果'); } - + try { - $result = $this->service->approve($process_id, $this->user_info['uid'], $status, $remarks); + $result = $this->service->approve((int)$process_id, $this->request->uid(), $status, $remarks); return success($result); } catch (\Exception $e) { return fail($e->getMessage()); @@ -140,16 +140,16 @@ class Process extends BaseAdminController public function cancel() { $process_id = input('process_id', 0); - + if (empty($process_id)) { return fail('参数错误'); } - + try { - $result = $this->service->cancel($process_id, $this->user_info['uid']); + $result = $this->service->cancel($process_id, $this->request->uid()); return success($result); } catch (\Exception $e) { return fail($e->getMessage()); } } -} \ No newline at end of file +} diff --git a/niucloud/app/adminapi/controller/service_logs/ServiceLogs.php b/niucloud/app/adminapi/controller/service_logs/ServiceLogs.php new file mode 100644 index 00000000..f420285b --- /dev/null +++ b/niucloud/app/adminapi/controller/service_logs/ServiceLogs.php @@ -0,0 +1,39 @@ +request->params([ + ["name",""], + ["score",""] + ]); + return success((new ServiceLogsService())->getPage($data)); + } + +} diff --git a/niucloud/app/adminapi/controller/student_course_usage/StudentCourseUsage.php b/niucloud/app/adminapi/controller/student_course_usage/StudentCourseUsage.php index c9005c68..0ccad9ac 100644 --- a/niucloud/app/adminapi/controller/student_course_usage/StudentCourseUsage.php +++ b/niucloud/app/adminapi/controller/student_course_usage/StudentCourseUsage.php @@ -28,9 +28,9 @@ class StudentCourseUsage extends BaseAdminController */ public function lists(){ $data = $this->request->params([ - ["student_course_id",""], - ["used_hours",""], - ["usage_date",""] + ["emergency_contact",""], + ["student_name",""], + ["contact_phone",""] ]); return success((new StudentCourseUsageService())->getPage($data)); } @@ -87,5 +87,5 @@ class StudentCourseUsage extends BaseAdminController return success('DELETE_SUCCESS'); } - + } diff --git a/niucloud/app/adminapi/controller/sys/System.php b/niucloud/app/adminapi/controller/sys/System.php index cba758ee..84a7c71f 100644 --- a/niucloud/app/adminapi/controller/sys/System.php +++ b/niucloud/app/adminapi/controller/sys/System.php @@ -169,4 +169,19 @@ class System extends BaseAdminController } + //全部人员 + public function person_all(){ + return success(data: (new SystemService())->person_all()); + } + + public function role_all(){ + return success(data: (new SystemService())->role_all()); + } + + public function departments_all(){ + return success(data: (new SystemService())->departments_all()); + } + + + } diff --git a/niucloud/app/adminapi/route/service_logs.php b/niucloud/app/adminapi/route/service_logs.php new file mode 100644 index 00000000..e4d15e1e --- /dev/null +++ b/niucloud/app/adminapi/route/service_logs.php @@ -0,0 +1,31 @@ +middleware([ + AdminCheckToken::class, + AdminCheckRole::class, + AdminLog::class +]); +// USER_CODE_END -- service diff --git a/niucloud/app/adminapi/route/sys.php b/niucloud/app/adminapi/route/sys.php index 67af2a40..caf37ca9 100644 --- a/niucloud/app/adminapi/route/sys.php +++ b/niucloud/app/adminapi/route/sys.php @@ -351,6 +351,11 @@ Route::group('sys', function() { //系统环境(不效验登录状态) Route::group('sys', function() { + Route::get('person_all', 'sys.System/person_all'); + Route::get('role_all', 'sys.System/role_all'); + Route::get('departments_all', 'sys.System/departments_all'); + + Route::get('web/website', 'sys.Config/getWebsite'); // 获取版权信息 Route::get('web/copyright', 'sys.Config/getCopyright'); diff --git a/niucloud/app/model/person_course_schedule/PersonCourseSchedule.php b/niucloud/app/model/person_course_schedule/PersonCourseSchedule.php index e6bd524c..e547d1ae 100644 --- a/niucloud/app/model/person_course_schedule/PersonCourseSchedule.php +++ b/niucloud/app/model/person_course_schedule/PersonCourseSchedule.php @@ -11,6 +11,8 @@ namespace app\model\person_course_schedule; +use app\model\personnel\Personnel; +use app\model\student\Student; use core\base\BaseModel; use think\model\relation\HasMany; use think\model\relation\HasOne; @@ -40,7 +42,19 @@ class PersonCourseSchedule extends BaseModel /** - * 搜索器:人员与课程安排关系资源 + * 搜索器:人员与课程安排关系关系编号 + * @param $value + * @param $data + */ + public function searchIdAttr($query, $value, $data) + { + if ($value) { + $query->where("id", $value); + } + } + + /** + * 搜索器:人员与课程安排关系人员或资源ID * @param $value * @param $data */ @@ -51,13 +65,71 @@ class PersonCourseSchedule extends BaseModel } } + /** + * 搜索器:人员与课程安排关系人员类型: student-正式学员, customer_resource-客户资源 + * @param $value + * @param $data + */ + public function searchPersonTypeAttr($query, $value, $data) + { + if ($value) { + $query->where("person_type", $value); + } + } + + /** + * 搜索器:人员与课程安排关系课程安排ID + * @param $value + * @param $data + */ + public function searchScheduleIdAttr($query, $value, $data) + { + if ($value) { + $query->where("schedule_id", $value); + } + } + + /** + * 搜索器:人员与课程安排关系上课日期 + * @param $value + * @param $data + */ + public function searchCourseDateAttr($query, $value, $data) + { + if ($value) { + $query->where("course_date", $value); + } + } + /** + * 搜索器:人员与课程安排关系上课时段 + * @param $value + * @param $data + */ + public function searchTimeSlotAttr($query, $value, $data) + { + if ($value) { + $query->where("time_slot", $value); + } + } + public function person() + { + return $this->hasOne(Personnel::class, 'id', 'person_id'); + } + public function student() + { + return $this->hasOne(Student::class, 'id', 'student_id'); + } - public function customerResources(){ - return $this->hasOne(CustomerResources::class, 'id', 'person_id')->joinType('left')->withField('name,id')->bind(['person_id_name'=>'name']); + public function resources() + { + return $this->hasOne(CustomerResources::class, 'id', 'resources_id'); } + public function customerResources(){ + return $this->hasOne(CustomerResources::class, 'id', 'person_id')->joinType('left')->withField('name,id')->bind(['person_id_name'=>'name']); + } } diff --git a/niucloud/app/model/service_logs/ServiceLogs.php b/niucloud/app/model/service_logs/ServiceLogs.php new file mode 100644 index 00000000..b0d2aafa --- /dev/null +++ b/niucloud/app/model/service_logs/ServiceLogs.php @@ -0,0 +1,44 @@ +getAuthApiList(); + + if (!empty($auth_role_list[ $method ]) && in_array($rule, $auth_role_list[ $method ])) return true; @@ -72,7 +75,14 @@ class AuthService extends BaseAdminService //获取站点信息 return ( new MenuService() )->getAllApiList(1); } else { - $user_role_ids = $user_info[ 'role_ids' ]; + + $per = new Personnel(); + $CampusPersonRole = new CampusPersonRole(); + $per_id = $per->where(['sys_user_id' => $this->uid])->column('id'); + + $user_role_ids = $CampusPersonRole->where(['person_id' => $per_id])->column('role_id'); + +// $user_role_ids = $user_info[ 'role_ids' ]; $role_service = new RoleService(); $menu_keys = $role_service->getMenuKeysByRoleIds($user_role_ids ?? []); return $menu_service->getApiListByMenuKeys($menu_keys); diff --git a/niucloud/app/service/admin/customer_resources/CustomerResourcesService.php b/niucloud/app/service/admin/customer_resources/CustomerResourcesService.php index 326118fd..f8569fc2 100644 --- a/niucloud/app/service/admin/customer_resources/CustomerResourcesService.php +++ b/niucloud/app/service/admin/customer_resources/CustomerResourcesService.php @@ -95,6 +95,10 @@ class CustomerResourcesService extends BaseAdminService return $this->pageQuery($search_model, function ($item, $key) { $item = $this->makeUp($item); + + $sixSpeed = new SixSpeed(); + $data = $sixSpeed->where(['resource_id' => $item['id']])->findOrEmpty()->toArray(); + $item['six'] = $data; }); } diff --git a/niucloud/app/service/admin/service_logs/ServiceLogsService.php b/niucloud/app/service/admin/service_logs/ServiceLogsService.php new file mode 100644 index 00000000..447f66fb --- /dev/null +++ b/niucloud/app/service/admin/service_logs/ServiceLogsService.php @@ -0,0 +1,60 @@ +model = new ServiceLogs(); + } + + /** + * 获取学员课时消费记录列表 + * @return array + */ + public function getPage(array $data = []) + { + $where = []; + if($data['name']){ + $where[] = ['b.name','like','%'.$data['name'].'%']; + } + + if($data['score']){ + $where[] = ['a.score','=',$data['score']]; + } + + $search_model = $this->model + ->alias("a") + ->join(['school_customer_resources' => 'b'],'a.resource_id = b.id','left') + ->join(['school_personnel' => 'c'],'a.staff_id = c.id','left') + ->join(['school_service' => 'd'],'a.service_id = d.id','left') + ->where($where) + ->field("a.*,b.name,c.name as staff_name,d.service_name,d.customer_confirmation") + ->order("a.id desc"); + $list = $this->pageQuery($search_model); + return $list; + } + + +} diff --git a/niucloud/app/service/admin/student_course_usage/StudentCourseUsageService.php b/niucloud/app/service/admin/student_course_usage/StudentCourseUsageService.php index 82435bbe..b4d7fc7d 100644 --- a/niucloud/app/service/admin/student_course_usage/StudentCourseUsageService.php +++ b/niucloud/app/service/admin/student_course_usage/StudentCourseUsageService.php @@ -31,15 +31,31 @@ class StudentCourseUsageService extends BaseAdminService /** * 获取学员课时消费记录列表 - * @param array $where * @return array */ - public function getPage(array $where = []) + public function getPage(array $data = []) { - $field = 'id,student_course_id,used_hours,usage_date,created_at,updated_at'; - $order = 'id desc'; - - $search_model = $this->model->withSearch(["id","student_course_id","used_hours","usage_date"], $where)->field($field)->order($order); + $where = []; + if($data['emergency_contact']){ + $where[] = ['c.emergency_contact','like','%'.$data['emergency_contact'].'%']; + } + + if($data['student_name']){ + $where[] = ['c.name','like','%'.$data['student_name'].'%']; + } + + if($data['contact_phone']){ + $where[] = ['c.contact_phone','=',$data['contact_phone']]; + } + + $search_model = $this->model + ->alias("a") + ->join(['school_student_courses' => 'b'],'a.student_course_id = b.id','left') + ->join(['school_student' => 'c'],'b.student_id = c.id','left') + ->join(['school_course' => 'd'],'b.course_id = d.id','left') + ->where($where) + ->field("a.*,c.name as student_name,c.emergency_contact,d.course_name,b.total_hours,ROUND(b.total_hours - b.use_total_hours) as sy_time,ROUND(b.gift_hours - b.use_gift_hours) as gift_hours") + ->order("a.id desc"); $list = $this->pageQuery($search_model); return $list; } @@ -94,6 +110,6 @@ class StudentCourseUsageService extends BaseAdminService return $res; } - + } diff --git a/niucloud/app/service/admin/sys/SystemService.php b/niucloud/app/service/admin/sys/SystemService.php index ddb410a9..c6bf5d5c 100644 --- a/niucloud/app/service/admin/sys/SystemService.php +++ b/niucloud/app/service/admin/sys/SystemService.php @@ -17,10 +17,12 @@ use app\model\campus\Campus; use app\model\campus_person_role\CampusPersonRole; use app\model\communication_records\CommunicationRecords; use app\model\customer_resources\CustomerResources; +use app\model\departments\Departments; use app\model\market_performance\MarketPerformance; use app\model\personnel\Personnel; use app\model\student\Student; use app\model\sys\SysConfig; +use app\model\sys\SysRole; use app\service\core\sys\CoreSysConfigService; use core\base\BaseAdminService; use think\facade\Db; @@ -342,4 +344,20 @@ class SystemService extends BaseAdminService } return $data; } + + public function person_all(){ + $Personnel = new Personnel(); + return $Personnel->select()->toArray(); + } + + public function role_all(){ + $sysRole = new SysRole(); + return $sysRole->select()->toArray(); + } + + public function departments_all(){ + $departments = new Departments(); + return $departments->select()->toArray(); + } + } diff --git a/niucloud/app/service/school_approval/SchoolApprovalConfigService.php b/niucloud/app/service/school_approval/SchoolApprovalConfigService.php index 9a3cb1e9..031db09d 100644 --- a/niucloud/app/service/school_approval/SchoolApprovalConfigService.php +++ b/niucloud/app/service/school_approval/SchoolApprovalConfigService.php @@ -26,7 +26,7 @@ class SchoolApprovalConfigService { $field = 'id, config_name, description, status, creator_id, created_at, updated_at'; $order = 'id desc'; - + $list = (new SchoolApprovalConfig()) ->where($where) ->field($field) @@ -34,15 +34,15 @@ class SchoolApprovalConfigService ->page($page, $limit) ->select() ->toArray(); - + $count = (new SchoolApprovalConfig())->where($where)->count(); - + return [ 'list' => $list, 'count' => $count ]; } - + /** * 获取审批流配置详情 * @param int $id @@ -51,13 +51,14 @@ class SchoolApprovalConfigService public function getInfo(int $id): array { $info = (new SchoolApprovalConfig())->with(['nodes'])->where(['id' => $id])->find(); + + if (empty($info)) { return []; } - return $info->toArray(); } - + /** * 添加审批流配置 * @param array $data @@ -74,9 +75,9 @@ class SchoolApprovalConfigService 'status' => $data['status'] ?? 1, 'creator_id' => $data['creator_id'] ]; - + $config_id = (new SchoolApprovalConfig())->insertGetId($config); - + // 添加节点 if (!empty($data['nodes'])) { $nodes = []; @@ -90,10 +91,10 @@ class SchoolApprovalConfigService 'sequence' => $sequence + 1 ]; } - + (new SchoolApprovalConfigNode())->insertAll($nodes); } - + Db::commit(); return $config_id; } catch (\Exception $e) { @@ -101,7 +102,7 @@ class SchoolApprovalConfigService throw new Exception($e->getMessage()); } } - + /** * 编辑审批流配置 * @param array $data @@ -117,12 +118,12 @@ class SchoolApprovalConfigService 'description' => $data['description'] ?? '', 'status' => $data['status'] ?? 1 ]; - + (new SchoolApprovalConfig())->where(['id' => $data['id']])->update($config); - + // 先删除原有节点 (new SchoolApprovalConfigNode())->where(['config_id' => $data['id']])->delete(); - + // 添加新节点 if (!empty($data['nodes'])) { $nodes = []; @@ -136,10 +137,10 @@ class SchoolApprovalConfigService 'sequence' => $sequence + 1 ]; } - + (new SchoolApprovalConfigNode())->insertAll($nodes); } - + Db::commit(); return true; } catch (\Exception $e) { @@ -147,7 +148,7 @@ class SchoolApprovalConfigService throw new Exception($e->getMessage()); } } - + /** * 删除审批流配置 * @param int $id @@ -160,10 +161,10 @@ class SchoolApprovalConfigService try { // 删除配置 (new SchoolApprovalConfig())->where(['id' => $id])->delete(); - + // 删除节点 (new SchoolApprovalConfigNode())->where(['config_id' => $id])->delete(); - + Db::commit(); return true; } catch (\Exception $e) { @@ -171,7 +172,7 @@ class SchoolApprovalConfigService throw new Exception($e->getMessage()); } } - + /** * 修改状态 * @param int $id @@ -182,4 +183,4 @@ class SchoolApprovalConfigService { return (new SchoolApprovalConfig())->where(['id' => $id])->update(['status' => $status]) !== false; } -} \ No newline at end of file +} diff --git a/niucloud/app/service/school_approval/SchoolApprovalProcessService.php b/niucloud/app/service/school_approval/SchoolApprovalProcessService.php index f92094f1..68f0e735 100644 --- a/niucloud/app/service/school_approval/SchoolApprovalProcessService.php +++ b/niucloud/app/service/school_approval/SchoolApprovalProcessService.php @@ -3,6 +3,7 @@ declare(strict_types=1); namespace app\service\school_approval; +use app\model\personnel\Personnel; use app\model\school_approval\SchoolApprovalConfig; use app\model\school_approval\SchoolApprovalConfigNode; use app\model\school_approval\SchoolApprovalParticipants; @@ -26,25 +27,28 @@ class SchoolApprovalProcessService */ public function getList(array $where = [], int $page = 1, int $limit = 10): array { - $field = 'id, process_name, applicant_id, application_time, current_approver_id, approval_status, approval_time, remarks, created_at, updated_at'; - $order = 'id desc'; - + $field = 'a.*,b.name as applicant_name,c.name as current_approver_name'; + $order = 'a.id desc'; + $list = (new SchoolApprovalProcess()) + ->alias("a") + ->join(['school_personnel' => 'b'],'a.applicant_id = b.id','left') + ->join(['school_personnel' => 'c'],'a.current_approver_id = c.id','left') ->where($where) ->field($field) ->order($order) ->page($page, $limit) ->select() ->toArray(); - + $count = (new SchoolApprovalProcess())->where($where)->count(); - + return [ 'list' => $list, 'count' => $count ]; } - + /** * 获取审批流程详情 * @param int $id @@ -52,14 +56,26 @@ class SchoolApprovalProcessService */ public function getInfo(int $id): array { - $info = (new SchoolApprovalProcess())->with(['participants'])->where(['id' => $id])->find(); + $info = (new SchoolApprovalProcess()) + ->alias("a") + ->join(['school_personnel' => 'b'],'a.applicant_id = b.id','left') + ->join(['school_personnel' => 'c'],'a.current_approver_id = c.id','left') + ->with(['participants']) + ->where(['a.id' => $id]) + ->field('a.*,b.name as applicant_name,c.name as current_approver_name') + ->find(); if (empty($info)) { return []; } - - return $info->toArray(); + $info = $info->toArray(); + $Personnel = new Personnel(); + foreach ($info['participants'] as $key => $value) { + $info['participants'][$key]['name'] = $Personnel->where(['id' => $value['participant_id']])->value('name'); + } + + return $info; } - + /** * 创建审批流程 * @param array $data @@ -76,19 +92,19 @@ class SchoolApprovalProcessService if (empty($config_info)) { throw new Exception('审批配置不存在'); } - + // 创建审批流程 $process = [ 'process_name' => $data['process_name'], 'applicant_id' => $data['applicant_id'], - 'application_time' => time(), + 'application_time' => date("Y-m-d H:i:s"), 'current_approver_id' => 0, // 初始时为0,后面会更新 'approval_status' => SchoolApprovalProcess::STATUS_PENDING, 'remarks' => $data['remarks'] ?? '' ]; - + $process_id = (new SchoolApprovalProcess())->insertGetId($process); - + // 创建审批参与人 $participants = []; foreach ($config_info['nodes'] as $sequence => $node) { @@ -103,22 +119,22 @@ class SchoolApprovalProcessService ]; } } - + if (!empty($participants)) { (new SchoolApprovalParticipants())->insertAll($participants); - + // 更新当前审批人为第一个审批人 $first_participant = (new SchoolApprovalParticipants()) ->where(['process_id' => $process_id]) ->order('sequence', 'asc') ->find(); - + if (!empty($first_participant)) { (new SchoolApprovalProcess())->where(['id' => $process_id]) ->update(['current_approver_id' => $first_participant['participant_id']]); } } - + Db::commit(); return $process_id; } catch (\Exception $e) { @@ -126,7 +142,7 @@ class SchoolApprovalProcessService throw new Exception($e->getMessage()); } } - + /** * 审批 * @param int $process_id 流程ID @@ -145,17 +161,17 @@ class SchoolApprovalProcessService if (empty($process_info)) { throw new Exception('审批流程不存在'); } - + // 检查是否当前审批人 if ($process_info['current_approver_id'] != $approver_id) { throw new Exception('您不是当前审批人'); } - + // 检查流程状态 if ($process_info['approval_status'] != SchoolApprovalProcess::STATUS_PENDING) { throw new Exception('该审批流程已完成'); } - + // 获取当前审批节点 $current_participant = (new SchoolApprovalParticipants()) ->where([ @@ -164,18 +180,18 @@ class SchoolApprovalProcessService 'status' => SchoolApprovalParticipants::STATUS_PENDING ]) ->find(); - + if (empty($current_participant)) { throw new Exception('审批节点信息错误'); } - + // 更新当前审批人状态 (new SchoolApprovalParticipants())->where(['id' => $current_participant['id']]) ->update([ 'status' => $status, 'remarks' => $remarks ]); - + // 如果拒绝,直接更新整个流程状态为拒绝 if ($status == SchoolApprovalParticipants::STATUS_REJECTED) { (new SchoolApprovalProcess())->where(['id' => $process_id]) @@ -184,11 +200,11 @@ class SchoolApprovalProcessService 'approval_time' => time(), 'remarks' => $remarks ]); - + Db::commit(); return true; } - + // 检查当前节点是否需要会签 $same_sequence_participants = (new SchoolApprovalParticipants()) ->where([ @@ -197,14 +213,14 @@ class SchoolApprovalProcessService 'status' => SchoolApprovalParticipants::STATUS_PENDING ]) ->select(); - + // 如果是会签且还有其他人未审批,则等待 if ($current_participant['sign_type'] == SchoolApprovalParticipants::SIGN_TYPE_AND && !$same_sequence_participants->isEmpty()) { // 不做任何处理,等待其他人审批 Db::commit(); return true; } - + // 获取下一个审批节点 $next_participant = (new SchoolApprovalParticipants()) ->where([ @@ -213,7 +229,7 @@ class SchoolApprovalProcessService ]) ->order('sequence', 'asc') ->find(); - + if (empty($next_participant)) { // 没有下一个审批人,流程结束,标记为已通过 (new SchoolApprovalProcess())->where(['id' => $process_id]) @@ -226,7 +242,7 @@ class SchoolApprovalProcessService (new SchoolApprovalProcess())->where(['id' => $process_id]) ->update(['current_approver_id' => $next_participant['participant_id']]); } - + Db::commit(); return true; } catch (\Exception $e) { @@ -234,7 +250,7 @@ class SchoolApprovalProcessService throw new Exception($e->getMessage()); } } - + /** * 撤销审批流程 * @param int $process_id 流程ID @@ -251,17 +267,17 @@ class SchoolApprovalProcessService if (empty($process_info)) { throw new Exception('审批流程不存在'); } - + // 检查是否申请人 if ($process_info['applicant_id'] != $applicant_id) { throw new Exception('您不是该流程的申请人'); } - + // 检查流程状态 if ($process_info['approval_status'] != SchoolApprovalProcess::STATUS_PENDING) { throw new Exception('该审批流程已完成,无法撤销'); } - + // 更新流程状态为已拒绝(撤销) (new SchoolApprovalProcess())->where(['id' => $process_id]) ->update([ @@ -269,7 +285,7 @@ class SchoolApprovalProcessService 'approval_time' => time(), 'remarks' => '申请人撤销' ]); - + // 更新所有待审批节点为已拒绝 (new SchoolApprovalParticipants())->where([ 'process_id' => $process_id, @@ -278,7 +294,7 @@ class SchoolApprovalProcessService 'status' => SchoolApprovalParticipants::STATUS_REJECTED, 'remarks' => '申请人撤销' ]); - + Db::commit(); return true; } catch (\Exception $e) { @@ -286,4 +302,4 @@ class SchoolApprovalProcessService throw new Exception($e->getMessage()); } } -} \ No newline at end of file +}