Procházet zdrojové kódy

Merge branch 'master' of http://10.8.230.114:3000/wangbin/log-server-web

倚楼听风雨 před 3 roky
rodič
revize
9347c51a91

+ 15 - 0
src/api/log.js

@@ -122,4 +122,19 @@ export const exportExcel = (tableData, fileName) => {
   }).then((res) => {
     handleFileError(res, fileName)
   })
+}
+
+
+export const computerRateExport = (tableData, fileName) => {
+  service({
+    url: '/loging/computerRateExport',
+    method: 'post',
+    data: {
+      fileName: fileName,
+      infoList: tableData
+    },
+    responseType: 'blob'
+  }).then((res) => {
+    handleFileError(res, fileName)
+  })
 }

+ 63 - 0
src/api/task.js

@@ -110,4 +110,67 @@ export const createGameTask = (data) => {
       method: 'post',
       data
     })
+  }
+
+  export const taskResetFee = (data) => {
+    return service({
+      url: '/gameTask/taskResetFee',
+      method: 'post',
+      data
+    })
+  }
+
+  export const getFeeAccountList = (data) => {
+    return service({
+      url: '/gameTask/getFeeAccountList',
+      method: 'post',
+      data
+    })
+  }
+
+  const handleFileError = (res, fileName) => {
+    if (typeof (res.data) !== 'undefined') {
+      if (res.data.type === 'application/json') {
+        const reader = new FileReader()
+        reader.onload = function() {
+          const message = JSON.parse(reader.result).msg
+          ElMessage({
+            showClose: true,
+            message: message,
+            type: 'error'
+          })
+        }
+        reader.readAsText(new Blob([res.data]))
+      }
+    } else {
+      var downloadUrl = window.URL.createObjectURL(new Blob([res]))
+      var a = document.createElement('a')
+      a.style.display = 'none'
+      a.href = downloadUrl
+      a.download = fileName
+      var event = new MouseEvent('click')
+      a.dispatchEvent(event)
+    }
+  }
+  
+  // @Tags excel
+  // @Summary 导出Excel
+  // @Security ApiKeyAuth
+  // @accept application/json
+  // @Produce  application/octet-stream
+  // @Param data body model.ExcelInfo true "导出Excel文件信息"
+  // @Success 200
+  // @Router /gameTask/taskTargetExport [post]
+  export const taskTargetExport = (tableData, fileName) => {
+    service({
+      url: '/gameTask/taskTargetExport',
+      method: 'post',
+      data: {
+        fileName: fileName,
+        infoList: tableData
+      },
+      responseType: 'blob'
+    }).then((res) => {
+      handleFileError(res, fileName)
+    })
   }

+ 143 - 34
src/view/gameTarget/target.vue

@@ -15,6 +15,17 @@
               />
             </el-select>
           </el-form-item>
+          <el-form-item label="游戏端口">
+            <el-select v-model="searchInfo.game_port_id" placeholder="请选择" style="width:100%">
+                  <el-option
+                    v-for="item in GamePortOptions"
+                    :key="item.id"
+                    :label="`${item.name}`"
+                    :value="item.id"
+                  />
+                </el-select>
+          </el-form-item>
+          
           <el-form-item label="状态">
           <el-select v-model="searchInfo.is_complete" placeholder="是否完成" >
               <el-option
@@ -26,24 +37,28 @@
               />
             </el-select>
         </el-form-item>
-          <el-form-item label="日期" prop="create_date">
-          <el-date-picker
-            v-model="searchInfo.create_date"
-            popper-class="picker-popovers"
-            class="timefilter"
-            type="datetime"
-            placeholder="选择日期时间"
-            value-format="YYYY-MM-DD"
-          >
-          </el-date-picker>
-        </el-form-item>
+        <el-form-item label="日期" prop="date">
+            <el-date-picker
+              v-model="searchInfo.date"
+              size="default"
+              type="daterange"
+              unlink-panels
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              :disabled-date="disabledDate"
+              :shortcuts="shortcuts"
+            />
+          </el-form-item>
           <el-form-item>
             <el-button size="small" type="primary" icon="search" @click="onSubmit">查询</el-button>
             <el-button size="small" icon="refresh" @click="onReset">重置</el-button>
+            <el-button class="excel-btn" size="small" type="primary" icon="download" @click="handleExcelExport">导出</el-button>
           </el-form-item>
         </el-form>
       </div>
       <div class="gva-table-box">
+        
         <el-table :data="tableData" border @sort-change="sortChange" @selection-change="handleSelectionChange" style="width: 100%">
           <el-table-column label="任务ID" width="70" prop="task_id" sortable="custom" />
           <el-table-column label="任务日期" min-width="100" prop="create_date" />
@@ -52,29 +67,31 @@
           <el-table-column label="登录方式" width="75" prop="login_method" />
           <el-table-column label="新增目标" width="75" prop="new_target" />
           <el-table-column  label="新增完成" width="75" prop="new_complete" />
-          <el-table-column fixed="right" align="right" label="剩余新增" width="75" prop="new_target1">
+          <el-table-column  label="剩余新增" width="75" prop="new_target1">
             <template #default="scope">
-              {{ scope.row.new_target <= scope.row.new_complete+scope.row.hand_new_complete  ? 0 : scope.row.new_complete+scope.row.hand_new_complete-scope.row.new_target}}
+              {{ scope.row.new_target <= scope.row.new_complete  ? 0 : scope.row.new_complete-scope.row.new_target}}
             </template>
           </el-table-column>
-          <el-table-column fixed="right" align="right" label="留存目标" width="75" prop="retained_target" />
-          <el-table-column fixed="right" align="right" label="留存完成" width="75" prop="retained_complete" />
-          <el-table-column fixed="right" align="right" label="剩余留存" width="75" prop="retained_target1">
+          <el-table-column  label="留存目标" width="75" prop="retained_target" />
+          <el-table-column label="留存完成" width="75" prop="retained_complete" />
+          <el-table-column label="剩余留存" width="75" prop="retained_target1">
             <template #default="scope">
-              {{ scope.row.retained_target <= scope.row.retained_complete+scope.row.hand_retained_complete  ? 0 : scope.row.retained_complete+scope.row.hand_retained_complete-scope.row.retained_target}}
+              {{ scope.row.retained_target <= scope.row.retained_complete  ? 0 : scope.row.retained_complete-scope.row.retained_target}}
             </template>
           </el-table-column>
-          <el-table-column fixed="right" align="right"  label="付费目标" width="75" prop="pay_target" />
-          <el-table-column fixed="right" align="right" label="付费完成" width="75" prop="pay_complete" />
-          <el-table-column fixed="right" align="right" label="剩余付费" width="75" prop="pay_target1">
+          <el-table-column  label="付费目标" width="75" prop="pay_target" />
+          <el-table-column label="付费完成" width="75" prop="pay_complete" />
+          <el-table-column label="剩余付费" width="75" prop="pay_target1">
             <template #default="scope">
-              {{ scope.row.pay_target <= scope.row.pay_complete+scope.row.hand_pay_complete  ? 0 : scope.row.pay_complete+scope.row.hand_pay_complete-scope.row.pay_target}}
+              {{ scope.row.pay_target <= scope.row.pay_complete  ? 0 : scope.row.pay_complete-scope.row.pay_target}}
             </template>
           </el-table-column>
-          <el-table-column fixed="right" align="right" label="付费流水" width="75" prop="amount"/>
-          <el-table-column fixed="right" align="right" label="手动新增" width="75" prop="hand_new_complete"/>
-          <el-table-column fixed="right" align="right" label="手动留存" width="75" prop="hand_retained_complete"/>
-          <el-table-column fixed="right" align="right" label="手动付费" width="75" prop="hand_pay_complete"/>
+          <el-table-column label="付费流水" width="75" prop="amount"/>
+          <el-table-column label="群控效率" width="75" prop="game_rate"/>
+          <el-table-column label="手动新增" width="75" prop="hand_new_complete"/>
+          <el-table-column label="手动留存" width="75" prop="hand_retained_complete"/>
+          <el-table-column label="手动付费" width="75" prop="hand_pay_complete"/>
+          <el-table-column label="手动付费金额" width="75" prop="hand_amount_total"/>
           <el-table-column fixed="right" align="right" label="是否完成" width="75" prop="is_complete" >
           <template #default="scope">
             <div>
@@ -82,7 +99,7 @@
             </div>
           </template>
         </el-table-column>
-          <el-table-column fixed="right" align="right"  label="操作" width="140">
+          <el-table-column fixed="right" label="操作" width="160">
             <template #default="scope">
               <el-button
                 icon="edit"
@@ -91,6 +108,20 @@
                 link
                 @click="editCardFunc(scope.row)"
               >编辑</el-button>
+              <el-button
+                icon="edit"
+                size="small"
+                type="primary"
+                link
+                @click="resetFeeFunc(scope.row)"
+              >重置付费</el-button>
+              <el-button
+                icon="edit"
+                size="small"
+                type="primary"
+                link
+                @click="accountListFunc(scope.row)"
+              >可付费账号</el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -232,6 +263,17 @@
           </div>
         </template>
       </el-dialog>
+      <el-dialog v-model="accountFormVisible" :before-close="closeAccount" :title="accountTitle">
+        <el-table :data="tableData1">
+          <el-table-column align="left" label="账号" show-overflow-tooltip min-width="160" prop="account" />
+          <el-table-column align="left" label="密码" show-overflow-tooltip min-width="160" prop="password" />
+        </el-table>
+        <template #footer>
+          <div class="dialog-footer">
+            <el-button size="small" @click="closeAccount">取 消</el-button>
+          </div>
+        </template>
+    </el-dialog>
     </div>
   </template>
   
@@ -246,6 +288,9 @@
     getGameTaskTargetById,
     updateGameTaskTarget,
     getGameTaskTargetList,
+    taskResetFee,
+    getFeeAccountList,
+    taskTargetExport
   } from '@/api/task'
   import {
     selectResponsiblePerson,
@@ -253,6 +298,7 @@
   import { toSQLLine } from '@/utils/stringFun'
   import warningBar from '@/components/warningBar/warningBar.vue'
   import { ref } from 'vue'
+  import dayjs from "dayjs";
   import { ElMessage, ElMessageBox } from 'element-plus'
 
   const statusFiletr = (value) => {
@@ -482,6 +528,7 @@ const deleteBtn = async(btns, index) => {
   const total = ref(0)
   const pageSize = ref(10)
   const tableData = ref([])
+  const tableData1 = ref([])
   const searchInfo = ref({})
   
   const onReset = () => {
@@ -493,6 +540,14 @@ const deleteBtn = async(btns, index) => {
     page.value = 1
     pageSize.value = 10
     searchInfo.value.task_id = Number(searchInfo.value.task_id)
+    if (typeof searchInfo.value.date != "undefined") {
+      searchInfo.value.date[0] = dayjs(searchInfo.value.date[0]).format(
+        "YYYY-MM-DD"
+      );
+      searchInfo.value.date[1] = dayjs(searchInfo.value.date[1]).format(
+        "YYYY-MM-DD"
+      );
+  }
     getTableData()
   }
   
@@ -544,6 +599,50 @@ const deleteBtn = async(btns, index) => {
   const handleSelectionChange = (val) => {
     apis.value = val
   }
+
+  const handleExcelExport = async() => {
+    var fileName = Date.parse(new Date()) + "-task.xlsx"
+    if(searchInfo.value.create_date == null){
+      let dt = new Date()
+            var y = dt.getFullYear()
+            var mt = (dt.getMonth() + 1).toString().padStart(2,'0')
+            var day = dt.getDate().toString().padStart(2,'0')
+            var timeStr = y + "-" + mt + "-" + day
+      fileName = timeStr + "-task.xlsx"
+    }else{
+      fileName = searchInfo.value.create_date + "-task.xlsx"
+    }
+    taskTargetExport({ page: page.value, pageSize: pageSize.value, ...searchInfo.value },fileName)
+}
+
+  const shortcuts = [
+  {
+    text: "今日",
+    value: () => {
+      const end = new Date();
+      const start = new Date();
+      return [start, end];
+    },
+  },
+  {
+    text: "最近一周",
+    value: () => {
+      const end = new Date();
+      const start = new Date();
+      start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+      return [start, end];
+    },
+  },
+  {
+    text: "最近一月",
+    value: () => {
+      const end = new Date();
+      const start = new Date();
+      start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+      return [start, end];
+    },
+  },
+];
   
   const deleteVisible = ref(false)
   
@@ -611,6 +710,7 @@ const deleteBtn = async(btns, index) => {
   
   const dialogTitle = ref('新增')
   const dialogFormVisible = ref(false)
+  const accountFormVisible = ref(false)
   const openDialog = (key) => {
     switch (key) {
       case 'addCard':
@@ -631,6 +731,10 @@ const deleteBtn = async(btns, index) => {
     initForm()
     dialogFormVisible.value = false
   }
+
+  const closeAccount = () => {
+    accountFormVisible.value = false
+  }
   
   const editCardFunc = async(row) => {
     const res = await getGameTaskTargetById({ id: row.task_id, create_date:row.create_date })
@@ -638,7 +742,15 @@ const deleteBtn = async(btns, index) => {
       form.value = res.data
       openDialog('edit')
     }
-    
+  }
+
+  const accountListFunc = async(row) => {
+    const res = await getFeeAccountList({ id: row.task_id, create_date:row.create_date })
+    if (res.code === 0) {
+      tableData1.value = res.data
+      dialogTitle.value = '可付费账号'
+      accountFormVisible.value = true
+    }
   }
   
   const enterDialog = async() => {
@@ -687,22 +799,19 @@ const deleteBtn = async(btns, index) => {
     })
   }
   
-  const deleteApiFunc = async(row) => {
-    ElMessageBox.confirm('此操作将永久删除所有角色下该api, 是否继续?', '提示', {
+  const resetFeeFunc = async(row) => {
+    ElMessageBox.confirm('此操作将重置付费, 是否继续?', '提示', {
       confirmButtonText: '确定',
       cancelButtonText: '取消',
       type: 'warning'
     })
       .then(async() => {
-        const res = await deleteGameTask(row)
+        const res = await taskResetFee(row)
         if (res.code === 0) {
           ElMessage({
             type: 'success',
-            message: '删除成功!'
+            message: '重置成功!'
           })
-          if (tableData.value.length === 1 && page.value > 1) {
-            page.value--
-          }
           getTableData()
         }
       })

+ 61 - 7
src/view/gameTask/list.vue

@@ -5,9 +5,27 @@
           <el-form-item label="任务Id">
             <el-input v-model="searchInfo.task_id" placeholder="任务Id" />
           </el-form-item>
-          <el-form-item label="使用者">
-            <el-input v-model="searchInfo.user" placeholder="使用者" />
+          <el-form-item label="负责人">
+            <el-select v-model="searchInfo.user" placeholder="负责人" >
+            <el-option
+                v-for="item in ResponsiblePerson"
+                :key="item.id"
+                :label="item.name"
+                :value="item.name"
+              />
+            </el-select>
           </el-form-item>
+          <el-form-item label="状态">
+          <el-select v-model="searchInfo.status" placeholder="是否完成" >
+              <el-option
+                v-for="item in searchStatusOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+                :disabled="item.disabled"
+              />
+            </el-select>
+        </el-form-item>
           <el-form-item>
             <el-button size="small" type="primary" icon="search" @click="onSubmit">查询</el-button>
             <el-button size="small" icon="refresh" @click="onReset">重置</el-button>
@@ -105,7 +123,14 @@
             <el-input v-model="form.task_name" autocomplete="off"/>
           </el-form-item>
           <el-form-item label="负责人" prop="user" >
-            <el-input v-model="form.user" autocomplete="off"/>
+            <el-select v-model="form.user" placeholder="请选择" style="width:100%">
+                  <el-option
+                    v-for="item in ResponsiblePerson"
+                    :key="item.id"
+                    :label="`${item.name}`"
+                    :value="item.name"
+                  />
+                </el-select>
           </el-form-item>
           <el-form-item label="重要参数">
             <el-radio-group v-model="form.new_retained">
@@ -253,6 +278,9 @@
     updateGameTask,
     deleteGameTask,
   } from '@/api/task'
+  import {
+    selectResponsiblePerson,
+} from '@/api/responsiblePerson'
   import { useUserStore } from '@/pinia/modules/user'
   import { toSQLLine } from '@/utils/stringFun'
   import warningBar from '@/components/warningBar/warningBar.vue'
@@ -290,6 +318,14 @@
     const target = statusOptions.value.filter(item => item.value === value)[0]
     return target && `${target.label}`
   }
+  const ResponsiblePerson = ref([])
+  const getResponsiblePerson = async() => {
+    const table = await selectResponsiblePerson()
+    if (table.code === 0) {
+      ResponsiblePerson.value = table.data
+    }
+  }
+  getResponsiblePerson()
   const searchStatusOptions = ref([
     {
       value: -1,
@@ -651,6 +687,22 @@
       form.value.retained_target = Number(form.value.retained_target)
       form.value.new_target_h = Number(form.value.new_target_h)
       form.value.retained_target_h = Number(form.value.retained_target_h)
+      if(form.value.new_target > form.value.new_target_h){
+        ElMessage({
+                  type: 'warning',
+                  message: '新增目标下限不能大于上限',
+                  showClose: false
+                })
+                return
+      }
+      if(form.value.retained_target > form.value.retained_target_h){
+        ElMessage({
+                  type: 'warning',
+                  message: '活跃目标下限不能大于上限',
+                  showClose: false
+                })
+                return
+      }
       if (valid) {
         switch (type.value) {
           case 'addCard':
@@ -662,9 +714,10 @@
                   message: '添加成功',
                   showClose: true
                 })
+                getTableData()
+                closeDialog()
               }
-              getTableData()
-              closeDialog()
+              
             }
   
             break
@@ -677,9 +730,10 @@
                   message: '编辑成功',
                   showClose: true
                 })
+                getTableData()
+                closeDialog()
               }
-              getTableData()
-              closeDialog()
+              
             }
             break
           default:

+ 1 - 4
src/view/logComputer/computerUseLog.vue

@@ -43,10 +43,7 @@
         <el-table :data="tableData"  @sort-change="sortChange" @selection-change="handleSelectionChange"
         border
         >
-          <el-table-column
-            type="selection"
-            width="55"
-          />
+          
           <el-table-column align="left" label="电脑编号" min-width="100" prop="pc_code" sortable="custom"/>
           <el-table-column align="left" label="使用者" min-width="150" prop="operator" sortable="custom"/>
           <el-table-column align="left" label="日期" min-width="150" prop="create_date" />

+ 18 - 4
src/view/logComputer/list.vue

@@ -39,13 +39,12 @@
       </el-tooltip>
     </div>
       <div class="gva-table-box">
+        <div class="gva-btn-list">
+        <el-button class="excel-btn" size="small" type="primary" icon="download" @click="handleExcelExport">导出</el-button>
+      </div>
         <el-table :data="tableData"  @sort-change="sortChange" @selection-change="handleSelectionChange"
         border
         >
-          <el-table-column
-            type="selection"
-            width="55"
-          />
           <el-table-column align="left" label="电脑编号" min-width="100" prop="pc_code" sortable="custom"/>
           <el-table-column align="left" label="脚本负责人" min-width="150" prop="operator" sortable="custom"/>
           <el-table-column align="left" label="日期" min-width="150" prop="create_date" />
@@ -101,6 +100,7 @@
   import {
     logComputerList,
     logComputerNum,
+    computerRateExport,
   } from '@/api/log'
   import { toSQLLine } from '@/utils/stringFun'
   import { ref } from 'vue'
@@ -157,6 +157,20 @@
     } 
   }
   
+  const handleExcelExport = async() => {
+    var fileName = Date.parse(new Date()) + "-cpc.xlsx"
+    if(searchInfo.value.create_date == null){
+      let dt = new Date()
+            var y = dt.getFullYear()
+            var mt = (dt.getMonth() + 1).toString().padStart(2,'0')
+            var day = dt.getDate().toString().padStart(2,'0')
+            var timeStr = y + "-" + mt + "-" + day
+      fileName = timeStr + "-cpc.xlsx"
+    }else{
+      fileName = searchInfo.value.create_date + "-cpc.xlsx"
+    }
+    computerRateExport({ page: page.value, pageSize: pageSize.value, ...searchInfo.value },fileName)
+}
 
   const value = ref('')
   const statusList = [