dsy преди 1 седмица
родител
ревизия
dd63d00c0e

+ 1 - 1
src/components/CommonPreview.vue

@@ -58,7 +58,7 @@
             <span class="name nowrap-ellipsis" :title="name">
               {{ name }}
             </span>
-            <span v-if="type === 'edit_preview'" class="status">{{ status_name }}</span>
+            <span v-if="['audit', 'edit_preview'].includes(type)" class="status">{{ status_name }}</span>
           </div>
         </div>
       </aside>

+ 17 - 0
src/utils/common.js

@@ -149,3 +149,20 @@ export function getArrayDepth(arr) {
 export function sanitizeHTML(html) {
   return DOMPurify.sanitize(html, { ADD_ATTR: ['target'] });
 }
+
+/**
+ * 获取滚动条宽度
+ * @returns {number} 滚动条宽度
+ */
+export function getScrollbarWidth() {
+  const el = document.createElement('div');
+  el.style.width = '100px';
+  el.style.height = '100px';
+  el.style.overflow = 'scroll';
+  el.style.position = 'absolute';
+  el.style.top = '-9999px';
+  document.body.appendChild(el);
+  const width = el.offsetWidth - el.clientWidth;
+  document.body.removeChild(el);
+  return width;
+}

+ 36 - 19
src/views/personal_workbench/check_task/audit/index.vue

@@ -2,27 +2,27 @@
   <div class="audit">
     <MenuPage only-key="/personal_workbench/check_task" />
 
-    <CommonPreview :id="id" ref="preview" :project-id="project_id" :is-audit="true">
+    <CommonPreview :id="id" ref="preview" :project-id="project_id" :is-audit="true" type="audit">
       <template #operator="{ courseware }">
         <span v-if="isTrue(courseware.is_can_add_audit_remark)" class="link" @click="addRemark">添加审校批注</span>
         <span
           v-if="isTrue(courseware.is_can_finish_audit)"
           class="link"
-          @click="finishCoursewareCurFlowNodeAudit('false', 'complete')"
+          @click="finishCoursewareCurFlowNodeAudit('false', 'complete', courseware.cur_audit_flow_node_type)"
         >
           审校完成
         </span>
         <span
           v-if="isTrue(courseware.is_can_audit_pass)"
           class="link"
-          @click="finishCoursewareCurFlowNodeAudit('true', 'pass')"
+          @click="finishCoursewareCurFlowNodeAudit('true', 'pass', courseware.cur_audit_flow_node_type)"
         >
           审核通过
         </span>
         <span
           v-if="isTrue(courseware.is_can_audit_reject)"
           class="link"
-          @click="finishCoursewareCurFlowNodeAudit('false', 'reject')"
+          @click="finishCoursewareCurFlowNodeAudit('false', 'reject', courseware.cur_audit_flow_node_type)"
         >
           审核驳回
         </span>
@@ -49,6 +49,7 @@ export default {
     return {
       id: this.$route.params.id || '',
       project_id: this.$route.query.project_id || '',
+      isSubmitting: false,
       actionTip: {
         complete: '是否确认审校完成?',
         pass: '是否确认审校通过?',
@@ -62,23 +63,39 @@ export default {
      * 提交课件到审校流程
      * @param {'true'|'false'} is_pass - 是否通过审校
      * @param {'complete'|'pass'|'reject'} action - 操作类型
+     * @param {string} flow_node_type - 审核流程节点类型
      */
-    finishCoursewareCurFlowNodeAudit(is_pass, action) {
-      this.$confirm(this.actionTip[action], '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          FinishCoursewareCurFlowNodeAudit({
-            id: this.id,
-            is_pass,
-          }).then(() => {
-            this.$message.success('操作成功');
-            this.$refs.preview.getBookCoursewareInfo(this.id);
+    async finishCoursewareCurFlowNodeAudit(is_pass, action, flow_node_type) {
+      if (this.isSubmitting) return;
+
+      try {
+        await this.$confirm(this.actionTip[action], '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning',
+        });
+
+        if (flow_node_type === 2) {
+          await this.$confirm('当前为终审环节,请确认审校通过?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning',
           });
-        })
-        .catch(() => {});
+        }
+
+        this.isSubmitting = true;
+        await FinishCoursewareCurFlowNodeAudit({ id: this.id, is_pass });
+        this.$message.success('操作成功');
+        this.$refs.preview.getBookCoursewareInfo(this.id);
+      } catch (err) {
+        // 忽略用户取消确认的情况
+        if (err === 'cancel' || err === 'close') return;
+        // 若为请求错误,尽量展示友好信息
+        const msg = (err && err.message) || (err && err.msg) || '操作失败';
+        this.$message.error(msg);
+      } finally {
+        this.isSubmitting = false;
+      }
     },
     goBackBookList() {
       this.$router.push({ path: `/personal_workbench/check_task` });

+ 5 - 9
src/views/personal_workbench/check_task/index.vue

@@ -78,6 +78,7 @@ import MenuPage from '../common/menu.vue';
 import { ChapterGetBookChapterStructExpandList } from '@/api/book';
 import { PageQueryMyProjectList_Auditor } from '@/api/list';
 import { isTrue } from '@/utils/validate';
+import { getScrollbarWidth } from '@/utils/common';
 
 export default {
   name: 'CheckTaskPage',
@@ -123,9 +124,10 @@ export default {
         this.$nextTick(() => {
           const chapterList = this.$refs.chapterList;
           if (chapterList.scrollHeight > chapterList.clientHeight) {
-            this.$refs.chapterHeader.classList.add('has-scrollbar');
+            const scrollWidth = getScrollbarWidth();
+            this.$refs.chapterHeader.style.paddingRight = `${scrollWidth}px`;
           } else {
-            this.$refs.chapterHeader.classList.remove('has-scrollbar');
+            this.$refs.chapterHeader.style.paddingRight = '0';
           }
         });
       });
@@ -157,8 +159,6 @@ export default {
      * @returns {Object} - 样式对象
      */
     computedPathStyle(isMyAuditTask) {
-      console.log(isMyAuditTask);
-
       return {
         color: isMyAuditTask ? '#165dff' : 'default',
       };
@@ -332,10 +332,6 @@ export default {
           font-weight: bold;
           text-align: center;
         }
-
-        &.has-scrollbar {
-          padding-right: 15px;
-        }
       }
 
       .chapter-list {
@@ -344,7 +340,7 @@ export default {
 
         .chapter-item {
           display: flex;
-          align-items: center;
+          align-items: stretch;
           font-size: 14px;
           border-bottom: $border;
 

+ 4 - 6
src/views/personal_workbench/edit_task/index.vue

@@ -73,6 +73,7 @@ import MenuPage from '../common/menu.vue';
 import { PageQueryMyProjectList_Producer } from '@/api/list';
 import { ChapterGetBookChapterStructExpandList } from '@/api/book';
 import { isTrue } from '@/utils/validate';
+import { getScrollbarWidth } from '@/utils/common';
 
 export default {
   name: 'EditTask',
@@ -121,9 +122,10 @@ export default {
         this.$nextTick(() => {
           const chapterList = this.$refs.chapterList;
           if (chapterList.scrollHeight > chapterList.clientHeight) {
-            this.$refs.chapterHeader.classList.add('has-scrollbar');
+            const scrollWidth = getScrollbarWidth();
+            this.$refs.chapterHeader.style.paddingRight = `${scrollWidth}px`;
           } else {
-            this.$refs.chapterHeader.classList.remove('has-scrollbar');
+            this.$refs.chapterHeader.style.paddingRight = '0';
           }
         });
       });
@@ -316,10 +318,6 @@ export default {
 
         @include cell;
 
-        &.has-scrollbar {
-          padding-right: 15px;
-        }
-
         .cell {
           font-weight: bold;
           text-align: center;