Преглед на файлове

提交云课堂相关文件

Lijy преди 1 седмица
родител
ревизия
db50ed994e
променени са 15 файла, в които са добавени 675 реда и са изтрити 212 реда
  1. 6 3
      fhKeeper/formulahousekeeper/course-pc/index.html
  2. 2 2
      fhKeeper/formulahousekeeper/course-pc/src/common/js/fixedData.js
  3. 3 2
      fhKeeper/formulahousekeeper/course-pc/src/routes.js
  4. 2 1
      fhKeeper/formulahousekeeper/course-pc/src/views/coursemanagement/addVideo.vue
  5. 76 36
      fhKeeper/formulahousekeeper/course-pc/src/views/coursemanagement/list.vue
  6. 137 23
      fhKeeper/formulahousekeeper/course-pc/src/views/examinationManagement/certificates.vue
  7. 58 5
      fhKeeper/formulahousekeeper/course-pc/src/views/examinationManagement/examRegistrationReview.vue
  8. 22 12
      fhKeeper/formulahousekeeper/course-pc/src/views/examinationManagement/examResults.vue
  9. 13 8
      fhKeeper/formulahousekeeper/course-pc/src/views/examinationManagement/examinationInformation.vue
  10. 141 0
      fhKeeper/formulahousekeeper/course-pc/src/views/orderAndFinancialManagement/electronicInvoiceRegistration.vue
  11. 38 17
      fhKeeper/formulahousekeeper/course-pc/src/views/orderAndFinancialManagement/orderManagement.vue
  12. 10 6
      fhKeeper/formulahousekeeper/course-pc/src/views/trainingClassManagement/registration.vue
  13. 71 24
      fhKeeper/formulahousekeeper/course-pc/src/views/trainingClassManagement/student.vue
  14. 47 20
      fhKeeper/formulahousekeeper/course-pc/src/views/trainingClassManagement/studentPayment.vue
  15. 49 53
      fhKeeper/formulahousekeeper/course-pc/src/views/userAndMessageManagement/userManagement.vue

+ 6 - 3
fhKeeper/formulahousekeeper/course-pc/index.html

@@ -65,11 +65,14 @@
     <body>
         <div id="app"></div>
         <!-- 引入Vue.js -->
-        <script src="https://cdn.staticfile.org/vue/2.6.10/vue.min.js"></script>
+        <!-- <script src="https://cdn.staticfile.org/vue/2.6.10/vue.min.js"></script> -->
+        <script src="./static/js/vue.min.js"></script>
         <!-- 引入vuex.js -->
-        <script src="https://cdn.staticfile.org/vuex/3.0.0/vuex.min.js"></script>
+        <!-- <script src="https://cdn.staticfile.org/vuex/3.0.0/vuex.min.js"></script> -->
+        <script src="./static/js/vuex.min.js"></script>
         <!-- 引入vue-router -->
-        <script src="https://cdn.staticfile.org/vue-router/3.0.0/vue-router.min.js"></script>
+        <!-- <script src="https://cdn.staticfile.org/vue-router/3.0.0/vue-router.min.js"></script> -->
+        <script src="./static/js/vue-router.min.js"></script>
         <script src="./static/js/element-ui.js"></script>
         <!-- 引入echarts -->
         <script src="./static/js/echarts.min.js"></script>

+ 2 - 2
fhKeeper/formulahousekeeper/course-pc/src/common/js/fixedData.js

@@ -16,8 +16,8 @@ export const fixedDataOrNot = [
 ];
 
 export const fixedDataInvoiceSubject = [
-  { label: "个人", value: "0" },
-  { label: "单位", value: "1" },
+  { label: "单位", value: "0" },
+  { label: "个人", value: "1" },
 ];
 
 export const fixedDatainvoiceType = [

+ 3 - 2
fhKeeper/formulahousekeeper/course-pc/src/routes.js

@@ -31,7 +31,8 @@ import customerServiceCenter from './views/userAndMessageManagement/customerServ
 import userManagement from './views/userAndMessageManagement/userManagement.vue' // 用户管理
 
 // 订单与财务管理
-import orderManagement from './views/orderAndFinancialManagement/orderManagement.vue'
+import orderManagement from './views/orderAndFinancialManagement/orderManagement.vue' // 订单管理
+import electronicInvoiceRegistration from './views/orderAndFinancialManagement/electronicInvoiceRegistration.vue' // 电子发票登记表
 
 
 Vue.use(Router)
@@ -142,7 +143,7 @@ export const allRouters = [
         leaf: false,//只有一个节点
         children: [
             { path: '/order-management', component: orderManagement, name: '订单管理' },
-            { path: '/wwwwww', component: customerServiceCenter, name: '电子发票登记表' },
+            { path: '/wwwwww', component: electronicInvoiceRegistration, name: '电子发票登记表' },
         ]
     },
     {

+ 2 - 1
fhKeeper/formulahousekeeper/course-pc/src/views/coursemanagement/addVideo.vue

@@ -49,7 +49,8 @@
     <!-- 预览视频 -->
     <el-dialog title="预览视频" append-to-body :visible.sync="previewingVideoVisable" width="900px" top="6.5vh" :before-close="handleClose">
       <div class="previewingVideo">
-        <video :src="previewVideoSrc" :poster="require('../../assets/image/yunketang.png')" controls></video>
+        <!-- <video :src="previewVideoSrc" :poster="require('../../assets/image/yunketang.png')" controls></video> -->
+        <video :src="previewVideoSrc" controls></video>
       </div>
     </el-dialog>
   </div>

+ 76 - 36
fhKeeper/formulahousekeeper/course-pc/src/views/coursemanagement/list.vue

@@ -137,39 +137,65 @@
         </el-dialog>
 
         <!-- 添加课程 -->
-        <el-dialog :visible.sync="addDialogVisible" title="添加课程" width="800px" top="6.5vh">
-            <el-form :model="courseForm" :rules="courseRules" ref="courseForm" label-width="120px">
-                <el-form-item label="课程分类" prop="courseTypeId">
-                    <el-select v-model="courseForm.courseTypeId" placeholder="请选择" style="width:100%">
-                        <el-option v-for="item in categoryOptionsTwo" :key="item.value" :label="item.label"
-                            :value="item.value">
-                        </el-option>
-                    </el-select>
-                </el-form-item>
-                <el-form-item label="课程名称" prop="courseName">
-                    <el-input v-model="courseForm.courseName" placeholder="请输入课程名称"></el-input>
-                </el-form-item>
-                <el-form-item label="课程介绍" style="height: 200px;">
-                    <quill-editor style="height: 150px" ref="text" v-model="courseForm.courseDesc" class="myQuillEditor"
-                        :options="editorOption" />
-                </el-form-item>
-                <el-form-item label="课程价格">
-                    <el-input-number v-model="courseForm.coursePrice" :min="0" :precision="2" step-strictly :step="1"
-                        @blur="coursePriceBlur"></el-input-number>
-                </el-form-item>
-                <el-form-item label="课程时间(分钟)">
-                    <el-input-number v-model="courseForm.courseDuration" :min="1" step-strictly :step="1"
-                        @blur="courseDurationBlur"></el-input-number>
-                </el-form-item>
-                <el-form-item label="课程封面">
-                    <el-upload class="cover-uploader" action="#" :show-file-list="false"
-                        :on-change="handleCourseCoverChange" :auto-upload="false" :before-upload="beforeCoverUpload">
-                        <img v-if="courseForm.coverImageUrl" :src="courseForm.coverImageUrl" class="cover-image" />
-                        <i v-else class="el-icon-plus cover-uploader-icon"></i>
-                    </el-upload>
-                    <div class="cover-tip">建议尺寸 16:9,大小不超过2MB</div>
-                </el-form-item>
-            </el-form>
+        <el-dialog :visible.sync="addDialogVisible" title="添加课程" width="900px" top="6.5vh">
+            <div style="height: 60vh;overflow-y: auto; padding: 0 20px">
+                <el-form :model="courseForm" :rules="courseRules" ref="courseForm" label-width="120px">
+                    <el-form-item label="课程分类" prop="courseTypeId">
+                        <el-select v-model="courseForm.courseTypeId" placeholder="请选择" style="width:100%">
+                            <el-option v-for="item in categoryOptionsTwo" :key="item.value" :label="item.label"
+                                :value="item.value">
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="课程名称" prop="courseName">
+                        <el-input v-model="courseForm.courseName" placeholder="请输入课程名称"></el-input>
+                    </el-form-item>
+                    <el-form-item label="课程介绍" style="height: 200px;">
+                        <quill-editor style="height: 150px" ref="text" v-model="courseForm.courseDesc"
+                            class="myQuillEditor" :options="editorOption" />
+                    </el-form-item>
+                    <div style="display: flex;flex-wrap: wrap;">
+                        <el-form-item label="课程价格" style="width: 50%;">
+                            <el-input-number v-model="courseForm.coursePrice" :min="0" :precision="2" step-strictly
+                                :step="1" @blur="coursePriceBlur" controls-position="right"></el-input-number>
+                        </el-form-item>
+                        <el-form-item label="课程时间(分钟)" style="width: 50%;">
+                            <el-input-number v-model="courseForm.courseDuration" :min="1" step-strictly :step="1"
+                                @blur="courseDurationBlur" controls-position="right"></el-input-number>
+                        </el-form-item>
+                        <el-form-item label="培训学时" style="width: 50%;">
+                            <el-input-number v-model="courseForm.teachDuration" :min="0" step-strictly
+                                :step="1" controls-position="right"></el-input-number>
+                        </el-form-item>
+                        <el-form-item label="培训费/认证费" style="width: 50%;">
+                            <el-input-number v-model="courseForm.teachVeriPrice" :min="0" step-strictly
+                                :step="1" controls-position="right"></el-input-number>
+                        </el-form-item>
+                        <el-form-item label="资料费" style="width: 50%;">
+                            <el-input-number v-model="courseForm.materialPrice" :min="0" step-strictly
+                                :step="1" controls-position="right"></el-input-number>
+                        </el-form-item>
+                        <el-form-item label="其他费用1" style="width: 50%;">
+                            <el-input-number v-model="courseForm.other1Price" :min="0" step-strictly
+                                :step="1" controls-position="right"></el-input-number>
+                        </el-form-item>
+                        <el-form-item label="其他费用2" style="width: 50%;">
+                            <el-input-number v-model="courseForm.other2Price" :min="0" step-strictly
+                                :step="1" controls-position="right"></el-input-number>
+                        </el-form-item>
+                    </div>
+                    <el-form-item label="课程封面">
+                        <el-upload class="cover-uploader" action="#" :show-file-list="false"
+                            :on-change="handleCourseCoverChange" :auto-upload="false"
+                            :before-upload="beforeCoverUpload">
+                            <img v-if="courseForm.coverImageUrl" :src="courseForm.coverImageUrl" class="cover-image" />
+                            <i v-else class="el-icon-plus cover-uploader-icon"></i>
+                        </el-upload>
+                        <div class="cover-tip">建议尺寸 16:9,大小不超过2MB</div>
+                    </el-form-item>
+                </el-form>
+            </div>
+
             <span slot="footer" class="dialog-footer">
                 <el-button @click="addDialogVisible = false">取 消</el-button>
                 <el-button type="primary" @click="submitCourseForm">确 定</el-button>
@@ -440,6 +466,7 @@ export default {
                     message: `保存成功`,
                     type: 'success'
                 });
+                this.getList()
                 this.saveVideoLoading = false
                 this.addVideoVisable = false
             }, err => {
@@ -763,13 +790,17 @@ export default {
                     coursePrice: 0,
                     courseDuration: 1,
                     coverImageUrl: '',
+                    teachDuration: 0,
+                    teachVeriPrice: 0,
+                    materialPrice: 0,
+                    other1Price: 0,
+                    other2Price: 0
                 };
                 if (this.$refs.courseForm) {
                     this.$refs.courseForm.resetFields();
                 }
             } else {
-                console.log(row, '<==== 看看数据')
-                const { courseTypeId, courseName, courseDesc, coursePrice, courseDuration, coverImage, id } = row
+                const { courseTypeId, courseName, courseDesc, coursePrice, courseDuration, coverImage, id, teachDuration, teachVeriPrice, materialPrice, other1Price, other2Price } = row
                 this.courseForm = {
                     id,
                     courseTypeId,
@@ -777,7 +808,8 @@ export default {
                     courseDesc,
                     coursePrice,
                     courseDuration,
-                    coverImageUrl: this.checkAndAddUpload(coverImage)
+                    coverImageUrl: this.checkAndAddUpload(coverImage),
+                    teachDuration, teachVeriPrice, materialPrice, other1Price, other2Price
                 }
             }
         },
@@ -799,6 +831,11 @@ export default {
                 formData.append('coursePrice', this.courseForm.coursePrice);
                 formData.append('courseDuration', this.courseForm.courseDuration);
                 formData.append('coverImage', this.courseForm.coverImageUrl);
+                formData.append('teachDuration', this.courseForm.teachDuration);
+                formData.append('teachVeriPrice', this.courseForm.teachVeriPrice);
+                formData.append('materialPrice', this.courseForm.materialPrice);
+                formData.append('other1Price', this.courseForm.other1Price);
+                formData.append('other2Price', this.courseForm.other2Price);
 
                 this.listLoading = true;
                 this.http.uploadFile('/course-info/saveOrUpdate', formData, res => {
@@ -1167,6 +1204,9 @@ export default {
     width: 178px;
     height: 100px;
     margin-bottom: 10px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
 }
 
 .cover-uploader:hover {

+ 137 - 23
fhKeeper/formulahousekeeper/course-pc/src/views/examinationManagement/certificates.vue

@@ -19,28 +19,44 @@
             <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
             <el-table-column prop="name" label="姓名" min-width="120" align="center"></el-table-column>
             <el-table-column prop="phone" label="手机号" min-width="160" align="center"></el-table-column>
-            <el-table-column prop="certificate" label="证书" min-width="180" align="center"></el-table-column>
-            <el-table-column prop="dateOfIssue" label="发证日期" min-width="120" align="center"></el-table-column>
+            <el-table-column prop="courseName" label="报名课程" min-width="160" align="center"></el-table-column>
+            <el-table-column prop="certificate" label="证书" min-width="180" align="center">
+                <template slot-scope="scope">
+                    <div v-if="scope.row.certificate">
+                        <img :src="scope.row.certificate" class="lecturer-photo"
+                            @click="previewImage(scope.row.certificate)" />
+                    </div>
+                    <span v-else>无证书</span>
+                </template>
+            </el-table-column>
+            <el-table-column prop="certCreateDate" label="发证日期" min-width="120" align="center"></el-table-column>
             <el-table-column label="操作" min-width="150" align="center">
-              <template slot-scope="scope">
-                <el-button size="small">上传证书</el-button>
-                <el-button size="small">邮寄</el-button>
-              </template>
+                <template slot-scope="scope">
+                    <div style="display: flex;align-items: center;justify-content: center;">
+                        <el-upload style="margin-right: 10px;" action="#" :show-file-list="false"
+                            :on-change="handleCoverChange" :auto-upload="false" :before-upload="beforeCoverUpload">
+                            <el-button size="small" type="primary" @click="certificateClick(scope.row)">{{
+                                scope.row.certificate ? '编辑证书' : '上传证书' }}</el-button>
+                        </el-upload>
+                        <el-button size="small" v-if="!scope.row.isPost" @click="mail(scope.row.id)"
+                            type="primary">邮寄</el-button>
+                        <el-button size="small" v-if="scope.row.isPost">已邮寄</el-button>
+                    </div>
+                </template>
             </el-table-column>
         </el-table>
 
         <!--分页-->
         <el-col :span="24" class="toolbar">
-            <el-pagination
-                @size-change="handleSizeChange"
-                @current-change="handleCurrentChange"
-                :page-sizes="[10, 20, 50, 100]"
-                :page-size="size"
-                layout="total, sizes, prev, pager, next"
-                :total="total"
-                style="float:right;"
-            ></el-pagination>
+            <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                :page-sizes="[10, 20, 50, 100]" :page-size="size" layout="total, sizes, prev, pager, next"
+                :total="total" style="float:right;"></el-pagination>
         </el-col>
+
+        <!-- 图片预览 -->
+        <viewer ref="imageWrapper" :images="images" style="opacity: 1;position: absolute;top: -9999px;">
+            <img v-for="(image, index) in images" :src="image" :key="index" />
+        </viewer>
     </section>
 </template>
 
@@ -58,28 +74,118 @@ export default {
             total: 0,
             page: 1,
             size: 20,
-            list: []
+            list: [],
+
+            // 上传证件数据
+            certificateForm: {
+                id: null,
+                certificate: null
+            },
+            images: [],
         }
     },
     methods: {
+        mail(ids) {
+            this.$confirm('确认邮寄该讲师的证书?', '邮寄', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+            }).then(() => {
+                this.http.post('/exam-record/batchPost', {
+                    idString: ids
+                }, res => {
+                    this.getList()
+                    this.$message.success('邮寄成功!');
+                }, () => { })
+            })
+        },
+        previewImage(urls) {
+            this.images = [urls];
+            this.$nextTick(() => {
+                if (this.$refs.imageWrapper && this.$refs.imageWrapper.$viewer) {
+                    this.$refs.imageWrapper.$viewer.show();
+                }
+            });
+        },
+        uploadCertificate() {
+            this.http.post('/exam-record/uploadCerticate', {
+                ...this.certificateForm
+            }, res => {
+                this.getList()
+                this.$message.success('操作成功');
+            }, () => { })
+        },
+        certificateClick(row) {
+            this.certificateForm = {
+                id: row.id,
+                certificate: ''
+            }
+        },
+        checkAndAddUpload(str) {
+            if (!str) return '';
+            return str.includes('/upload/') ? str : '/upload/' + str;
+        },
+        handleCoverChange(file) {
+            const isImage = file.raw.type.includes('image');
+            const isLt5M = file.raw.size / 1024 / 1024 < 5;
+
+            if (!isImage) {
+                this.$message.error('只能上传图片文件!');
+                return;
+            }
+            if (!isLt5M) {
+                this.$message.error('图片大小不能超过5MB!');
+                return;
+            }
+
+            const formData = new FormData();
+            formData.append('multipartFile', file.raw);
+
+            this.http.uploadFile('/common/uploadFile', formData, res => {
+                if (res.code === "ok") {
+                    this.certificateForm.certificate = this.checkAndAddUpload(res.data)
+                    this.uploadCertificate()
+                } else {
+                    this.$message.error(res.msg || '上传失败');
+                }
+            });
+        },
+        beforeCoverUpload(file) {
+            const isImage = file.type.includes('image');
+            const isLt5M = file.size / 1024 / 1024 < 5;
+
+            if (!isImage) {
+                this.$message.error('只能上传图片文件!');
+                return false;
+            }
+            if (!isLt5M) {
+                this.$message.error('图片大小不能超过5MB!');
+                return false;
+            }
+            return true;
+        },
         // 搜索考试信息
         searchList() {
             this.page = 1;
             this.getList();
         },
 
-        // 获取考试信息列表
         getList() {
-            // 待接口联调
-            return
             this.listLoading = true;
-            this.http.post('/exam-info/pageList', {
+            this.http.post('/exam-record/list', {
                 name: this.keyword,
                 courseName: this.courseName,
-                page: this.page,
-                size: this.size
+                status: true,
+                isPost: '',
+                pageIndex: this.page,
+                pageSize: this.size
             }, res => {
-                this.list = res.data.records;
+                this.list = (res.data.records || []).map(item => {
+                    return {
+                        ...item,
+                        certificate: item.certificate ? this.checkAndAddUpload(item.certificate) : '',
+                    }
+                });
                 this.total = res.data.total;
                 this.listLoading = false;
             }, () => {
@@ -116,4 +222,12 @@ export default {
 .toolbar {
     padding-bottom: 10px;
 }
+
+.lecturer-photo {
+    width: 80px;
+    height: 80px;
+    object-fit: cover;
+    border-radius: 10px;
+    cursor: pointer;
+}
 </style>

+ 58 - 5
fhKeeper/formulahousekeeper/course-pc/src/views/examinationManagement/examRegistrationReview.vue

@@ -63,6 +63,19 @@
                 :page-sizes="[10, 20, 50, 100]" :page-size="size" layout="total, sizes, prev, pager, next"
                 :total="total" style="float:right;"></el-pagination>
         </el-col>
+
+        <!-- 驳回弹窗 -->
+        <el-dialog title="驳回原因" :visible.sync="rejectDialogVisible" width="30%">
+            <el-form ref="rejectForm" :model="rejectData" label-width="0px">
+                <el-form-item>
+                    <el-input type="textarea" :rows="4" v-model="rejectData.reason" placeholder="请输入驳回原因"></el-input>
+                </el-form-item>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button @click="rejectDialogVisible = false">取 消</el-button>
+                <el-button type="primary" :disabled="!rejectData.reason" @click="submitReject">确 定</el-button>
+            </div>
+        </el-dialog>
     </section>
 </template>
 
@@ -85,6 +98,13 @@ export default {
             size: 20,
             list: [],
             selectedIds: [],
+
+            // 弹窗
+            rejectDialogVisible: false,
+            rejectData: {
+                idString: '',
+                reason: ''
+            }
         }
     },
     methods: {
@@ -154,7 +174,7 @@ export default {
 
         // 选择变化
         handleSelectionChange(val) {
-            this.selectedIds = val.map(item => item.id);
+            this.selectedIds = val.map(item => item.parentId);
         },
 
         // 通过单个
@@ -164,18 +184,29 @@ export default {
                 cancelButtonText: '取消',
                 type: 'warning'
             }).then(() => {
-                console.log('通过:', row.id);
+                post('/exam-check/approve', { idString: row.parentId }).then(res => {
+                    this.$message({
+                        message: '操作成功',
+                        type: 'success'
+                    });
+                    this.getList();
+                })
             });
         },
 
         // 驳回单个
         reject(row) {
+            console.log('row:', row);
             this.$confirm('确认驳回该报名申请?', '提示', {
                 confirmButtonText: '确定',
                 cancelButtonText: '取消',
                 type: 'warning'
             }).then(() => {
-                console.log('驳回:', row.id);
+                this.rejectData = {
+                    idString: row.parentId,
+                    reason: ''
+                }
+                this.rejectDialogVisible = true
             });
         },
 
@@ -188,7 +219,13 @@ export default {
                 cancelButtonText: '取消',
                 type: 'warning'
             }).then(() => {
-                console.log('批量通过:', this.selectedIds);
+                post('/exam-check/approve', { idString: this.selectedIds.join(',') }).then(res => {
+                    this.$message({
+                        message: '操作成功',
+                        type: 'success'
+                    });
+                    this.getList();
+                })
             });
         },
 
@@ -201,8 +238,24 @@ export default {
                 cancelButtonText: '取消',
                 type: 'warning'
             }).then(() => {
-                console.log('批量驳回:', this.selectedIds);
+                this.rejectData = {
+                    idString: this.selectedIds.join(','),
+                    reason: ''
+                }
+                this.rejectDialogVisible = true
             });
+        },
+
+        // 确定驳回
+        submitReject() {
+            post('/exam-check/deny', { ...this.rejectData }).then(res => { 
+                this.$message({
+                    message: '驳回成功',
+                    type: 'success'
+                });
+                this.getList()
+                this.rejectDialogVisible = false
+            })
         }
     },
 

+ 22 - 12
fhKeeper/formulahousekeeper/course-pc/src/views/examinationManagement/examResults.vue

@@ -4,23 +4,34 @@
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true" @submit.native.prevent>
                 <el-form-item label="姓名">
-                    <el-input v-model="keyword" placeholder="请输入" clearable @change="searchList"
+                    <el-input v-model="keyword" placeholder="请输入" clearable @input="searchList"
                         size="small"></el-input>
                 </el-form-item>
                 <el-form-item label="课程名称">
-                    <el-input v-model="courseName" placeholder="请输入" clearable @change="searchList"
+                    <el-input v-model="courseName" placeholder="请输入" clearable @input="searchList"
                         size="small"></el-input>
                 </el-form-item>
+                <el-form-item label="考试结果">
+                    <el-select v-model="courseStatus" placeholder="请选择" size="small">
+                        <el-option label="合格" :value="true"></el-option>
+                        <el-option label="不合格" :value="false"></el-option>
+                    </el-select>
+                </el-form-item>
             </el-form>
         </el-col>
 
         <!--表格-->
         <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
             <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
-            <el-table-column prop="course" label="姓名" min-width="120" align="center"></el-table-column>
-            <el-table-column prop="course" label="考试课程" min-width="180" align="center"></el-table-column>
-            <el-table-column prop="name" label="考试结果" min-width="120" align="center"></el-table-column>
-            <el-table-column prop="account" label="考试分数" min-width="150" align="center"></el-table-column>
+            <el-table-column prop="name" label="姓名" min-width="120" align="center"></el-table-column>
+            <el-table-column prop="courseName" label="考试课程" min-width="180" align="center"></el-table-column>
+            <el-table-column prop="status" label="考试结果" min-width="120" align="center">
+                <template slot-scope="scope">
+                    <el-tag v-if="scope.row.status" type="success">合格</el-tag>
+                    <el-tag v-else type="danger">不合格</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column prop="score" label="考试分数" min-width="150" align="center"></el-table-column>
         </el-table>
 
         <!--分页-->
@@ -45,6 +56,7 @@ export default {
             // 搜索条件
             keyword: null,
             courseName: null,
+            courseStatus: null,
 
             // 表格相关
             tableHeight: 0,
@@ -56,22 +68,20 @@ export default {
         }
     },
     methods: {
-        // 搜索考试信息
         searchList() {
             this.page = 1;
             this.getList();
         },
 
-        // 获取考试信息列表
         getList() {
             // 待接口联调
-            return
             this.listLoading = true;
-            this.http.post('/exam-info/pageList', {
+            this.http.post('/exam-record/list', {
                 name: this.keyword,
                 courseName: this.courseName,
-                page: this.page,
-                size: this.size
+                status: this.courseStatus,
+                pageIndex: this.page,
+                pageSize: this.size
             }, res => {
                 this.list = res.data.records;
                 this.total = res.data.total;

+ 13 - 8
fhKeeper/formulahousekeeper/course-pc/src/views/examinationManagement/examinationInformation.vue

@@ -4,7 +4,11 @@
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true" @submit.native.prevent>
                 <el-form-item label="姓名">
-                    <el-input v-model="keyword" placeholder="请输入姓名" clearable @change="searchList"
+                    <el-input v-model.trim="keyword" placeholder="请输入" clearable @input="searchList"
+                        size="small"></el-input>
+                </el-form-item>
+                <el-form-item label="课程名称">
+                    <el-input v-model.trim="courseName" placeholder="请输入" clearable @input="searchList"
                         size="small"></el-input>
                 </el-form-item>
             </el-form>
@@ -13,10 +17,10 @@
         <!--表格-->
         <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
             <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
-            <el-table-column prop="course" label="考试课程" min-width="180" align="center"></el-table-column>
+            <el-table-column prop="courseName" label="考试课程" min-width="180" align="center"></el-table-column>
             <el-table-column prop="name" label="姓名" min-width="120" align="center"></el-table-column>
-            <el-table-column prop="account" label="账号" min-width="150" align="center"></el-table-column>
-            <el-table-column prop="password" label="密码" min-width="150" align="center"></el-table-column>
+            <!-- <el-table-column prop="account" label="账号" min-width="150" align="center"></el-table-column> -->
+            <!-- <el-table-column prop="password" label="密码" min-width="150" align="center"></el-table-column> -->
         </el-table>
 
         <!--分页-->
@@ -40,6 +44,7 @@ export default {
         return {
             // 搜索条件
             keyword: null,
+            courseName: '',
 
             // 表格相关
             tableHeight: 0,
@@ -60,12 +65,12 @@ export default {
         // 获取考试信息列表
         getList() {
             // 待接口联调
-            return
             this.listLoading = true;
-            this.http.post('/exam-info/pageList', {
+            this.http.post('/exam-check/getExamInfoList', {
                 name: this.keyword,
-                page: this.page,
-                size: this.size
+                courseName: this.courseName,
+                pageIndex: this.page,
+                pageSize: this.size
             }, res => {
                 this.list = res.data.records;
                 this.total = res.data.total;

+ 141 - 0
fhKeeper/formulahousekeeper/course-pc/src/views/orderAndFinancialManagement/electronicInvoiceRegistration.vue

@@ -0,0 +1,141 @@
+<template>
+  <section>
+    <!--搜索栏-->
+    <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
+      <el-form :inline="true" @submit.native.prevent>
+        <!-- <el-form-item label="姓名">
+          <el-input v-model="keyword" placeholder="请输入" clearable @change="searchList" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="课程名称">
+          <el-input v-model="courseName" placeholder="请输入" clearable @change="searchList" size="small"></el-input>
+        </el-form-item> -->
+
+        <el-button type="primary" size="small" style="float: right;margin-bottom: 10px" @click="exportExcel()"
+          :loading="exportExcelLoading">导出</el-button>
+      </el-form>
+    </el-col>
+
+    <!--表格-->
+    <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column prop="name" label="学员姓名" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="idNumber" label="证件号码" min-width="180" align="center"></el-table-column>
+      <el-table-column prop="teachVeriPrice" label="培训费/认证费" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="materialPrice" label="资料费" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="other1Price" label="其他费用1" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="other2Price" label="其他费用2" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="payDate" label="打款日期" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="name" label="汇款方名称" min-width="180" align="center"></el-table-column>
+      <el-table-column prop="receiveMoneyCompany" label="收款单位" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="payWay" label="打款方式" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="invoiceDate" label="开票日期" min-width="150" align="center"></el-table-column>
+    </el-table>
+
+    <!--分页-->
+    <el-col :span="24" class="toolbar">
+      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+        :page-sizes="[10, 20, 50, 100]" :page-size="size" layout="total, sizes, prev, pager, next" :total="total"
+        style="float:right;"></el-pagination>
+    </el-col>
+  </section>
+</template>
+
+<script>
+import { fixedDataGender, fixedDataCertificateType, fixedDataOrNot, fixedDataInvoiceSubject, fixedDatainvoiceType } from '../../common/js/fixedData'
+export default {
+  data() {
+    return {
+      // 搜索条件
+      keyword: null,
+      courseName: null,
+
+      // 表格相关
+      tableHeight: 0,
+      listLoading: false,
+      total: 0,
+      page: 1,
+      size: 20,
+      list: [],
+      exportExcelLoading: false
+    }
+  },
+  methods: {
+    exportExcel() {
+      this.exportExcelLoading = true;
+      this.http.post('/user-exam-info/exportInvoiceList', {
+        // name: this.keyword,
+        // courseName: this.courseName
+      }, res => {
+        if (res.code == "ok") {
+          var filePath = res.data;
+          const a = document.createElement('a'); // 创建a标签
+          a.setAttribute('download', '学员缴费情况.xlsx');// download属性
+          a.setAttribute('href', filePath);// href链接
+          a.click(); //自执行点击事件
+          a.remove();
+        } else {
+          this.$message({
+            message: res.msg,
+            type: "error"
+          });
+        }
+      }, () => {
+        this.exportExcelLoading = false;
+      })
+    },
+    searchList() {
+      this.page = 1;
+      this.getList();
+    },
+
+    getList() {
+      this.listLoading = true;
+      this.http.post('/user-exam-info/getInvoiceList', {
+        name: this.keyword,
+        courseName: this.courseName,
+        pageIndex: this.page,
+        pageSize: this.size
+      }, res => {
+        this.list = (res.data.records || []).map(item => {
+          const { sex, idType, invoiceType, isIndivdual } = item
+          return {
+            ...item
+          }
+        });
+        this.total = res.data.total;
+        this.listLoading = false;
+      }, () => {
+        this.listLoading = false;
+      })
+    },
+
+    // 分页相关
+    handleCurrentChange(val) {
+      this.page = val;
+      this.getList();
+    },
+    handleSizeChange(val) {
+      this.page = 1;
+      this.size = val;
+      this.getList();
+    }
+  },
+  created() {
+    let height = window.innerHeight;
+    this.tableHeight = height - 195;
+    const that = this;
+    window.onresize = function temp() {
+      that.tableHeight = window.innerHeight - 195;
+    };
+  },
+  mounted() {
+    this.getList();
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.toolbar {
+  padding-bottom: 10px;
+}
+</style>

+ 38 - 17
fhKeeper/formulahousekeeper/course-pc/src/views/orderAndFinancialManagement/orderManagement.vue

@@ -4,15 +4,14 @@
     <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
       <el-form :inline="true" @submit.native.prevent>
         <el-form-item label="姓名">
-          <el-input v-model="keyword" placeholder="请输入" clearable @change="searchList" size="small"></el-input>
+          <el-input v-model="keyword" placeholder="请输入" clearable @input="searchList" size="small"></el-input>
         </el-form-item>
         <el-form-item label="课程名称">
-          <el-input v-model="courseName" placeholder="请输入" clearable @change="searchList" size="small"></el-input>
+          <el-input v-model="courseName" placeholder="请输入" clearable @input="searchList" size="small"></el-input>
         </el-form-item>
         <el-form-item label="课程分类">
           <el-select v-model="courseType" placeholder="请选择" size="small" clearable @change="searchList">
-            <!-- <el-option label="线上课" :value="0"></el-option> -->
-            <!-- <el-option label="线下课" :value="1"></el-option> -->
+            <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
           </el-select>
         </el-form-item>
       </el-form>
@@ -20,10 +19,10 @@
 
     <!--表格-->
     <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-      <el-table-column prop="course" label="姓名" min-width="120" align="center"></el-table-column>
-      <el-table-column prop="name" label="课程分类" min-width="120" align="center"></el-table-column>
-      <el-table-column prop="course" label="课程名称" min-width="180" align="center"></el-table-column>
-      <el-table-column prop="name" label="价格" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="userName" label="姓名" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="typeName" label="课程分类" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="courseName" label="课程名称" min-width="180" align="center"></el-table-column>
+      <el-table-column prop="coursePrice" label="价格(元)" min-width="120" align="center"></el-table-column>
     </el-table>
 
     <!--分页-->
@@ -36,6 +35,7 @@
 </template>
 
 <script>
+import { post, checkAndAddUpload } from '../../api'
 export default {
   data() {
     return {
@@ -50,35 +50,55 @@ export default {
       total: 0,
       page: 1,
       size: 20,
-      list: []
+      list: [],
+
+      // 课程分类
+      categoryOptions: []
     }
   },
   methods: {
-    // 搜索考试信息
+    // 搜索
     searchList() {
       this.page = 1;
       this.getList();
     },
 
-    // 获取考试信息列表
+    // 获取列表
     getList() {
-      // 待接口联调
-      return
       this.listLoading = true;
-      this.http.post('/exam-info/pageList', {
-        name: this.keyword,
+      this.http.post('/bill/billManagerList', {
+        userName: this.keyword,
+        typeId: this.courseType,
         courseName: this.courseName,
         page: this.page,
         size: this.size
       }, res => {
-        this.list = res.data.records;
-        this.total = res.data.total;
+        this.list = res.data.data;
+        this.total = res.data.size;
         this.listLoading = false;
       }, () => {
         this.listLoading = false;
       })
     },
 
+    obtainCourseClassification() {
+      post(`/course-type/list`, {}).then(res => {
+        if (res.code == "ok") {
+          // 将后端返回的数据转换为前端需要的格式
+          this.categoryOptions = res.data.map(item => ({
+            label: item.typeName,
+            value: item.id,
+            coverImage: item.coverImage || ''
+          }));
+        } else {
+          this.$message({
+            message: res.msg || '获取分类列表失败',
+            type: 'error'
+          });
+        }
+      })
+    },
+
     // 分页相关
     handleCurrentChange(val) {
       this.page = val;
@@ -100,6 +120,7 @@ export default {
   },
   mounted() {
     this.getList();
+    this.obtainCourseClassification()
   }
 }
 </script>

+ 10 - 6
fhKeeper/formulahousekeeper/course-pc/src/views/trainingClassManagement/registration.vue

@@ -30,7 +30,6 @@
     <transition name="fade" mode="out-in">
       <el-table v-if="activeTab === 'pre-registration'" :data="preRegistrationList" highlight-current-row
         v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-        <el-table-column label="序号" prop="id" width="80" align="center"></el-table-column>
         <el-table-column label="姓名" prop="name" align="center"></el-table-column>
         <el-table-column label="手机号" prop="phone" align="center"></el-table-column>
         <el-table-column label="操作" width="180" align="center" fixed="right">
@@ -46,12 +45,10 @@
       <div>
         <el-table v-if="activeTab === 'course-registration'" :data="courseRegistrationList" highlight-current-row
           v-loading="listLoading" :height="tableHeight - 58" style="width: 100%;">
-          <el-table-column label="序号" width="80" align="center">
-            <template slot-scope="scope">{{ scope.$index + 1 }}</template>
-          </el-table-column>
           <el-table-column label="姓名" prop="name" width="140" align="center"></el-table-column>
           <el-table-column label="手机号" prop="phone" width="200" align="center"></el-table-column>
           <el-table-column label="报名课程" prop="course" align="center"></el-table-column>
+          <el-table-column label="已开通考试课程" prop="openExamCourses" align="center"></el-table-column>
           <el-table-column label="操作" width="260" align="center" fixed="right">
             <template slot-scope="scope">
               <el-button size="small" type="primary" @click="editCourseRegistration(scope.row)">编辑</el-button>
@@ -145,7 +142,7 @@
       <div style="width: 100%;">
         <el-select v-model="examRow.openExamVal" multiple placeholder="请选择" style="width: 100%;">
           <el-option v-for="item in (examRow.offlineSignList || [])" :key="item.id" :label="item.courseOfflineName"
-            :value="item.courseOfflineId">
+            :value="item.courseOfflineId" :disabled="item.disabled">
           </el-option>
         </el-select>
       </div>
@@ -248,7 +245,14 @@ export default {
               ...item,
               course: item.offlineSignList.map(ua => ua.courseOfflineName).join(','),
               courseIds: item.offlineSignList.map(ua => ua.courseOfflineId).join(','),
-              courseIdList: item.offlineSignList.map(ua => ua.courseOfflineId)
+              courseIdList: item.offlineSignList.map(ua => ua.courseOfflineId),
+              offlineSignList: item.offlineSignList.map(ua => {
+                return {
+                  ...ua,
+                  disabled: ua.isExam ? true : false
+                }
+              }),
+              openExamCourses: item.offlineSignList.filter(ua => ua.isExam).map(ua => ua.courseOfflineName).join(','),
             }
           })
           this.total = total

+ 71 - 24
fhKeeper/formulahousekeeper/course-pc/src/views/trainingClassManagement/student.vue

@@ -4,13 +4,14 @@
     <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
       <el-form :inline="true" @submit.native.prevent>
         <el-form-item label="姓名">
-          <el-input v-model="keyword" placeholder="请输入" clearable @change="searchList" size="small"></el-input>
+          <el-input v-model="keyword" placeholder="请输入" clearable @input="searchList" size="small"></el-input>
         </el-form-item>
         <el-form-item label="课程名称">
-          <el-input v-model="courseName" placeholder="请输入" clearable @change="searchList" size="small"></el-input>
+          <el-input v-model="courseName" placeholder="请输入" clearable @input="searchList" size="small"></el-input>
         </el-form-item>
 
-        <el-button type="primary" size="small" style="float: right;">导出</el-button>
+        <el-button type="primary" size="small" style="float: right;" @click="exportExcel()"
+          :loading="exportExcelLoading">导出</el-button>
       </el-form>
     </el-col>
 
@@ -18,22 +19,23 @@
     <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
       <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
       <el-table-column prop="name" label="姓名" min-width="120" align="center"></el-table-column>
-      <el-table-column prop="gender" label="性别" min-width="120" align="center"></el-table-column>
-      <el-table-column prop="id_type" label="证件类型" min-width="120" align="center"></el-table-column>
-      <el-table-column prop="id_number" label="证件号码" min-width="180" align="center"></el-table-column>
+      <el-table-column prop="sex" label="性别" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="idType" label="证件类型" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="idNumber" label="证件号码" min-width="180" align="center"></el-table-column>
       <el-table-column prop="phone" label="手机号码" min-width="150" align="center"></el-table-column>
-      <el-table-column prop="work_unit" label="工作单位" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="school" label="工作单位" min-width="150" align="center"></el-table-column>
       <el-table-column prop="address" label="联系地址" min-width="180" align="center"></el-table-column>
-      <el-table-column prop="project_name" label="项目名称" min-width="180" align="center"></el-table-column>
-      <el-table-column prop="project_level" label="项目等级" min-width="120" align="center"></el-table-column>
-      <el-table-column prop="start_date" label="培训开始日期" min-width="150" align="center"></el-table-column>
-      <el-table-column prop="end_date" label="培训结束日期" min-width="150" align="center"></el-table-column>
-      <el-table-column prop="study_hours" label="培训学时" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="courseName" label="项目名称" min-width="180" align="center"></el-table-column>
+      <el-table-column prop="level" label="项目等级" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="billIndate" label="培训开始日期" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="quizIndate" label="培训结束日期" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="teachDuration" label="培训学时" min-width="120" align="center"></el-table-column>
       <el-table-column prop="score" label="评定成绩" min-width="120" align="center"></el-table-column>
-      <el-table-column prop="certificate_date" label="证书日期" min-width="150" align="center"></el-table-column>
-      <el-table-column prop="photo" label="照片" min-width="100" align="center">
+      <el-table-column prop="certCreateDate" label="证书日期" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="portraitUrl" label="照片" min-width="100" align="center">
         <template slot-scope="scope">
-          <img :src="scope.row.photo" alt="photo" style="width: 50px; height: 50px; border-radius: 50%;" />
+          <img :src="scope.row.portraitUrl" alt="photo" style="width: 50px; height: 50px;cursor: pointer;"
+            @click="previewImage(scope.row.portraitUrl)" />
         </template>
       </el-table-column>
     </el-table>
@@ -44,10 +46,16 @@
         :page-sizes="[10, 20, 50, 100]" :page-size="size" layout="total, sizes, prev, pager, next" :total="total"
         style="float:right;"></el-pagination>
     </el-col>
+
+    <viewer ref="imageWrapper" :images="previewImages" style="opacity: 1;position: absolute;top: -9999px;">
+      <img v-for="(image, index) in previewImages" :src="image" :key="index" />
+    </viewer>
   </section>
 </template>
 
 <script>
+import { post, checkAndAddUpload } from '../../api'
+import { fixedDataGender, fixedDataCertificateType, fixedDataOrNot, fixedDataInvoiceSubject, fixedDatainvoiceType } from '../../common/js/fixedData'
 export default {
   data() {
     return {
@@ -61,28 +69,67 @@ export default {
       total: 0,
       page: 1,
       size: 20,
-      list: []
+      list: [],
+      exportExcelLoading: false,
+      previewImages: []
     }
   },
   methods: {
-    // 搜索考试信息
+    exportExcel() {
+      this.exportExcelLoading = true;
+      this.http.post('/exam-info/exportExcel', {
+        name: this.keyword,
+        courseName: this.courseName
+      }, res => {
+        if (res.code == "ok") {
+          var filePath = res.data;
+          const a = document.createElement('a'); // 创建a标签
+          a.setAttribute('download', '学员名单.xlsx');// download属性
+          a.setAttribute('href', filePath);// href链接
+          a.click(); //自执行点击事件
+          a.remove();
+        } else {
+          this.$message({
+            message: res.msg,
+            type: "error"
+          });
+        }
+      }, () => {
+        this.exportExcelLoading = false;
+      })
+    },
     searchList() {
       this.page = 1;
       this.getList();
     },
+    previewImage(url) {
+      this.previewImages = [url];
+      this.$nextTick(() => {
+        if (this.$refs.imageWrapper && this.$refs.imageWrapper.$viewer) {
+          this.$refs.imageWrapper.$viewer.show();
+        }
+      });
+    },
 
-    // 获取考试信息列表
     getList() {
-      // 待接口联调
-      return
       this.listLoading = true;
-      this.http.post('/exam-info/pageList', {
+      this.http.post('/user-exam-info/getStudentInfoList', {
         name: this.keyword,
         courseName: this.courseName,
-        page: this.page,
-        size: this.size
+        pageIndex: this.page,
+        pageSize: this.size
       }, res => {
-        this.list = res.data.records;
+        this.list = (res.data.records || []).map(item => {
+          const { sex, idType, invoiceType, isIndivdual } = item
+          return {
+            ...item,
+            portraitUrl: item.portraitUrl ? checkAndAddUpload(item.portraitUrl) : '',
+            sex: fixedDataGender.find(item => item.value == (sex ? 1 : 0)).label,
+            idType: fixedDataCertificateType.find(item => item.value == idType).label,
+            invoiceType: fixedDatainvoiceType.find(item => item.value == invoiceType).label,
+            isIndivdual: fixedDataInvoiceSubject.find(item => item.value == (isIndivdual ? 1 : 0)).label,
+          }
+        });
         this.total = res.data.total;
         this.listLoading = false;
       }, () => {

+ 47 - 20
fhKeeper/formulahousekeeper/course-pc/src/views/trainingClassManagement/studentPayment.vue

@@ -10,7 +10,8 @@
           <el-input v-model="courseName" placeholder="请输入" clearable @change="searchList" size="small"></el-input>
         </el-form-item>
 
-        <el-button type="primary" size="small" style="float: right;">导出</el-button>
+        <el-button type="primary" size="small" style="float: right;" @click="exportExcel()"
+          :loading="exportExcelLoading">导出</el-button>
       </el-form>
     </el-col>
 
@@ -18,16 +19,16 @@
     <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
       <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
       <el-table-column prop="name" label="学员姓名" min-width="120" align="center"></el-table-column>
-      <el-table-column prop="id_number" label="证件号码" min-width="180" align="center"></el-table-column>
-      <el-table-column prop="training_fee" label="培训费/认证费" min-width="150" align="center"></el-table-column>
-      <el-table-column prop="data_fee" label="资料费" min-width="120" align="center"></el-table-column>
-      <el-table-column prop="other_fee_1" label="其他费用1" min-width="120" align="center"></el-table-column>
-      <el-table-column prop="other_fee_2" label="其他费用2" min-width="120" align="center"></el-table-column>
-      <el-table-column prop="payment_date" label="打款日期" min-width="150" align="center"></el-table-column>
-      <el-table-column prop="remitter_name" label="汇款方名称" min-width="180" align="center"></el-table-column>
-      <el-table-column prop="recipient_unit" label="收款单位" min-width="150" align="center"></el-table-column>
-      <el-table-column prop="payment_method" label="打款方式" min-width="150" align="center"></el-table-column>
-      <el-table-column prop="invoice_date" label="开票日期" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="idNumber" label="证件号码" min-width="180" align="center"></el-table-column>
+      <el-table-column prop="teachVeriPrice" label="培训费/认证费" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="materialPrice" label="资料费" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="other1Price" label="其他费用1" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="other2Price" label="其他费用2" min-width="120" align="center"></el-table-column>
+      <el-table-column prop="payDate" label="打款日期" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="name" label="汇款方名称" min-width="180" align="center"></el-table-column>
+      <el-table-column prop="receiveMoneyCompany" label="收款单位" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="payWay" label="打款方式" min-width="150" align="center"></el-table-column>
+      <el-table-column prop="invoiceDate" label="开票日期" min-width="150" align="center"></el-table-column>
     </el-table>
 
     <!--分页-->
@@ -40,6 +41,7 @@
 </template>
 
 <script>
+import { fixedDataGender, fixedDataCertificateType, fixedDataOrNot, fixedDataInvoiceSubject, fixedDatainvoiceType } from '../../common/js/fixedData'
 export default {
   data() {
     return {
@@ -53,28 +55,53 @@ export default {
       total: 0,
       page: 1,
       size: 20,
-      list: []
+      list: [],
+      exportExcelLoading: false
     }
   },
   methods: {
-    // 搜索考试信息
+    exportExcel() {
+      this.exportExcelLoading = true;
+      this.http.post('/user-exam-info/exportStudentPayList', {
+        name: this.keyword,
+        courseName: this.courseName
+      }, res => {
+        if (res.code == "ok") {
+          var filePath = res.data;
+          const a = document.createElement('a'); // 创建a标签
+          a.setAttribute('download', '学员缴费情况.xlsx');// download属性
+          a.setAttribute('href', filePath);// href链接
+          a.click(); //自执行点击事件
+          a.remove();
+        } else {
+          this.$message({
+            message: res.msg,
+            type: "error"
+          });
+        }
+      }, () => {
+        this.exportExcelLoading = false;
+      })
+    },
     searchList() {
       this.page = 1;
       this.getList();
     },
 
-    // 获取考试信息列表
     getList() {
-      // 待接口联调
-      return
       this.listLoading = true;
-      this.http.post('/exam-info/pageList', {
+      this.http.post('/user-exam-info/getStudentPayList', {
         name: this.keyword,
         courseName: this.courseName,
-        page: this.page,
-        size: this.size
+        pageIndex: this.page,
+        pageSize: this.size
       }, res => {
-        this.list = res.data.records;
+        this.list = (res.data.records || []).map(item => {
+          const { sex, idType, invoiceType, isIndivdual } = item
+          return {
+            ...item
+          }
+        });
         this.total = res.data.total;
         this.listLoading = false;
       }, () => {

+ 49 - 53
fhKeeper/formulahousekeeper/course-pc/src/views/userAndMessageManagement/userManagement.vue

@@ -4,55 +4,40 @@
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true" @submit.native.prevent>
                 <el-form-item label="注册时间">
-                    <el-date-picker
-                        v-model="dateRange"
-                        type="daterange"
-                        range-separator="至"
-                        start-placeholder="开始日期"
-                        end-placeholder="结束日期"
-                        size="small"
-                        @change="searchList">
+                    <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期"
+                        end-placeholder="结束日期" size="small" value-format="yyyy-MM-dd" @change="searchList">
                     </el-date-picker>
                 </el-form-item>
                 <el-form-item label="姓名">
-                    <el-input v-model="nameKeyword" placeholder="请输入姓名" clearable size="small" @change="searchList"></el-input>
+                    <el-input v-model="nameKeyword" placeholder="请输入姓名" clearable size="small"
+                        @input="searchList"></el-input>
                 </el-form-item>
             </el-form>
         </el-col>
 
         <!--列表-->
-        <el-table 
-            :data="list" 
-            highlight-current-row 
-            v-loading="listLoading" 
-            :height="tableHeight" 
-            style="width: 100%;" >
-            <el-table-column prop="courseName" label="用户名" min-width="120" align="center"></el-table-column>
-            <el-table-column prop="name" label="手机号" width="100" align="center"></el-table-column>
-            <el-table-column prop="company" label="注册时间" min-width="150" align="center"></el-table-column>
-            <el-table-column label="操作" width="180" class-name="btns" header-align="center" fixed="right">
+        <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+            <el-table-column prop="name" label="用户名" min-width="120" align="left"></el-table-column>
+            <el-table-column prop="phone" label="手机号" width="150" align="center"></el-table-column>
+            <el-table-column prop="createTime" label="注册时间" min-width="150" align="center"></el-table-column>
+            <!-- <el-table-column label="操作" width="180" class-name="btns" header-align="center" fixed="right">
                 <template slot-scope="scope">
-                    <el-button size="small" type="success">重置密码</el-button>
+                    <el-button size="small" type="success" @click="resetPassword(scope.row)">重置密码</el-button>
                 </template>
-            </el-table-column>
+            </el-table-column> -->
         </el-table>
 
         <!--工具条-->
         <el-col :span="24" class="toolbar">
-            <el-pagination
-                @size-change="handleSizeChange"
-                @current-change="handleCurrentChange"
-                :page-sizes="[10, 20, 50, 100]"
-                :page-size="size"
-                layout="total, sizes, prev, pager, next"
-                :total="total"
-                style="float:right;"
-            ></el-pagination>
+            <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                :page-sizes="[10, 20, 50, 100]" :page-size="size" layout="total, sizes, prev, pager, next"
+                :total="total" style="float:right;"></el-pagination>
         </el-col>
     </section>
 </template>
 
 <script>
+import { post, checkAndAddUpload } from '../../api'
 export default {
     data() {
         return {
@@ -72,6 +57,28 @@ export default {
         }
     },
     methods: {
+        resetPassword(row) {
+            const { name, id } = row
+            this.$confirm(`是否将【${name}】的密码重置为000000?`, '重置密码', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+            }).then(() => {
+                post('/user/resetPwd', { userId: id }).then(res => {
+                    if (res.code == 'ok') {
+                        this.$message({
+                            message: '密码已重置为000000,请通知员工及时修改',
+                            type: 'success'
+                        });
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        });
+                    }
+                });
+            })
+        },
         // 搜索列表
         searchList() {
             this.page = 1;
@@ -81,30 +88,19 @@ export default {
         // 获取列表
         getList() {
             this.listLoading = true;
-            // 模拟数据
-            setTimeout(() => {
-                this.list = [
-                    {
-                        id: 1,
-                        courseName: 'GCP认证考试',
-                        name: '张三',
-                        gender: '男',
-                        company: '某某医院',
-                        phone: '13800138000',
-                        idType: '身份证',
-                        idNumber: '110101199003072345',
-                        address: '北京市朝阳区某某路1号',
-                        email: 'zhangsan@example.com',
-                        invoiceType: '增值税普通发票',
-                        invoiceName: '某某医院',
-                        invoiceDate: '2025-07-01',
-                        taxNumber: '123456789012345',
-                        idPhoto: ''
-                    }
-                ];
-                this.total = 1;
+            post(`/user/userPageList`, {
+                username: this.nameKeyword,
+                startDate: (this.dateRange || [])[0] || '',
+                endDate: (this.dateRange || [])[1] || '',
+                page: this.page,
+                size: this.size
+            }).then(res => {
+                const { data = [], total = 0 } = res.data
+                this.list = data
+                this.total = total
+            }).finally(() => {
                 this.listLoading = false;
-            }, 500);
+            })
         },
 
         // 分页相关