2
0

3 Commits 291d537a4e ... 1f58258799

Autor SHA1 Mensagem Data
  dsy 1f58258799 Merge branch 'master' of http://60.205.254.193:3000/GCLS/eep_page 1 semana atrás
  dsy a6362e1700 交稿日期 1 semana atrás
  dsy dd63d00c0e 终审确定两次 1 semana atrás

+ 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;

+ 9 - 1
src/views/personal_workbench/project/ProductionEditorialManage.vue

@@ -31,6 +31,7 @@
         <span class="title-cell">状态</span>
         <span class="title-cell">最后编辑人</span>
         <span class="title-cell">最后编辑时间</span>
+        <span class="title-cell">交稿日期</span>
         <span class="title-cell">操作</span>
       </div>
       <div class="chapters-container">
@@ -49,6 +50,7 @@
               status_name,
               last_editor_name,
               last_edit_time,
+              edit_end_date,
             },
             i
           ) in node_list"
@@ -91,6 +93,7 @@
           <div class="status">{{ status_name }}</div>
           <div class="last-editor">{{ isEnable(is_leaf_chapter) ? last_editor_name : '' }}</div>
           <div class="last-edit-time">{{ isEnable(is_leaf_chapter) ? last_edit_time : '' }}</div>
+          <div class="edit-end-date">{{ isEnable(is_leaf_chapter) ? edit_end_date : '' }}</div>
           <div class="operator">
             <template v-if="isEnable(is_leaf_chapter)">
               <span v-if="i > 0 && computedIsFirst(i)" class="link" @click="moveChapterTreeNode(i, 0)">上移</span>
@@ -424,9 +427,10 @@ export default {
      * @param {Object} data - 章节制作人数据
      * @param {string} data.node_id - 章节ID
      * @param {string} data.producer_id_list - 制作人ID列表
+     * @param {string} data.edit_end_date - 交稿日期
      */
     chapterSetProducer(data) {
-      ChapterSetProducer({ book_id: this.book_id, ...data })
+      ChapterSetProducer({ book_id: this.book_id, ...data, edit_end_date: data.edit_end_date })
         .then(() => {
           this.getBookChapterStructExpandList();
           this.$message.success('制作人设置成功');
@@ -580,6 +584,10 @@ export default {
         width: 175px;
       }
 
+      &:nth-child(7) {
+        width: 108px;
+      }
+
       &:last-child {
         flex: 1;
         min-width: 200px;

+ 31 - 1
src/views/personal_workbench/project/components/SetUser.vue

@@ -11,6 +11,11 @@
       <el-option v-for="item in memberList" :key="item.id" :label="item.name" :value="item.id" />
     </el-select>
 
+    <div v-if="type === typeList[0].type" class="end-date">
+      <span>交稿日期:</span>
+      <el-date-picker v-model="editEndDate" type="date" value-format="yyyy-MM-dd" placeholder="选择日期" />
+    </div>
+
     <div slot="footer">
       <el-button @click="dialogClose">取消</el-button>
       <el-button type="primary" @click="addChapterNode">确定</el-button>
@@ -54,6 +59,7 @@ export default {
         { type: 'auditor', label: '设置审校人', placeholder: '请选择审校人', bindKey: 'id_list', isMultiple: true },
         { type: 'mainAuditor', label: '设置主审校人', placeholder: '请选择主审校人', bindKey: 'id', isMultiple: false },
       ],
+      editEndDate: '',
     };
   },
   computed: {
@@ -100,7 +106,15 @@ export default {
     },
     addChapterNode() {
       if (this.type === this.typeList[0].type) {
-        this.$emit('chapterSetProducer', { node_id: this.id, producer_id_list: this.user.id_list });
+        if (this.editEndDate.length === 0) {
+          this.$message.error('请选择交稿日期');
+          return;
+        }
+        this.$emit('chapterSetProducer', {
+          node_id: this.id,
+          producer_id_list: this.user.id_list,
+          edit_end_date: this.editEndDate,
+        });
       }
       if (this.type === this.typeList[1].type) {
         this.$emit('SetAuditor', { flow_node_id: this.id, user_id_list: this.user.id_list });
@@ -118,4 +132,20 @@ export default {
 .el-select {
   width: 100%;
 }
+
+.el-dialog {
+  .end-date {
+    display: flex;
+    align-items: center;
+    margin-top: 16px;
+
+    span {
+      width: 80px;
+    }
+
+    .el-date-picker {
+      flex: 1;
+    }
+  }
+}
 </style>