소스 검색

新建训练营

xw 1 주 전
부모
커밋
c148fcf9e4
5개의 변경된 파일269개의 추가작업 그리고 17개의 파일을 삭제
  1. 9 0
      src/api/course/userCourseCamp.js
  2. 9 0
      src/api/qw/sopTemp.js
  3. 107 3
      src/views/course/userCoursePeriod/index.vue
  4. 1 0
      src/views/hisStore/storeProduct/index.vue
  5. 143 14
      src/views/qw/sopTemp/index.vue

+ 9 - 0
src/api/course/userCourseCamp.js

@@ -59,3 +59,12 @@ export function getScreeningCampPeriod(query) {
     params: query
   })
 }
+
+// 更新训练营序号
+export function updateCampOrderNumber(params) {
+  return request({
+    url: '/course/trainingCamp/updateOrderNumber',
+    method: 'post',
+    params: params
+  })
+}

+ 9 - 0
src/api/qw/sopTemp.js

@@ -81,6 +81,15 @@ export function addTemp(data) {
   })
 }
 
+// 新增总后台模板
+export function addHeadquartersTemplate(data) {
+  return request({
+    url: '/qw/sopTemp/addHeadquartersTemplate',
+    method: 'post',
+    data: data
+  })
+}
+
 // 新增sop模板
 export function copyTemplate(data) {
   return request({

+ 107 - 3
src/views/course/userCoursePeriod/index.vue

@@ -48,7 +48,22 @@
                 {{ item.trainingCampName }}
               </div>
               <div class="camp-info">
-                <span>序号:{{ item.orderNumber }}</span>
+                <span>
+                  序号:
+                  <el-input-number
+                    v-model="item.orderNumber"
+                    :min="1"
+                    :max="9999"
+                    :controls="false"
+                    size="mini"
+                    style="width: 80px;"
+                    @blur="handleCampOrderNumberBlur(item)"
+                    @keyup.enter.native="handleCampOrderNumberEnter($event, item)"
+                    @click.native.stop
+                    v-hasPermi="['course:trainingCamp:edit']"
+                  />
+                  <span v-if="!item.orderNumber" style="color: #c0c4cc;">-</span>
+                </span>
                 <span>最新营期开课:{{ item.recentDate || '-' }}</span>
               </div>
               <div class="camp-stats">
@@ -822,9 +837,9 @@
 </template>
 
 <script>
-import {addPeriod, delPeriod, exportPeriod, getPeriod, pagePeriod, updatePeriod, getDays, addCourse,delPeriodDay,  updateCourseTime, updateCourseDate, updateListCourseData, periodCourseMove, closePeriod, batchAddCourseSections,copyExistCampPeriod} from "@/api/course/userCoursePeriod";
+import {addPeriod, delPeriod, exportPeriod, getPeriod, pagePeriod, updatePeriod, getDays, addCourse,delPeriodDay,  updateCourseTime, updateCourseDate, updateListCourseData, periodCourseMove, closePeriod, batchAddCourseSections,copyExistCampPeriod, updateOrderNumber} from "@/api/course/userCoursePeriod";
 import {getCompanyList} from "@/api/company/company";
-import {listCamp, addCamp, editCamp, delCamp, copyCamp, getScreeningCampPeriod} from "@/api/course/userCourseCamp";
+import {listCamp, addCamp, editCamp, delCamp, copyCamp, getScreeningCampPeriod, updateCampOrderNumber} from "@/api/course/userCourseCamp";
 import { courseList,videoList } from '@/api/course/courseRedPacketLog'
 import RedPacket from './redPacket.vue'
 import BatchRedPacket from './batchRedPacket.vue'
@@ -2304,6 +2319,83 @@ export default {
         this.$message.error('查询营期失败: ' + (error.message || '查询营期失败'));
       });
     },
+    /** 处理序号失焦事件 */
+    handleOrderNumberBlur(row) {
+      this.updateOrderNumber(row);
+    },
+    /** 处理序号回车事件 */
+    handleOrderNumberEnter(row) {
+      this.updateOrderNumber(row);
+    },
+    /** 更新序号 */
+    updateOrderNumber(row) {
+      // 校验序号值
+      if (!row.orderNumber || row.orderNumber < 1 || row.orderNumber > 9999) {
+        this.$message.warning('请输入有效的序号(1-9999)');
+        return;
+      }
+
+      // 调用接口更新序号
+      const data = {
+        periodId: row.periodId,
+        orderNumber: row.orderNumber
+      };
+
+      updateOrderNumber(data).then(response => {
+        if (response.code === 200) {
+          this.$message.success('序号更新成功');
+          // 刷新列表以保持排序一致
+          this.getList();
+        } else {
+          this.$message.error(response.msg || '序号更新失败');
+          // 更新失败时刷新列表,恢复原值
+          this.getList();
+        }
+      }).catch(error => {
+        this.$message.error('序号更新失败:' + (error.message || '未知错误'));
+        // 更新失败时刷新列表,恢复原值
+        this.getList();
+      });
+    },
+    /** 处理训练营序号失焦事件 */
+    handleCampOrderNumberBlur(item) {
+      this.updateCampOrderNumber(item);
+    },
+    /** 处理训练营序号回车事件 */
+    handleCampOrderNumberEnter(event, item) {
+      // 移除焦点,触发blur事件
+      event.target.blur();
+    },
+    /** 更新训练营序号 */
+    updateCampOrderNumber(item) {
+      // 校验序号值
+      if (!item.orderNumber || item.orderNumber < 1 || item.orderNumber > 9999) {
+        this.$message.warning('请输入有效的序号(1-9999)');
+        return;
+      }
+
+      // 调用接口更新序号,使用params传参
+      const params = {
+        trainingCampId: item.trainingCampId,
+        orderNumber: item.orderNumber
+      };
+
+      updateCampOrderNumber(params).then(response => {
+        if (response.code === 200) {
+          this.$message.success('训练营序号更新成功');
+          // 刷新训练营列表以保持排序一致(序号越大排在越前面)
+          this.getLeftList();
+        } else {
+          this.$message.error(response.msg || '训练营序号更新失败');
+          // 更新失败时刷新列表,恢复原值
+          this.getLeftList();
+        }
+      }).catch(error => {
+        this.$message.error('训练营序号更新失败:' + (error.message || '未知错误'));
+        // 更新失败时刷新列表,恢复原值
+        this.getLeftList();
+      });
+    },
   },
 };
 </script>
@@ -2446,6 +2538,18 @@ export default {
   font-size: 12px;
   color: #c4c1c1;
   line-height: 1.5;
+  align-items: center;
+}
+
+.camp-info .el-input-number {
+  line-height: 1;
+}
+
+.camp-info .el-input-number .el-input__inner {
+  padding: 0 5px;
+  text-align: center;
+  height: 24px;
+  line-height: 24px;
 }
 
 .camp-stats {

+ 1 - 0
src/views/hisStore/storeProduct/index.vue

@@ -992,6 +992,7 @@ import Editor from '@/components/Editor/wang';
 import Material from '@/components/Material'
 import singleImg from '@/components/Material/single'
 import { getCompanyList } from "@/api/company/company";
+import { listStore } from "@/api/hisStore/store";
 export default {
   name: "HisStoreProduct",
   components: {

+ 143 - 14
src/views/qw/sopTemp/index.vue

@@ -90,6 +90,30 @@
         </el-dropdown>
       </el-col>
 
+      <el-col :span="1.5" v-if="isAdmin">
+        <el-dropdown
+          @command="handleHeadquartersCommand"
+          trigger="click"
+          placement="bottom-start"
+        >
+          <el-dropdown-menu slot="dropdown" style="width: 120px;">
+            <el-dropdown-item
+              v-for="option in sysQwSopType"
+              :key="option.dictValue"
+              :command="option.dictValue"
+            >
+              <i :class="option.iconClass" style="margin-right: 10px;"></i>
+              {{ option.dictLabel }}
+            </el-dropdown-item>
+          </el-dropdown-menu>
+          <span class="el-dropdown-link">
+              <el-button type="success" icon="el-icon-plus" plain size="mini">
+                创建总后台模板
+              </el-button>
+            </span>
+        </el-dropdown>
+      </el-col>
+
       <el-col :span="1.5">
         <el-button
           type="danger"
@@ -125,7 +149,15 @@
           <el-tag v-for="item in companys" v-if="scope.row.companyId == item.companyId">{{ item.companyName }}</el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="模板标题" align="center" prop="name"/>
+      <el-table-column label="模板标题" align="center" prop="name">
+        <template slot-scope="scope">
+          <span>
+            <el-tag v-if="scope.row.isTop === 1" type="warning" size="mini" style="margin-right: 5px;">置顶</el-tag>
+            <el-tag v-if="scope.row.templateType === 1" type="primary" size="mini" style="margin-right: 5px;">总后台</el-tag>
+            {{ scope.row.name }}
+          </span>
+        </template>
+      </el-table-column>
       <el-table-column label="模板类型" align="center" prop="sendType">
         <template slot-scope="scope">
           <dict-tag :options="sysQwSopType" :value="scope.row.sendType"/>
@@ -160,6 +192,7 @@
           >详情
           </el-button>
           <el-button
+            v-if="canEdit(scope.row)"
             size="mini"
             type="text"
             icon="el-icon-edit"
@@ -168,6 +201,7 @@
           >修改
           </el-button>
           <el-button
+            v-if="canEdit(scope.row)"
             size="mini"
             type="text"
             icon="el-icon-edit"
@@ -180,7 +214,7 @@
             type="text"
             icon="el-icon-edit"
             @click="handleUpdateRed(scope.row)"
-            v-if="scope.row.sendType == 5"
+            v-if="scope.row.sendType == 5 && canEdit(scope.row)"
             v-hasPermi="['qw:sopTemp:edit']"
           >红包设置
           </el-button>
@@ -229,6 +263,15 @@
             </el-radio>
           </el-radio-group>
         </el-form-item>
+        <el-form-item label="是否置顶" v-if="isHeadquarters">
+          <el-switch
+            v-model="form.isTop"
+            :active-value="1"
+            :inactive-value="0"
+            active-text="是"
+            inactive-text="否">
+          </el-switch>
+        </el-form-item>
         <el-form-item label="所属项目" prop="project" v-if="form.sendType != 5">
           <el-select v-model="form.project" placeholder="请选择项目" filterable clearable size="small">
             <el-option
@@ -308,6 +351,8 @@
 <script>
 import {
   addTemp,
+  addHeadquartersTemplate,
+  toggleTop,
   copyTemplate,
   delSopTemp,
   exportSopTemp,
@@ -327,6 +372,10 @@ export default {
   name: "SopTemp",
   data() {
     return {
+      // 是否为总后台用户
+      isAdmin: false,
+      // 是否为总后台模板操作
+      isHeadquarters: false,
       // 遮罩层
       loading: true,
       companysloading: false,
@@ -422,6 +471,10 @@ export default {
     };
   },
   created() {
+    // 检查是否为总后台用户(admin角色)
+    const roles = this.$store.getters.roles || [];
+    this.isAdmin = roles.includes('admin');
+
     this.getList();
     this.getDicts("sys_company_status").then(response => {
       this.statusOptions = response.data;
@@ -479,6 +532,8 @@ export default {
         time: "",
         timeList: [{value: ""}],
         status: "1",
+        isTop: 0,
+        templateType: this.isHeadquarters ? 1 : 0,
       };
       this.resetForm("form");
     },
@@ -498,12 +553,21 @@ export default {
       //   this.$router.push('/qw/sopTemp/addAiChatTemp')
       // }else{
       this.sendType = command;
+      this.isHeadquarters = false;
       this.title = "新增";
       this.reset();
       this.open = true;
       // this.$router.push('/qw/sopTemp/addTemp/'+command)
       // }
     },
+    /** 创建总后台模板命令 */
+    handleHeadquartersCommand(command) {
+      this.sendType = command;
+      this.isHeadquarters = true;
+      this.title = "创建总后台模板";
+      this.reset();
+      this.open = true;
+    },
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id)
@@ -530,6 +594,30 @@ export default {
       this.$router.push(`/course/sopTempe/updateSopTemp/${row.id}/3`)
       // }
     },
+    /** 判断是否可以编辑 */
+    canEdit(row) {
+      // 总后台用户可以编辑所有模板
+      if (this.isAdmin) {
+        return true;
+      }
+      // 子公司用户不能编辑总后台模板
+      if (row.templateType === 1) {
+        return false;
+      }
+      return true;
+    },
+    /** 判断是否可以删除 */
+    canDelete(row) {
+      // 总后台用户可以删除所有模板
+      if (this.isAdmin) {
+        return true;
+      }
+      // 子公司用户不能删除总后台模板
+      if (row.templateType === 1) {
+        return false;
+      }
+      return true;
+    },
     /** 修改按钮操作 */
     handleUpdate(row) {
       // if (row.sendType==4) {
@@ -578,26 +666,43 @@ export default {
      * 复制模板
      */
     copyTemplate(row) {
-      // if(row.sendType==4){
-      //   this.$router.push(`/qw/sopTemp/updateAiChatTemp/${row.id}/2`)
-      // }else{
-      this.getInfo(row.id, 2);
-      // this.$router.push(`/qw/sopTemp/updateSopTemp/${row.id}/2`)
-      // }
+      // 如果是总后台模板,弹出确认对话框
+      if (row.templateType === 1) {
+        this.$confirm('您正在复制【总后台模板】,复制后将成为您公司的普通模板,是否继续?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.getInfo(row.id, 2);
+        }).catch(() => {
+          // 用户取消操作
+        });
+      } else {
+        // 普通模板直接复制
+        this.getInfo(row.id, 2);
+      }
     },
     getInfo(id, command) {
       getSopTemp(id).then(response => {
         this.command = command;
         if (command == 2) {
           this.title = "复制";
+          this.isHeadquarters = false;
         }
         if (command == 1) {
           this.title = "修改";
+          this.isHeadquarters = response.data.templateType === 1;
         }
         this.form = response.data;
         if(response.data.project){
           this.form.project = String(response.data.project)
         }
+        // 复制总后台模板时,将templateType设置为0(普通模板)
+        if (command == 2 && response.data.templateType === 1) {
+          this.form.templateType = 0;
+          this.form.isTop = 0;
+          this.form.name = response.data.name + '_副本';
+        }
         this.open = true;
       });
     },
@@ -617,27 +722,51 @@ export default {
             background: 'rgba(0, 0, 0, 0.7)'
           });
           if (this.command == 2) {
+            // 复制模板
             copyTemplate(f).then(response => {
               this.msgSuccess("复制成功");
               this.open = false;
               loading.close();
               this.getList();
+            }).catch(() => {
+              loading.close();
             });
           } else {
             if (f.id != null) {
+              // 修改模板
               updateTemp(f).then(response => {
                 this.msgSuccess("修改成功");
                 this.open = false;
                 loading.close();
                 this.getList();
-              });
-            } else {
-              addTemp(f).then(response => {
-                this.msgSuccess("新增成功");
-                this.open = false;
+              }).catch(() => {
                 loading.close();
-                this.getList();
               });
+            } else {
+              // 新增模板:判断是否为总后台模板
+              if (this.isHeadquarters) {
+                // 调用新增总后台模板接口
+                f.templateType = 1;
+                addHeadquartersTemplate(f).then(response => {
+                  this.msgSuccess("新增总后台模板成功");
+                  this.open = false;
+                  loading.close();
+                  this.getList();
+                }).catch(() => {
+                  loading.close();
+                });
+              } else {
+                // 调用普通模板接口
+                f.templateType = 0;
+                addTemp(f).then(response => {
+                  this.msgSuccess("新增成功");
+                  this.open = false;
+                  loading.close();
+                  this.getList();
+                }).catch(() => {
+                  loading.close();
+                });
+              }
             }
           }
         }