Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

吴树波 2 miesięcy temu
rodzic
commit
d29ca9b769

+ 8 - 0
src/api/course/userCoursePeriod.js

@@ -199,3 +199,11 @@ export function periodList(data) {
     data: data
   })
 }
+// 根据公司批量设置红包金额
+export function batchSaveRedPacketByCompany(data) {
+  return request({
+    url: '/course/period/batchRedPacket/byCompany',
+    method: 'post',
+    data: data
+  })
+}

+ 3 - 1
src/views/components/course/userCourseCatalogDetails.vue

@@ -765,10 +765,12 @@ export default {
             });
             return
           }
-          if (!this.form.timeRange&& this.form.timeRange.length === 2) {
+
+          if (this.form.timeRange && this.form.timeRange.length === 2) {
             this.form.viewStartTime = this.form.timeRange[0];
             this.form.viewEndTime = this.form.timeRange[1];
           }
+
           if (this.form.duration == null) {
             this.$message({
               message: '未识别到视频时长请稍等。。。',

+ 117 - 26
src/views/course/userCoursePeriod/redPacket.vue

@@ -1,24 +1,36 @@
 <template>
   <div>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          size="mini"
+          :disabled="this.selectCompanyIds.length === 0"
+          @click="handleChangeRedPacket"
+          v-hasPermi="['course:period:setCompanyRedPacket']"
+        >批量设置红包</el-button>
+      </el-col>
+    </el-row>
     <!-- 公司列表弹窗 -->
-<!--    <el-dialog title="设置红包" :visible.sync="companyDialogVisible" width="800px" append-to-body>-->
-      <el-table :data="companyList" border>
-        <el-table-column type="index" label="序号" width="60" align="center" />
-        <el-table-column label="公司名称" prop="companyName" align="center" />
-        <el-table-column label="操作" align="center" width="120">
-          <template slot-scope="scope">
-            <el-button
-              size="mini"
-              type="text"
-              @click="handleInputAmount(scope.row)"
-              v-hasPermi="['course:period:setCourseRedPacket']"
-            >设置红包</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-<!--      <div slot="footer" class="dialog-footer">-->
-<!--      </div>-->
-<!--    </el-dialog>-->
+    <!--    <el-dialog title="设置红包" :visible.sync="companyDialogVisible" width="800px" append-to-body>-->
+    <el-table :data="companyList" border @selection-change="handleSelectionCompany">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column type="index" label="序号" width="60" align="center" />
+      <el-table-column label="公司名称" prop="companyName" align="center" />
+      <el-table-column label="操作" align="center" width="120">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleInputAmount(scope.row)"
+            v-hasPermi="['course:period:setCourseRedPacket']"
+          >设置红包</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!--      <div slot="footer" class="dialog-footer">-->
+    <!--      </div>-->
+    <!--    </el-dialog>-->
 
     <!-- 课程红包设置弹窗 -->
     <el-dialog title="设置红包金额" :visible.sync="courseDialogVisible" width="1200px" append-to-body>
@@ -31,7 +43,7 @@
           <template slot-scope="scope">
             <el-input-number
               v-model="scope.row.amount"
-              :min="0.1"
+              :min="0.0"
               :precision="2"
               :step="0.01"
               size="small"
@@ -47,11 +59,44 @@
         <el-button type="primary" @click="handleSave">保 存</el-button>
       </div>
     </el-dialog>
+
+    <!-- 课程红包设置弹窗 -->
+    <el-dialog title="设置红包金额" :visible.sync="batchRedPacketDialog.visible" width="400px" append-to-body>
+      <el-form ref="batchRedPacketForm" :model="batchRedPacketDialog.form" label-width="100px">
+        <el-form-item label="红包金额" prop="amount" :rules="{required: true, message: '红包金额不能为空', trigger: 'blur'}">
+          <div style="display: inline-flex; align-items: center">
+            <el-input-number
+              v-model="batchRedPacketDialog.form.amount"
+              :min="0.1"
+              :precision="2"
+              :step="0.01"
+              size="small"
+            >
+            </el-input-number>
+            <span style="margin-left: 10px">元</span>
+          </div>
+          <div style="color: rgba(169,88,18,0.9)">金额低于0.1元将自动置为0.1元</div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="batchRedPacketDialog.visible = false">取 消</el-button>
+        <el-button type="primary"
+                   :loading="batchRedPacketDialog.saveLoading"
+                   :disabled="batchRedPacketDialog.saveLoading"
+                   @click="handleChange">保 存</el-button>
+      </div>
+    </el-dialog>
+
   </div>
 </template>
 
 <script>
-import { getPeriodCompanyList, batchSaveRedPacket, getPeriodRedPacketList } from "@/api/course/userCoursePeriod";
+import {
+  getPeriodCompanyList,
+  batchSaveRedPacket,
+  getPeriodRedPacketList,
+  batchSaveRedPacketByCompany
+} from "@/api/course/userCoursePeriod";
 import redPacket from "@/views/course/userCoursePeriod/redPacket.vue";
 
 export default {
@@ -86,7 +131,15 @@ export default {
       courseDialogVisible: false,
       companyList: [],
       redPacketList: [],
-      currentCompany: null
+      currentCompany: null,
+      selectCompanyIds: [],
+      batchRedPacketDialog: {
+        visible: false,
+        form: {
+          amount: 0.1
+        },
+        saveLoading: false,
+      }
     };
   },
   created() {
@@ -130,23 +183,23 @@ export default {
       }).then(response => {
         this.redPacketList = (response.data || []).map(item => ({
           ...item,
-          amount: item.amount || 0.1
+          amount:item.amount ?? 0.1
         }));
       });
     },
     // 保存红包金额
     handleSave() {
       // 筛选出有金额的项目
-      const validAmountItems = this.redPacketList.filter(item => item.amount > 0);
+      const validAmountItems = this.redPacketList.filter(item => item.amount >= 0);
       if (validAmountItems.length === 0) {
         this.$message.warning('请至少设置一个红包金额');
         return;
       }
 
       // 验证金额范围
-      const invalidItems = validAmountItems.filter(item => item.amount < 0.1);
+      const invalidItems = validAmountItems.filter(item => item.amount < 0.0);
       if (invalidItems.length > 0) {
-        this.$message.error('红包金额需要大于等于0.1元');
+        this.$message.error('红包金额需要大于等于0元');
         return;
       }
 
@@ -169,7 +222,45 @@ export default {
       }).catch(error => {
         this.$message.error("保存失败:" + error.message);
       });
-    }
+    },
+    handleSelectionCompany(selection) {
+      this.selectCompanyIds = selection.map(item => item.companyId);
+    },
+    handleChangeRedPacket() {
+      this.batchRedPacketDialog.visible = true
+      this.$refs.batchRedPacketForm.resetFields()
+    },
+    handleChange() {
+      if (!this.selectCompanyIds.length) {
+        this.$message.warning('请选择公司');
+        return;
+      }
+
+      this.$refs.batchRedPacketForm.validate((valid) => {
+        if (!valid) {
+          this.$message.warning('请填写正确的红包金额')
+          return;
+        }
+        this.batchRedPacketDialog.saveLoading = true
+
+        const saveData = {
+          periodId: this.periodId,
+          companyIds: this.selectCompanyIds,
+          redPacketMoney: this.batchRedPacketDialog.form.amount
+        }
+        batchSaveRedPacketByCompany(saveData).then(response => {
+          const {code, msg} = response
+          if (code === 200) {
+            this.$message.success('保存成功');
+            this.batchRedPacketDialog.visible = false;
+            this.$emit('success');
+          } else {
+            this.$message.error(msg || "保存失败");
+          }
+          this.batchRedPacketDialog.saveLoading = false
+        })
+      });
+    },
   }
 };
 </script>

+ 8 - 2
src/views/index.vue

@@ -1010,6 +1010,9 @@ export default {
      * @returns {string} 格式化后的字符串,包含数值和单位
      */
     formatBytes(bytes, decimals = 2) {
+      const isNegative = bytes < 0;  // 判断是否为负数
+      bytes = Math.abs(bytes);  // 获取绝对值
+
       if (bytes === 0) return '0 Byte';
 
       const k = 1024;
@@ -1022,7 +1025,10 @@ export default {
       const value = bytes / Math.pow(k, i);
 
       // 格式化为指定小数位的字符串
-      return parseFloat(value.toFixed(decimals)) + ' ' + sizes[Math.min(i, sizes.length - 1)];
+      const result = parseFloat(value.toFixed(decimals)) + ' ' + sizes[Math.min(i, sizes.length - 1)];
+
+      // 如果是负数,返回带负号的值
+      return isNegative ? `-${result}` : result;
     },
     // 手动刷新
     manualRefresh() {
@@ -1066,7 +1072,7 @@ export default {
         if(res.code === 200) {
           this.todayTraffic = res.data.today;
           this.thisMonthTraffic = res.data.thisMonth;
-          this.trafficCount = res.data.traffic!=null?res.data.traffic:0;
+          this.trafficCount = res.data.traffic;
         }
       })