2 Commity 04690dfe42 ... e0631e4d26

Autor SHA1 Wiadomość Data
  倚楼听风雨 e0631e4d26 Merge branch 'master' of http://10.8.230.114:3000/wangbin/log-server-web 3 lat temu
  倚楼听风雨 d7c924178c 增加租机到期提醒,优化租机管理页面 3 lat temu

+ 32 - 4
src/api/rentComputer.js

@@ -2,7 +2,7 @@
  * @Author: 倚楼听风雨 18408246387@163.com
  * @Date: 2023-01-09 16:01:45
  * @LastEditors: 倚楼听风雨 18408246387@163.com
- * @LastEditTime: 2023-03-14 15:53:20
+ * @LastEditTime: 2023-03-29 15:08:36
  * @FilePath: \log-server-web\src\api\rentComputer.js
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -174,6 +174,13 @@ export const renewRentComputer = (data) => {
     data,
   });
 };
+export const renewRentComputerByBatch = (data) => {
+  return service({
+    url: "/rentComputer/renewRentComputerByBatch",
+    method: "post",
+    data,
+  });
+};
 export const replaceNumRentComputer = (data) => {
   return service({
     url: "/rentComputer/replaceNumRentComputer",
@@ -199,21 +206,35 @@ export const offShelfRentComputer = (data) => {
 //RentComputerLedger============================================================================
 export const getRentComputerLedgerList = (data) => {
   return service({
-    url: "/rentComputer/getRentComputerLedgerList",
+    url: "/rentComputerLedger/getRentComputerLedgerList",
+    method: "post",
+    data,
+  });
+};
+export const deleteRentComputerLedgerById = (data) => {
+  return service({
+    url: "/rentComputerLedger/deleteRentComputerLedgerById",
+    method: "post",
+    data,
+  });
+};
+export const deleteRentComputerLedgerByIds = (data) => {
+  return service({
+    url: "/rentComputerLedger/deleteRentComputerLedgerByIds",
     method: "post",
     data,
   });
 };
 export const getRentComputerLedgerNum = (data) => {
   return service({
-    url: "/rentComputer/getRentComputerLedgerNum",
+    url: "/rentComputerLedger/getRentComputerLedgerNum",
     method: "post",
     data,
   });
 };
 export const exportRentLedgerListExcel = (tableData, fileName) => {
   service({
-    url: "/rentComputer/exportRentLedgerListExcel",
+    url: "/rentComputerLedger/exportRentLedgerListExcel",
     method: "post",
     data: {
       fileName: fileName,
@@ -250,3 +271,10 @@ const handleFileError = (res, fileName) => {
   }
 };
 //RentComputerLedger============================================================================
+export const queryRentComputerLogByPcNum = (data) => {
+  return service({
+    url: "/rentComputerLog/queryRentComputerLogByPcNum",
+    method: "post",
+    data,
+  });
+};

BIN
src/assets/defultThumUrl-1.png


BIN
src/assets/defultThumUrl.png


Plik diff jest za duży
+ 1 - 0
src/assets/defultThumUrl.svg


+ 17 - 5
src/view/fileManager/qiniuTransfer.vue

@@ -78,7 +78,11 @@
           <el-card shadow="hover">
             <div class="video-main">
               <ul class="list">
+                <li v-if="files.length == 0" class="list-none">
+                  <el-empty :image-size="100" description="暂无文件" />
+                </li>
                 <li
+                  v-else
                   v-for="(file, index) in files"
                   :key="index"
                   :class="{ active: file.active }"
@@ -119,7 +123,7 @@
                         <el-dropdown-item
                           v-if="file.isFile == false"
                           :command="beforeHandleCommand('open', file)"
-                          ><el-icon><Open /></el-icon>打开</el-dropdown-item
+                          ><el-icon><Position /></el-icon>打开</el-dropdown-item
                         >
                         <el-dropdown-item
                           v-if="file.isFile"
@@ -171,7 +175,7 @@
       <el-form
         ref="elForm2"
         :model="uploadForm"
-        size="medium"
+        size="default"
         label-width="100px"
       >
         <el-form-item label="上传目录" prop="way">
@@ -402,7 +406,7 @@ import { ElMessage, ElMessageBox } from "element-plus";
 import { ArrowRight } from "@element-plus/icons-vue";
 // import { number } from "echarts";
 import * as qiniu from "qiniu-js";
-import { switchCase } from "@babel/types";
+// import { switchCase } from "@babel/types";
 
 //===================
 const fileFolderVisible = ref(false);
@@ -959,7 +963,7 @@ let breadcrumbList = ref([
   },
 ]); // 面包屑
 let files = ref([]); // 文件数据列表
-const defultThumUrl = ref("src/assets/defultThumUrl.png"); // 默认文件夹的样式图片
+const defultThumUrl = ref("src/assets/defultThumUrl.svg"); // 默认文件夹的样式图片
 
 function clickBreadcrumb(breadcrumb, index) {
   breadcrumbList.value = breadcrumbList.value.slice(0, index + 1);
@@ -1147,6 +1151,14 @@ initMaterialPage();
     }
   }
   .video-main {
+    .list-none {
+      box-sizing: border-box;
+      position: relative;
+      height: 300px;
+      width: 100%;
+      margin: 5px;
+      display: inline-block;
+    }
     .list-item {
       border: 1px solid rgb(241, 241, 241);
       border-radius: 5%;
@@ -1169,7 +1181,7 @@ initMaterialPage();
           display: inline-block;
           width: 80px;
           height: 80px;
-          background-image: url(../../assets/defultThumUrl.png);
+          background-image: url(../../assets/defultThumUrl.svg);
           background-size: 100% 100%;
         }
         .icon-thumb {

+ 238 - 29
src/view/rentComputer/rent_computer.vue

@@ -2,8 +2,8 @@
  * @Author: 倚楼听风雨 18408246387@163.com
  * @Date: 2022-11-16 17:16:17
  * @LastEditors: 倚楼听风雨 18408246387@163.com
- * @LastEditTime: 2023-03-14 16:32:48
- * @FilePath: \log-server-web\src\view\logComputer\list_computer_distinct.vue
+ * @LastEditTime: 2023-03-30 16:20:57
+ * @FilePath: \log-server-web\src\view\rentComputer\rent_computer.vue
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 -->
 <template>
@@ -42,6 +42,7 @@
               <el-option label="否" value="0" />
               <el-option label="是" value="1" />
               <el-option label="明日到期" value="2" />
+              <el-option label="一周内到期" value="3" />
             </el-select>
           </el-form-item>
           <el-form-item label="使用人">
@@ -105,20 +106,28 @@
           @click="deletesMenu()"
           >删除</el-button
         >
-        <!-- <el-popover v-model="deleteVisible" placement="top" width="160">
-          <p>确定要删除吗?</p>
-          <div style="text-align: right; margin-top: 8px;">
-            <el-button size="small" type="primary" link @click="deleteVisible = false">取消</el-button>
-            <el-button size="small" type="primary" @click="onDelete">确定</el-button>
-          </div>
-          <template #reference>
-            <el-button icon="delete" size="small" :disabled="!apis.length" style="margin-left: 10px;" @click="deleteVisible = true">删除</el-button>
-          </template>
-        </el-popover> -->
+        <el-button
+          icon="money"
+          size="small"
+          type="success"
+          :disabled="!apis.length"
+          style="margin-left: 10px"
+          @click="switchRenews()"
+          >批量续费</el-button
+        >
       </div>
     </div>
     <div class="row center">
       <el-tag size="large">电脑数量 : {{ computerNum }} </el-tag>
+      <el-tag
+        size="large"
+        type="danger"
+        hit
+        effect="dark"
+        style="margin-left: 20px"
+        v-if="tagExpire"
+        >有租机即将到期,请注意续费!!!</el-tag
+      >
     </div>
     <div class="gva-table-box">
       <!-- <el-scrollbar height="550px"> -->
@@ -205,24 +214,27 @@
         >
           <template #default="scope">
             <el-button
-              v-if="scope.row.is_expire == 2"
+              v-if="scope.row.is_expire == 3"
               size="small"
               type="warning"
               plain
               >即将到期</el-button
             >
             <el-button
-              v-if="scope.row.is_expire == 1"
+              v-else-if="scope.row.is_expire == 2"
               size="small"
-              type="info"
+              type="danger"
               plain
-              >到期未续</el-button
+              >明日到期</el-button
             >
             <el-button
-              v-if="scope.row.is_expire == 0"
+              v-else-if="scope.row.is_expire == 1"
               size="small"
-              type="success"
+              type="info"
               plain
+              >到期未续</el-button
+            >
+            <el-button v-else size="small" type="success" plain
               >在租期中</el-button
             >
           </template>
@@ -270,11 +282,37 @@
         />
         <el-table-column
           align="left"
-          label="备注"
+          label="最近一次修改日志"
           min-width="250"
-          prop="remark"
           show-overflow-tooltip
-        />
+        >
+          <template #default="scope">
+            <el-row>
+              <el-col :span="20">
+                <span
+                  style="
+                    display: block;
+                    max-width: 15em;
+                    overflow: hidden;
+                    white-space: nowrap;
+                    text-overflow: ellipsis;
+                  "
+                  >{{ scope.row.remark }}</span
+                >
+              </el-col>
+              <el-col :span="4">
+                <el-button
+                  size="small"
+                  type="warning"
+                  link
+                  icon="tickets"
+                  @click="switchLog(scope.row)"
+                  >more</el-button
+                >
+              </el-col>
+            </el-row>
+          </template>
+        </el-table-column>
         <el-table-column
           align="left"
           label="更新时间"
@@ -512,6 +550,15 @@
         </div>
       </template>
     </el-dialog>
+    <!--日志-->
+    <el-dialog v-model="visible_log" title="操作日志">
+      <el-table :data="logData">
+        <el-table-column property="create_time" label="操作时间" width="150" />
+        <el-table-column property="pc_num" label="租机编号" width="80" />
+        <el-table-column property="log" label="日志" />
+      </el-table>
+    </el-dialog>
+    <!--租机续费-->
     <el-dialog title="租机续费" v-model="visible_renew">
       <el-form :model="renewForm" size="default" label-width="100px">
         <el-row>
@@ -565,6 +612,51 @@
         </el-form-item>
       </el-form>
     </el-dialog>
+    <!-- 批量续费 -->
+    <el-dialog title="批量续费" v-model="visible_renews">
+      <p style="color: red; font-size: larger">严重警告:请勿随意操作!!!</p>
+      <span style="font-size: larger">续费天数:</span>
+      <el-input
+        v-model="renewsDay"
+        size="small"
+        style="width: 30%"
+        placeholder="天数"
+      ></el-input>
+      <el-button
+        type="primary"
+        style="margin-left: 20px"
+        size="small"
+        @click="calculateRenewEnd()"
+        >计算</el-button
+      >
+      <p style="font-size: larger">续费明细如下,请认真核对后再提交:</p>
+      <el-table size="small" height="400px" :data="renewDatas" border>
+        <el-table-column type="index" width="55" />
+        <el-table-column
+          align="left"
+          label="编号"
+          min-width="70"
+          prop="pc_num"
+        />
+        <el-table-column
+          align="left"
+          label="当前到期时间"
+          min-width="100"
+          prop="rent_end"
+        />
+        <el-table-column
+          align="left"
+          label="续费后到期时间"
+          min-width="100"
+          prop="rent_end_new"
+        />
+      </el-table>
+      <el-divider />
+      <el-button size="small" @click="visible_renews = false">取消</el-button>
+      <el-button type="primary" size="small" @click="renewByBatch()"
+        >提交</el-button
+      >
+    </el-dialog>
     <!--退租-->
     <el-dialog title="租机退租" v-model="visible_rentingOut">
       <el-form
@@ -747,15 +839,17 @@ import {
   deleteRentComputerById,
   deleteRentComputerByIds,
   renewRentComputer,
+  renewRentComputerByBatch,
   replaceNumRentComputer,
   rentingOutRentComputer,
   offShelfRentComputer,
+  queryRentComputerLogByPcNum,
 } from "@/api/rentComputer";
 import { getDirectorList } from "@/api/responsiblePerson";
 import { useUserStore } from "@/pinia/modules/user";
 import { toSQLLine } from "@/utils/stringFun";
 import { ref } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
+import { ElMessage, ElMessageBox, ElLoading } from "element-plus";
 import { formatDate } from "@/utils/format";
 import { downloadTemplate } from "@/api/excel";
 import dayjs from "dayjs";
@@ -798,9 +892,16 @@ const page = ref(1);
 const total = ref(0);
 const pageSize = ref(20);
 const tableData = ref([]);
+const renewDatas = ref([]);
+const logData = ref([]);
 const loading = ref(false);
-const searchInfo = ref({});
+const searchInfo = ref({
+  is_expire: -1,
+  is_off_shelf: -1,
+  director_name: "ALL",
+});
 const computerNum = ref("");
+const tagExpire = ref(false);
 const shopOptions = ref();
 const directorOptions = ref();
 const setMealOptions = ref();
@@ -808,8 +909,10 @@ const defaultTime = ref(new Date(2000, 1, 1, 12, 0, 0));
 const path = ref(import.meta.env.VITE_BASE_API);
 const userStore = useUserStore();
 const visible_renew = ref(false);
+const visible_renews = ref(false);
 const visible_rentingOut = ref(false);
 const visible_replaceNum = ref(false);
+const visible_log = ref(false);
 const rent_end = ref("");
 const renewForm = ref({
   pc_num: "",
@@ -817,6 +920,7 @@ const renewForm = ref({
   day: 0,
   rent_renew: dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss"),
 });
+const renewsDay = ref(0);
 const rentingOutForm = ref({
   pc_num: "",
   pc_id: 0,
@@ -869,6 +973,29 @@ function calculateRenewDay(scope) {
     )
   );
 }
+// 查询日志
+async function switchLog(rowData) {
+  const loadingLog = ElLoading.service({
+    lock: true,
+    text: "查询日志中...",
+    background: "rgba(0, 0, 0, 0.7)",
+  });
+  let logForm = {
+    pc_num: rowData.pc_num,
+    shop_id: Number(rowData.shop_id),
+    // set_meal_id: Number(rowData.set_meal_id),
+  };
+  // console.log(logForm);
+  const data = await queryRentComputerLogByPcNum(logForm);
+  if (data.code == 0) {
+    visible_log.value = true;
+    loadingLog.close();
+    // ElMessage.success(data.msg);
+    logData.value = data.data.list;
+  } else {
+    ElMessage.error(data.msg);
+  }
+}
 // 拉起续费弹窗
 async function switchRenew(rowData) {
   // console.log(rowData);
@@ -902,6 +1029,63 @@ async function renew(rowData) {
     ElMessage.error(data.msg);
   }
 }
+// 拉起批量续费弹窗
+async function switchRenews(rowData) {
+  renewDatas.value = [];
+  if (visible_renews.value == false) {
+    visible_renews.value = true;
+  }
+  calculateRenewEnd();
+}
+// 计算批量续费到期时间
+function calculateRenewEnd() {
+  renewDatas.value = [];
+  //
+  apis.value.map((item) => {
+    // console.log(item);
+    let temp = {
+      pc_id: item.id,
+      pc_num: item.pc_num,
+      rent_end: item.rent_end,
+      rent_end_new: dayjs(new Date(item.rent_end))
+        .add(renewsDay.value, "day")
+        .format("YYYY-MM-DD HH:mm:ss"),
+    };
+    renewDatas.value.push(temp);
+  });
+}
+// 批量续费
+const renewByBatch = async () => {
+  const loadingByBatch = ElLoading.service({
+    lock: true,
+    text: "批量续费中,请勿操作界面...",
+    background: "rgba(0, 0, 0, 0.7)",
+  });
+  let rentMessage = [];
+  renewDatas.value.map((item) => {
+    let temp = {
+      pc_num: item.pc_num,
+      pc_id: item.pc_id,
+      rent_renew: item.rent_end_new,
+      day: Number(renewsDay.value),
+    };
+    rentMessage.push(temp);
+  });
+  let xxxx = {
+    rent_message: rentMessage,
+  };
+
+  const data = await renewRentComputerByBatch(xxxx);
+  if (data.code == 0) {
+    visible_renews.value = false;
+    loadingByBatch.close();
+    ElMessage.success(data.msg);
+    getTableData();
+  } else {
+    ElMessage.error(data.msg);
+  }
+};
+
 // 拉起退租弹窗
 async function switchRentingOut(rowData) {
   cardList.value = [];
@@ -1072,7 +1256,6 @@ const onSubmit = () => {
 
   getTableData();
 };
-
 // 查询
 const getTableData = async () => {
   loading.value = true;
@@ -1086,12 +1269,37 @@ const getTableData = async () => {
     total.value = table.data.total;
     page.value = table.data.page;
     pageSize.value = table.data.pageSize;
-    // getSpanArr(table.data.list);
     getComputerNum();
     getSelectList();
   }
+  await getIsExpireData();
   loading.value = false;
 };
+// 查询是否有到期
+const getIsExpireData = async () => {
+  loading.value = true;
+  tagExpire.value = false;
+  const table = await getRentComputerList({
+    page: 1,
+    pageSize: 999,
+    ...searchInfo.value,
+  });
+  // console.log(table.data.list)
+  if (table.code === 0 && table.data.list != null) {
+    for (const item of table.data.list) {
+      if (item.is_expire >= 2) {
+        ElMessageBox.alert("有租机即将到期,请注意续费!!!", "警告", {
+          confirmButtonText: "好的",
+          type: "warning",
+          callback: (action) => {
+            tagExpire.value = true;
+          },
+        });
+        break;
+      }
+    }
+  }
+};
 
 //获取下拉框list
 const getSelectList = async () => {
@@ -1132,7 +1340,7 @@ const getSelectList = async () => {
   const directorRes = await getDirectorList();
   let directorList = [
     { value: "ALL", label: "所有机器" },
-    { value: "", label: "备用" },
+    // { value: "", label: "备用" },
   ];
   const data3 = directorRes.data.list;
   data3.forEach((e) => {
@@ -1155,8 +1363,8 @@ const linkTd = async (row) => {
   let todesk_password = row.todesk_password;
   todesk_id = todesk_id.replace(/\s*/g, "");
   todesk_password = todesk_password.replace(/\s*/g, "");
-  console.log(todesk_id);
-  console.log(todesk_password);
+  // console.log(todesk_id);
+  // console.log(todesk_password);
   if (todesk_id == "" || todesk_password == "") {
     ElMessage({
       type: "error",
@@ -1302,6 +1510,7 @@ const deletesMenu = async () => {
       });
     });
 };
+
 // 删除菜单
 const deleteMenu = async (id) => {
   ElMessageBox.confirm("确定删除?", "提示", {
@@ -1310,7 +1519,7 @@ const deleteMenu = async (id) => {
     type: "warning",
   })
     .then(async () => {
-      console.log(id);
+      // console.log(id);
 
       const res = await deleteRentComputerById({ id });
       if (res.code === 0) {

+ 168 - 173
src/view/rentComputer/rent_computer_ledger.vue

@@ -1,11 +1,3 @@
-<!--
- * @Author: 倚楼听风雨 18408246387@163.com
- * @Date: 2022-11-16 17:16:17
- * @LastEditors: 倚楼听风雨 18408246387@163.com
- * @LastEditTime: 2023-02-20 15:47:22
- * @FilePath: \log-server-web\src\view\logComputer\list_computer_distinct.vue
- * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
--->
 <template>
   <div>
     <div class="gva-search-box">
@@ -79,7 +71,7 @@
           </el-form-item>
         </el-form>
       </div>
-      <!-- <div class="gva-btn-list">
+      <div class="gva-btn-list">
         <el-button
           icon="delete"
           size="small"
@@ -89,7 +81,7 @@
           @click="deletesMenu()"
           >删除</el-button
         >
-      </div> -->
+      </div>
     </div>
     <div class="row center">
       <el-tag size="large">电脑数量 : {{ computerNum }} </el-tag>
@@ -196,7 +188,7 @@
           min-width="100"
           prop="rent_price_used_then"
         />
-        <!-- <el-table-column
+        <el-table-column
           align="center"
           label="是否到期"
           min-width="100"
@@ -204,35 +196,64 @@
         >
           <template #default="scope">
             <el-button
-              v-if="scope.row.is_expire == 2"
+              v-if="scope.row.is_expire == 3"
               size="small"
               type="warning"
               plain
               >即将到期</el-button
             >
             <el-button
-              v-if="scope.row.is_expire == 1"
+              v-else-if="scope.row.is_expire == 2"
               size="small"
-              type="info"
+              type="danger"
               plain
-              >到期未续</el-button
+              >明日到期</el-button
             >
             <el-button
-              v-if="scope.row.is_expire == 0"
+              v-else-if="scope.row.is_expire == 1"
               size="small"
-              type="success"
+              type="info"
               plain
+              >到期未续</el-button
+            >
+            <el-button v-else size="small" type="success" plain
               >在租期中</el-button
             >
           </template>
-        </el-table-column> -->
+        </el-table-column>
         <el-table-column
           align="left"
-          label="备注"
-          min-width="150"
-          prop="remark"
+          label="最近一次修改日志"
+          min-width="250"
           show-overflow-tooltip
-        />
+        >
+          <template #default="scope">
+            <el-row>
+              <el-col :span="20">
+                <span
+                  style="
+                    display: block;
+                    max-width: 15em;
+                    overflow: hidden;
+                    white-space: nowrap;
+                    text-overflow: ellipsis;
+                  "
+                  >{{ scope.row.remark }}</span
+                >
+              </el-col>
+              <el-col :span="4">
+                <el-button
+                  size="small"
+                  type="warning"
+                  link
+                  icon="tickets"
+                  @click="switchLog(scope.row)"
+                  >more</el-button
+                >
+              </el-col>
+            </el-row>
+          </template>
+        </el-table-column>
         <el-table-column
           align="left"
           label="更新时间"
@@ -245,14 +266,6 @@
               size="small"
               type="primary"
               link
-              icon="edit"
-              @click="editMenu(scope.row.id)"
-              >编辑</el-button
-            >
-            <el-button
-              size="small"
-              type="primary"
-              link
               icon="delete"
               @click="deleteMenu(scope.row.id)"
               >删除</el-button
@@ -273,6 +286,15 @@
         />
       </div>
     </div>
+
+    <!--日志-->
+    <el-dialog v-model="visible_log" title="操作日志">
+      <el-table :data="logData">
+        <el-table-column property="create_time" label="操作时间" width="150" />
+        <el-table-column property="pc_num" label="租机编号" width="80" />
+        <el-table-column property="log" label="日志" />
+      </el-table>
+    </el-dialog>
   </div>
 </template>
 
@@ -288,19 +310,14 @@ import {
   getRentComputerLedgerNum,
   listRentComputerShopList,
   listRentSetMealList,
-  getRentComputerById,
   exportRentLedgerListExcel,
-  editRentComputer,
-  deleteRentComputerById,
-  deleteRentComputerByIds,
+  deleteRentComputerLedgerById,
+  deleteRentComputerLedgerByIds,
+  queryRentComputerLogByPcNum,
 } from "@/api/rentComputer";
-// import { useUserStore } from "@/pinia/modules/user";
 import { toSQLLine } from "@/utils/stringFun";
 import { ref } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import { formatDate } from "@/utils/format";
-// import { downloadTemplate } from "@/api/excel";
-// import dayjs from "dayjs";
+import { ElMessage, ElMessageBox, ElLoading } from "element-plus";
 
 const apis = ref([]);
 const form = ref({
@@ -320,33 +337,17 @@ const form = ref({
   // is_expire: -1,
   is_off_shelf: -1,
 });
-const rules = ref({
-  pc_num: [{ required: true, message: "请输入电脑编号", trigger: "blur" }],
-  pc_name: [{ required: true, message: "请输入电脑名称", trigger: "blur" }],
-  shop_id: [{ required: true, message: "请选择供应商", trigger: "blur" }],
-  set_meal_id: [{ required: true, message: "请选择套餐", trigger: "blur" }],
-  rent_start: [{ required: true, message: "请选择起租日期", trigger: "blur" }],
-  rent_duration: [
-    { required: true, message: "请输入租赁天数", trigger: "blur" },
-  ],
-  // is_expire: [{ required: true, message: "请选择是否到期", trigger: "blur" }],
-  // is_off_shelf: [
-  //   { required: true, message: "请选择是否下架", trigger: "blur" },
-  // ],
-});
 
 const page = ref(1);
 const total = ref(0);
 const pageSize = ref(20);
 const tableData = ref([]);
-let spanArr = [];
 const searchInfo = ref({});
 const computerNum = ref("");
 const shopOptions = ref();
 const setMealOptions = ref();
-// const defaultTime = ref(new Date(2000, 1, 1, 12, 0, 0));
-// const path = ref(import.meta.env.VITE_BASE_API);
-// const userStore = useUserStore();
+const visible_log = ref(false);
+const logData = ref([]);
 
 const shortcuts = [
   {
@@ -366,34 +367,6 @@ const disabledDate = (time) => {
   return time.getTime() > Date.now();
 };
 
-// 计算租机到期时间
-const calculateRentDuration = async (scope) => {
-  scope.rent_end = new Date(
-    Date.parse(scope.rent_start) +
-      1 * 24 * 60 * 60 * 1000 * parseInt(scope.rent_duration)
-  );
-};
-
-// const getSpanArr = (data) => {
-//   spanArr = [];
-//   var pos = 0;
-//   for (var i = 0; i < data.length; i++) {
-//     if (i === 0) {
-//       spanArr.push(1);
-//       pos = 0;
-//     } else {
-//       if (data[i].pc_code === data[i - 1].pc_code) {
-//         spanArr[pos] += 1;
-//         spanArr.push(0);
-//       } else {
-//         spanArr.push(1);
-//         pos = i;
-//       }
-//     }
-//   }
-//   // console.log(spanArr);
-// };
-
 // 分页
 const handleSizeChange = (val) => {
   pageSize.value = val;
@@ -455,7 +428,29 @@ const onSubmit = () => {
 
   getTableData();
 };
-
+// 查询日志
+async function switchLog(rowData) {
+  const loadingLog = ElLoading.service({
+    lock: true,
+    text: "查询日志中...",
+    background: "rgba(0, 0, 0, 0.7)",
+  });
+  let logForm = {
+    pc_num: rowData.pc_num,
+    shop_id: Number(rowData.shop_id),
+    // set_meal_id: Number(rowData.set_meal_id),
+  };
+  // console.log(logForm);
+  const data = await queryRentComputerLogByPcNum(logForm);
+  if (data.code == 0) {
+    visible_log.value = true;
+    loadingLog.close();
+    // ElMessage.success(data.msg);
+    logData.value = data.data.list;
+  } else {
+    ElMessage.error(data.msg);
+  }
+}
 // 查询
 const getTableData = async () => {
   const table = await getRentComputerLedgerList({
@@ -540,93 +535,93 @@ const initForm = () => {
     parent_id: "",
   };
 };
-const menuOption = ref([
-  {
-    id: "0",
-    title: "根编号",
-  },
-]);
-const setOptions = () => {
-  menuOption.value = [
-    {
-      id: "0",
-      title: "根目录",
-    },
-  ];
-  setMenuOptions(tableData.value, menuOption.value, false);
-};
-const setMenuOptions = (menuData, optionsData, disabled) => {
-  menuData &&
-    menuData.forEach((item) => {
-      if (item.children && item.children.length) {
-        const option = {
-          ID: String(item.id),
-          disabled: disabled || item.id === form.value.id,
-          children: [],
-        };
-        setMenuOptions(
-          item.children,
-          option.children,
-          disabled || item.id === form.value.id
-        );
-        optionsData.push(option);
-      } else {
-        const option = {
-          ID: String(item.id),
-          disabled: disabled || item.id === form.value.id,
-        };
-        optionsData.push(option);
-      }
-    });
-};
+// const menuOption = ref([
+//   {
+//     id: "0",
+//     title: "根编号",
+//   },
+// ]);
+// const setOptions = () => {
+//   menuOption.value = [
+//     {
+//       id: "0",
+//       title: "根目录",
+//     },
+//   ];
+//   setMenuOptions(tableData.value, menuOption.value, false);
+// };
+// const setMenuOptions = (menuData, optionsData, disabled) => {
+//   menuData &&
+//     menuData.forEach((item) => {
+//       if (item.children && item.children.length) {
+//         const option = {
+//           ID: String(item.id),
+//           disabled: disabled || item.id === form.value.id,
+//           children: [],
+//         };
+//         setMenuOptions(
+//           item.children,
+//           option.children,
+//           disabled || item.id === form.value.id
+//         );
+//         optionsData.push(option);
+//       } else {
+//         const option = {
+//           ID: String(item.id),
+//           disabled: disabled || item.id === form.value.id,
+//         };
+//         optionsData.push(option);
+//       }
+//     });
+// };
 
-const loadExcel = (res) => {
-  if (res.code === 0) {
-    ElMessage({
-      type: "success",
-      message: res.msg,
-    });
-  } else {
-    ElMessage({
-      type: "error",
-      message: res.msg,
-      showClose: true,
-    });
-  }
-  getTableData();
-};
+// const loadExcel = (res) => {
+//   if (res.code === 0) {
+//     ElMessage({
+//       type: "success",
+//       message: res.msg,
+//     });
+//   } else {
+//     ElMessage({
+//       type: "error",
+//       message: res.msg,
+//       showClose: true,
+//     });
+//   }
+//   getTableData();
+// };
 
-// 添加菜单方法,id为 0则为添加根菜单
-const isEdit = ref(false);
-const dialogTitle = ref("新增租机");
-const addMenu = async (id) => {
-  dialogTitle.value = "新增租机";
-  form.value.parent_id = String(id);
-  isEdit.value = false;
-  setOptions();
-  dialogFormVisible.value = true;
-  getSelectList();
-};
-// 修改菜单方法
-const editMenu = async (id) => {
-  dialogTitle.value = "编辑租机";
-  const res = await getRentComputerById({ id });
-  form.value = res.data;
-  if (form.value.is_off_shelf == 1) {
-    form.value.is_off_shelf = true;
-  } else {
-    form.value.is_off_shelf = false;
-  }
-  isEdit.value = true;
-  setOptions();
-  dialogFormVisible.value = true;
-  getSelectList();
-};
+// // 添加菜单方法,id为 0则为添加根菜单
+// const isEdit = ref(false);
+// const dialogTitle = ref("新增租机");
+// const addMenu = async (id) => {
+//   dialogTitle.value = "新增租机";
+//   form.value.parent_id = String(id);
+//   isEdit.value = false;
+//   setOptions();
+//   dialogFormVisible.value = true;
+//   getSelectList();
+// };
+// // 修改菜单方法
+// const editMenu = async (id) => {
+//   dialogTitle.value = "编辑租机";
+//   const res = await getRentComputerById({ id });
+//   form.value = res.data;
+//   if (form.value.is_off_shelf == 1) {
+//     form.value.is_off_shelf = true;
+//   } else {
+//     form.value.is_off_shelf = false;
+//   }
+//   isEdit.value = true;
+//   setOptions();
+//   dialogFormVisible.value = true;
+//   getSelectList();
+// };
 
-const closeDialog = () => {
-  initForm();
-  dialogFormVisible.value = false;
-};
+// const closeDialog = () => {
+//   initForm();
+//   dialogFormVisible.value = false;
+// };
 // 批量删除菜单
 const deletesMenu = async () => {
   ElMessageBox.confirm("确定批量删除所选吗?", "提示", {
@@ -637,7 +632,7 @@ const deletesMenu = async () => {
     .then(async () => {
       const ids = apis.value.map((item) => item.id);
       // console.log(ids);
-      const res = await deleteRentComputerByIds({ ids });
+      const res = await deleteRentComputerLedgerByIds({ ids });
       if (res.code === 0) {
         ElMessage({
           type: "success",
@@ -661,9 +656,9 @@ const deleteMenu = async (id) => {
     type: "warning",
   })
     .then(async () => {
-      console.log(id);
+      // console.log(id);
 
-      const res = await deleteRentComputerById({ id });
+      const res = await deleteRentComputerLedgerById({ id });
       if (res.code === 0) {
         ElMessage({
           type: "success",

+ 492 - 0
src/view/rentComputer/rent_computer_only.vue

@@ -0,0 +1,492 @@
+<template>
+  <div>
+    <div class="gva-search-box">
+      <div class="gva-btn-list">
+        <el-form ref="searchForm" :inline="true" :model="searchInfo">
+          <el-form-item label="电脑编号">
+            <el-input
+              v-model="searchInfo.pc_num"
+              placeholder="编号"
+              size="small"
+            />
+          </el-form-item>
+          <el-form-item label="供应商">
+            <el-select v-model="searchInfo.shop_id" size="small">
+              <el-option
+                v-for="item in shopOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="套餐">
+            <el-select v-model="searchInfo.set_meal_id" size="small"
+              ><el-option
+                v-for="item in setMealOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+            /></el-select>
+          </el-form-item>
+          <el-form-item label="是否到期">
+            <el-select v-model="searchInfo.is_expire" size="small">
+              <el-option label="否" value="0" />
+              <el-option label="是" value="1" />
+              <el-option label="明日到期" value="2" />
+              <el-option label="一周内到期" value="3" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="使用人">
+            <el-select v-model="searchInfo.director_name" size="small">
+              <el-option
+                v-for="item in directorOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="是否下架">
+            <el-select v-model="searchInfo.is_off_shelf" size="small">
+              <el-option label="否" value="0" />
+              <el-option label="是" value="1" />
+            </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
+            >
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+    <div class="row center">
+      <el-tag size="large">电脑数量 : {{ computerNum }} </el-tag>
+    </div>
+    <div class="gva-table-box">
+      <!-- <el-scrollbar height="550px"> -->
+      <el-table
+        height="500px"
+        :data="tableData"
+        @sort-change="sortChange"
+        @selection-change="handleSelectionChange"
+        border
+        v-loading="loading"
+      >
+        <el-table-column type="index" width="55" />
+        <el-table-column
+          align="left"
+          label="编号"
+          min-width="80"
+          prop="pc_num"
+        />
+        <el-table-column
+          align="left"
+          label="名称"
+          min-width="80"
+          prop="pc_name"
+        />
+        <el-table-column
+          align="left"
+          label="供应商"
+          min-width="70"
+          prop="shop_name"
+        />
+        <!-- <el-table-column
+            align="left"
+            label="套餐"
+            min-width="100"
+            prop="set_meal_name"
+          /> -->
+        <el-table-column
+          align="center"
+          label="套餐"
+          min-width="150"
+          prop="set_meal_name"
+        >
+          <template #default="scope">
+            <span v-if="scope.row.price_type == 0">{{
+              scope.row.set_meal_name + "-天卡(" + scope.row.rent_price + "元)"
+            }}</span>
+            <span v-else-if="scope.row.price_type == 1">{{
+              scope.row.set_meal_name + "-周卡(" + scope.row.rent_price + "元)"
+            }}</span>
+            <span v-else>{{
+              scope.row.set_meal_name + "-月卡(" + scope.row.rent_price + "元)"
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="left"
+          label="使用人"
+          min-width="80"
+          prop="director_name"
+        />
+        <el-table-column
+          align="center"
+          label="是否到期"
+          min-width="100"
+          prop="is_expire"
+        >
+          <template #default="scope">
+            <el-button
+              v-if="scope.row.is_expire == 3"
+              size="small"
+              type="warning"
+              plain
+              >即将到期</el-button
+            >
+            <el-button
+              v-else-if="scope.row.is_expire == 2"
+              size="small"
+              type="danger"
+              plain
+              >明日到期</el-button
+            >
+            <el-button
+              v-else-if="scope.row.is_expire == 1"
+              size="small"
+              type="info"
+              plain
+              >到期未续</el-button
+            >
+            <el-button v-else size="small" type="success" plain
+              >在租期中</el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="是否下架"
+          min-width="100"
+          prop="is_off_shelf"
+        >
+          <template #default="scope">
+            <el-button
+              v-if="scope.row.is_off_shelf == 1"
+              size="small"
+              type="warning"
+              plain
+              >是</el-button
+            >
+            <el-button v-else size="small" type="success" plain>否</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="left"
+          label="TD号"
+          min-width="100"
+          prop="todesk_id"
+        />
+        <el-table-column
+          align="left"
+          label="TD密码"
+          min-width="100"
+          prop="todesk_password"
+        />
+        <el-table-column
+          align="left"
+          label="向日葵号"
+          min-width="100"
+          prop="sunflower_id"
+        />
+        <el-table-column
+          align="left"
+          label="向日葵密码"
+          min-width="100"
+          prop="sunflower_password"
+        />
+        <el-table-column
+          align="left"
+          label="最近一次修改日志"
+          min-width="250"
+          show-overflow-tooltip
+        >
+          <template #default="scope">
+            <el-row>
+              <el-col :span="20">
+                <span
+                  style="
+                    display: block;
+                    max-width: 15em;
+                    overflow: hidden;
+                    white-space: nowrap;
+                    text-overflow: ellipsis;
+                  "
+                  >{{ scope.row.remark }}</span
+                >
+              </el-col>
+              <el-col :span="4">
+                <el-button
+                  size="small"
+                  type="warning"
+                  link
+                  icon="tickets"
+                  @click="switchLog(scope.row)"
+                  >more</el-button
+                >
+              </el-col>
+            </el-row>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="left"
+          label="更新时间"
+          min-width="150"
+          prop="update_time"
+        />
+        <el-table-column align="left" fixed="right" label="操作" width="100">
+          <template #default="scope">
+            <el-button
+              size="small"
+              type="primary"
+              link
+              icon="link"
+              @click="linkTd(scope.row)"
+              >TD连接</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- </el-scrollbar> -->
+      <div class="gva-pagination">
+        <el-pagination
+          :current-page="page"
+          :page-size="pageSize"
+          :page-sizes="[10, 20, 30, 50, 100]"
+          :total="total"
+          layout="total, sizes, prev, pager, next, jumper"
+          @current-change="handleCurrentChange"
+          @size-change="handleSizeChange"
+        />
+      </div>
+    </div>
+
+    <!--日志-->
+    <el-dialog v-model="visible_log" title="操作日志">
+      <el-table :data="logData">
+        <el-table-column property="create_time" label="操作时间" width="150" />
+        <el-table-column property="pc_num" label="租机编号" width="80" />
+        <el-table-column property="log" label="日志" />
+      </el-table>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "computer",
+};
+</script>
+
+<script setup>
+import {
+  getRentComputerList,
+  getRentComputerNum,
+  listRentComputerShopList,
+  listRentSetMealList,
+  queryRentComputerLogByPcNum,
+} from "@/api/rentComputer";
+import { getDirectorList } from "@/api/responsiblePerson";
+import { useUserStore } from "@/pinia/modules/user";
+import { toSQLLine } from "@/utils/stringFun";
+import { ref } from "vue";
+import { ElMessage, ElLoading } from "element-plus";
+
+const visible_log = ref(false);
+const logData = ref([]);
+const page = ref(1);
+const total = ref(0);
+const pageSize = ref(20);
+const tableData = ref([]);
+const loading = ref(false);
+const searchInfo = ref({});
+const computerNum = ref("");
+const shopOptions = ref();
+const directorOptions = ref();
+const setMealOptions = ref();
+// 查询日志
+async function switchLog(rowData) {
+  const loadingLog = ElLoading.service({
+    lock: true,
+    text: "查询日志中...",
+    background: "rgba(0, 0, 0, 0.7)",
+  });
+  let logForm = {
+    pc_num: rowData.pc_num,
+    shop_id: Number(rowData.shop_id),
+    // set_meal_id: Number(rowData.set_meal_id),
+  };
+  // console.log(logForm);
+  const data = await queryRentComputerLogByPcNum(logForm);
+  if (data.code == 0) {
+    visible_log.value = true;
+    loadingLog.close();
+    // ElMessage.success(data.msg);
+    logData.value = data.data.list;
+  } else {
+    ElMessage.error(data.msg);
+  }
+}
+
+// 分页
+const handleSizeChange = (val) => {
+  pageSize.value = val;
+  getTableData();
+};
+const onReset = () => {
+  searchInfo.value = {};
+};
+const handleCurrentChange = (val) => {
+  page.value = val;
+  getTableData();
+};
+
+// 排序
+const sortChange = ({ prop, order }) => {
+  if (prop) {
+    if (prop === "id") {
+      prop = "id";
+    }
+    searchInfo.value.orderKey = toSQLLine(prop);
+    searchInfo.value.desc = order === "descending";
+  }
+  getTableData();
+};
+
+// 搜索
+const onSubmit = () => {
+  page.value = 1;
+  pageSize.value = 20;
+
+  if (typeof searchInfo.value.set_meal_id != "undefined") {
+    searchInfo.value.set_meal_id = Number(searchInfo.value.set_meal_id);
+  }
+  if (typeof searchInfo.value.is_expire != "undefined") {
+    searchInfo.value.is_expire = Number(searchInfo.value.is_expire);
+  }
+  if (typeof searchInfo.value.is_off_shelf != "undefined") {
+    searchInfo.value.is_off_shelf = Number(searchInfo.value.is_off_shelf);
+  }
+
+  // console.log(searchInfo);
+
+  getTableData();
+};
+
+// 查询
+const getTableData = async () => {
+  loading.value = true;
+  const table = await getRentComputerList({
+    page: page.value,
+    pageSize: pageSize.value,
+    ...searchInfo.value,
+  });
+  if (table.code === 0) {
+    tableData.value = table.data.list;
+    total.value = table.data.total;
+    page.value = table.data.page;
+    pageSize.value = table.data.pageSize;
+    // getSpanArr(table.data.list);
+    getComputerNum();
+    getSelectList();
+  }
+  loading.value = false;
+};
+
+//获取下拉框list
+const getSelectList = async () => {
+  //listRentComputerShopList
+  const rentComputerShop = await listRentComputerShopList({
+    page: 1,
+    pageSize: 999,
+  });
+  let rentComputerShopList = [];
+  const data = rentComputerShop.data.list;
+  data.forEach((e) => {
+    rentComputerShopList.push({ value: e.id, label: e.name });
+  });
+  shopOptions.value = rentComputerShopList;
+  //listRentSetMealList
+  const setMealShop = await listRentSetMealList({
+    page: 1,
+    pageSize: 999,
+  });
+  let setMealList = [];
+  const data2 = setMealShop.data.list;
+  data2.forEach((e) => {
+    var priceStr = "";
+    if (e.price_type == 0) {
+      priceStr = "天卡(" + e.rent_price + "元)";
+    } else if (e.price_type == 1) {
+      priceStr = "周卡(" + e.rent_price + "元)";
+    } else {
+      priceStr = "月卡(" + e.rent_price + "元)";
+    }
+    setMealList.push({
+      value: e.id,
+      label: e.shop_name + "-" + e.name + "-" + priceStr,
+    });
+  });
+  setMealOptions.value = setMealList;
+  //游戏负责人列表===============================
+  const directorRes = await getDirectorList();
+  let directorList = [
+    { value: "ALL", label: "所有机器" },
+    // { value: "", label: "备用" },
+  ];
+  const data3 = directorRes.data.list;
+  data3.forEach((e) => {
+    directorList.push({ value: e.name, label: e.name });
+  });
+  directorOptions.value = directorList;
+};
+
+// 查询
+const getComputerNum = async () => {
+  const table = await getRentComputerNum({ ...searchInfo.value });
+  if (table.code === 0) {
+    // console.log(table.data);
+    computerNum.value = table.data;
+  }
+};
+//拉起TD连接
+const linkTd = async (row) => {
+  let todesk_id = row.todesk_id;
+  let todesk_password = row.todesk_password;
+  todesk_id = todesk_id.replace(/\s*/g, "");
+  todesk_password = todesk_password.replace(/\s*/g, "");
+  // console.log(todesk_id);
+  // console.log(todesk_password);
+  if (todesk_id == "" || todesk_password == "") {
+    ElMessage({
+      type: "error",
+      message: "todesk账号密码不完整!",
+    });
+  } else {
+    window.location.href =
+      "ToDesk://connect&" + todesk_id + "&" + todesk_password;
+  }
+};
+getTableData();
+</script>
+
+<style scoped lang="scss">
+.button-box {
+  padding: 10px 20px;
+  .el-button {
+    float: right;
+  }
+}
+.warning {
+  color: #dc143c;
+}
+</style>