倚楼听风雨 пре 3 година
родитељ
комит
ee93236c17

+ 70 - 25
cool-admin-midway-master/src/app/modules/shuyou/controller/admin/rent_computer.ts

@@ -1,9 +1,9 @@
 /*
  * @Author: YKH
  * @Date: 2021-12-08 10:26:27
- * @LastEditTime: 2022-09-29 15:24:19
+ * @LastEditTime: 2022-10-03 20:47:49
  * @Description:
- * @FilePath: \cool-admin\cool-admin-midway-master\src\app\modules\shuyou\controller\admin\rent_computer.ts
+ * @FilePath: \cool-admin-3.x\cool-admin-midway-master\src\app\modules\shuyou\controller\admin\rent_computer.ts
  */
 import { ALL, Body, Inject, Post, Provide } from '@midwayjs/decorator';
 import { CoolController, BaseController } from 'midwayjs-cool-core';
@@ -13,6 +13,10 @@ import { ILogger } from '@midwayjs/logger';
 // import xlsx from 'node-xlsx';
 // import fs from 'fs';
 
+import xlsx = require('node-xlsx');
+// import fs = require('fs');
+var path = require('path');
+
 /**
  * 租机
  */
@@ -116,36 +120,77 @@ export class ShuyouRentComputerController extends BaseController {
   async batchImport(@Body(ALL) queryObject) {
     console.log(queryObject);
 
-    // const { fileaddress } = queryObject;
+    const { fileaddress, rent_person_id, shop_id } = queryObject;
     // console.log(fileaddress._value);
     // const filename = fileaddress._value.split('uploads')[1];
     // console.log(filename);
 
-    // const filename = fileaddress.split('uploads')[1];
+    const filename = fileaddress.split('uploads')[1];
     // 解析文件
     // const data = xlsx.parse(filename);
     // console.log(data);
 
-    // 以 buffer 形式导入
-    // const workSheetsFromBuffer = xlsx.parse(fs.readFileSync(filename));
-    // console.log(JSON.stringify(workSheetsFromBuffer, null, 2));
-
-    // 以文件形式导入
-    // const workSheetsFromFile = xlsx.parse(
-    //   'F:/project/cool-admin-3.x/cool-admin-midway-master/public/uploads/20220928/187a94f0-3f00-11ed-b595-3fe20740ebd9.xls'
-    // );
-    // console.log(JSON.stringify(workSheetsFromFile, null, 2));
-
-    // try {
-    //   // 解析文件
-    //   const data = xlsx.parse(file.filepath);
-    //   console.log(data);
-
-    //   // xlsx包使用方式
-    //   //  const data = XLSX.readFile(file.filepath, {});
-    //   //  const json = XLSX.utils.sheet_to_json(data.Sheets['Sheet1']);
-    // } finally {
-    //   fs.unlinkSync(file.filepath);
-    // }
+    // 读取xlsx,此处可以按照需求更改自己要读的表格
+    var abcpath = path.join(
+      __dirname,
+      '../../../../../../public/uploads/' + filename
+    );
+    const sheets = xlsx.parse(abcpath);
+    // console.log(sheets);
+    let info_text;
+    await ykhForeach(sheets, async (element, index) => {
+      const name = element.name;
+      const sheetData = element.data;
+      await ykhForeach(sheetData, async (item, order) => {
+        if (order == 0) {
+          return;
+        }
+        console.log(item[0]);
+        const set_meal = name + item[1];
+        // pc_num,pc_name,rent_person_id,shop_id,set_meal,rent_start,rent_duration,rent_end,price_type,rent_price,rent_price_day,pay_method,is_expire
+        info_text =
+          `('` +
+          item[0] +
+          `',` +
+          `'` +
+          item[0] +
+          `',` +
+          `'` +
+          rent_person_id +
+          `',` +
+          `'` +
+          shop_id +
+          `',` +
+          `'` +
+          set_meal +
+          `',` +
+          `'` +
+          item[2] +
+          `',` +
+          `'` +
+          item[5] +
+          `',` +
+          `'` +
+          item[3] +
+          `',` +
+          `'` +
+          item[0] +
+          `')`;
+      });
+    });
   }
 }
+// foreach加上async/await
+const ykhForeach = async (arr, callback) => {
+  const length = arr.length;
+  const O = Object(arr);
+  let k = 0;
+  while (k < length) {
+    if (k in O) {
+      // console.log('doing foreach...');
+      const kValue = O[k];
+      await callback(kValue, k, O);
+    }
+    k++;
+  }
+};

+ 95 - 77
cool-admin-midway-master/src/app/modules/shuyou/service/game_target_tencent.ts

@@ -14,7 +14,6 @@ import { ShuyouUtilsService } from './utils';
  */
 @Provide()
 export class ShuyouGameTargetTencentService extends BaseService {
-
   @InjectEntityModel(ShuyouGameTargetEntity)
   ShuyouGameTargetEntity: Repository<ShuyouGameTargetEntity>;
 
@@ -31,16 +30,16 @@ export class ShuyouGameTargetTencentService extends BaseService {
   shuyouUtilsService: ShuyouUtilsService;
 
   /**
-  * 重载修改接口
-  */
+   * 重载修改接口
+   */
   async update(param) {
     const exists = await this.ShuyouGameTargetEntity.findOne({
       id: param.id,
     });
     let content = '';
-    let dingContent = "";
+    let dingContent = '';
     let dingPhone = [];
-    let directorName = ''
+    let directorName = '';
     const game_director = await this.ShuyouGameDirectorEntity.findOne({
       id: param.directorId,
     });
@@ -51,29 +50,29 @@ export class ShuyouGameTargetTencentService extends BaseService {
       directorName = game_director.name;
       dingPhone.push(game_director.phone);
     }
-    param.createTime = new Date()
-    param.updateTime = new Date()
+    param.createTime = new Date();
+    param.updateTime = new Date();
     if (!_.isEmpty(exists)) {
       if (exists.target_new_low >= param.target_new) {
-        param.target_new_low = param.target_new
+        param.target_new_low = param.target_new;
       } else {
-        param.target_new_low = exists.target_new_low
+        param.target_new_low = exists.target_new_low;
       }
       if (exists.target_pay_low >= param.target_pay) {
-        param.target_pay_low = param.target_pay
+        param.target_pay_low = param.target_pay;
       } else {
-        param.target_pay_low = exists.target_pay_low
+        param.target_pay_low = exists.target_pay_low;
       }
       if (exists.target_active_low >= param.target_active) {
-        param.target_active_low = param.target_active
+        param.target_active_low = param.target_active;
       } else {
-        param.target_active_low = exists.target_active_low
+        param.target_active_low = exists.target_active_low;
       }
       if (exists.target_new != param.target_new) {
-        content += '新增目标改为' + param.target_new
+        content += '新增目标改为' + param.target_new;
       }
       if (exists.target_pay != param.target_pay) {
-        content += '付费目标改为' + param.target_pay
+        content += '付费目标改为' + param.target_pay;
       }
       let addObj = {
         task_id: param.task_id,
@@ -85,30 +84,40 @@ export class ShuyouGameTargetTencentService extends BaseService {
         target_active: param.target_active,
         target_new_low: param.target_new_low,
         target_pay_low: param.target_pay_low,
-        target_active_low: param.target_active_low
-      }
-      const updateResult = await this.ShuyouGameTargetEntity
-        .createQueryBuilder()
-        .update()
-        .set(addObj)
-        .where('id = :id', {
-          id: param.id,
-        })
-        .execute();
+        target_active_low: param.target_active_low,
+      };
+      const updateResult =
+        await this.ShuyouGameTargetEntity.createQueryBuilder()
+          .update()
+          .set(addObj)
+          .where('id = :id', {
+            id: param.id,
+          })
+          .execute();
       if (updateResult.affected >= 1) {
+        // console.log('修改成功~');
         // throw new CoolCommException('修改成功~');
-        dingContent = "+ **" + directorName + " ↓↓↓**\n>##### " + param.task_name + ',' + content + "\n"
+        dingContent =
+          '+ **' +
+          directorName +
+          ' ↓↓↓**\n>##### ' +
+          param.task_name +
+          ',' +
+          content +
+          '\n';
         //微信机器人
-        await sendVx_Robot(directorName + ':' + param.task_name + ',' + content);
+        // await sendVx_Robot(
+        //   directorName + ':' + param.task_name + ',' + content
+        // );
         //钉钉机器人
-        await this.shuyouUtilsService.postRobot(dingContent, dingPhone)
+        await this.shuyouUtilsService.postRobot(dingContent, dingPhone);
         //企业微信机器人
-        await this.shuyouUtilsService.postRobotEnterpriseWeChat(dingContent)
-        await this.shuyouUtilsService.postRobotEnterpriseWeChat2(dingContent)
+        await this.shuyouUtilsService.postRobotEnterpriseWeChat(dingContent);
+        await this.shuyouUtilsService.postRobotEnterpriseWeChat2(dingContent);
         // console.log('修改成功~')
       } else {
         // throw new CoolCommException('修改成功~');
-        console.log('修改失败~')
+        console.log('修改失败~');
       }
     } else {
       throw new CoolCommException('未查询到数据,无法修改~');
@@ -120,7 +129,7 @@ export class ShuyouGameTargetTencentService extends BaseService {
   async updateTarget(task_id: string, new_date: Date) {
     const gameTargetEntity = await this.ShuyouGameTargetEntity.findOne({
       task_id: task_id,
-      new_date: new_date
+      new_date: new_date,
     });
     // this.logger.warn(task_id)
     // this.logger.warn(new_date)
@@ -159,39 +168,40 @@ export class ShuyouGameTargetTencentService extends BaseService {
         lc_twentyseven: 0,
         lc_twentyeight: 0,
         lc_twentynine: 0,
-        lc_thirty: 0
-      }
-      const updateResult = await this.ShuyouGameTargetEntity
-        .createQueryBuilder()
-        .update()
-        .set(targetValue)
-        .where('task_id = :task_id and new_date = :new_date', {
-          task_id: task_id,
-          new_date: new_date
-        })
-        .execute();
+        lc_thirty: 0,
+      };
+      const updateResult =
+        await this.ShuyouGameTargetEntity.createQueryBuilder()
+          .update()
+          .set(targetValue)
+          .where('task_id = :task_id and new_date = :new_date', {
+            task_id: task_id,
+            new_date: new_date,
+          })
+          .execute();
       // this.logger.warn(updateResult)
-      const deleteResult = await this.ShuyouGameTargetEntity
-        .createQueryBuilder()
-        .delete()
-        .where('task_id = :task_id and new_date > :new_date', {
-          task_id: task_id,
-          new_date: new_date
-        }).execute()
+      const deleteResult =
+        await this.ShuyouGameTargetEntity.createQueryBuilder()
+          .delete()
+          .where('task_id = :task_id and new_date > :new_date', {
+            task_id: task_id,
+            new_date: new_date,
+          })
+          .execute();
       // this.logger.warn(deleteResult)
       if (updateResult.affected >= 1 && deleteResult.affected >= 0) {
-        return 1000
+        return 1000;
       } else {
-        return -1
+        return -1;
       }
     } else {
-      return -1
+      return -1;
     }
   }
   /**
-  * 重写分页查询
-  * @param query
-  */
+   * 重写分页查询
+   * @param query
+   */
   async page(query) {
     let { task_name, new_date, directorId, is_complete } = query;
     const sql = `
@@ -212,31 +222,39 @@ export class ShuyouGameTargetTencentService extends BaseService {
               LEFT JOIN shuyou_reason_incomplete d ON a.task_id = d.task_id AND a.new_date = d.new_date 
             WHERE
               t.game_agentId = 1
-            ${this.setSql(task_name, 'and a.task_name LIKE ?', [`%${task_name}%`])}
+            ${this.setSql(task_name, 'and a.task_name LIKE ?', [
+              `%${task_name}%`,
+            ])}
             ${this.setSql(directorId, 'and b.id = ?', [directorId])}
-            ${this.setSql(new_date, 'and a.new_date >= ? and a.new_date <= ?', [this.utils.formatDate(new Date(new_date[0])), this.utils.formatDate(new Date(new_date[1]))])}
+            ${this.setSql(new_date, 'and a.new_date >= ? and a.new_date <= ?', [
+              this.utils.formatDate(new Date(new_date[0])),
+              this.utils.formatDate(new Date(new_date[1])),
+            ])}
             ${this.setSql(is_complete, 'and c.is_complete = ?', [is_complete])}
         `;
     return this.sqlRenderPage(sql, query);
   }
-
 }
 // 微信机器人接口
-let sendVx_Robot = function (content) {
-  var url = 'http://148.70.251.170:19730/?liebie=1&mubiao=数优-深圳对接组&neirong=' + content
-  var http = require('http');
-  var pm = new Promise(function (resolve, reject) {
-    http.get(url, function (res) {
-      var html = '';
-      res.on('data', function (d) {
-        html += d.toString()
-      });
-      res.on('end', function () {
-        resolve(html);
-      });
-    }).on('error', function (e) {
-      reject(e)
-    });
-  });
-  return pm;
-}
+// let sendVx_Robot = function (content) {
+//   var url =
+//     'http://148.70.251.170:19730/?liebie=1&mubiao=数优-深圳对接组&neirong=' +
+//     content;
+//   var http = require('http');
+//   var pm = new Promise(function (resolve, reject) {
+//     http
+//       .get(url, function (res) {
+//         var html = '';
+//         res.on('data', function (d) {
+//           html += d.toString();
+//         });
+//         res.on('end', function () {
+//           resolve(html);
+//         });
+//       })
+//       .on('error', function (e) {
+//         reject(e);
+//       });
+//   });
+//   return pm;
+// };

+ 157 - 127
cool-admin-midway-master/src/app/modules/shuyou/service/utils.ts

@@ -1,9 +1,9 @@
 /*
  * @Author: YKH
  * @Date: 2021-12-11 21:36:52
- * @LastEditTime: 2022-06-28 14:01:44
- * @Description: 
- * @FilePath: \cool-admin\cool-admin-midway-master\src\app\modules\shuyou\service\utils.ts
+ * @LastEditTime: 2022-10-04 19:57:52
+ * @Description:
+ * @FilePath: \cool-admin-3.x\cool-admin-midway-master\src\app\modules\shuyou\service\utils.ts
  */
 import { Inject, Provide } from '@midwayjs/decorator';
 import { BaseService } from 'midwayjs-cool-core';
@@ -12,7 +12,6 @@ import { Utils } from '../../../comm/utils';
 
 @Provide()
 export class ShuyouUtilsService extends BaseService {
-
   @Inject()
   utils: Utils;
 
@@ -20,9 +19,9 @@ export class ShuyouUtilsService extends BaseService {
    * 获取天气信息
    */
   async getWeatherCD() {
-    let cityIds = '101270101' //成都
-    let resWe
-    const data = await getWeather(cityIds)
+    let cityIds = '101270101'; //成都
+    let resWe;
+    const data = await getWeather(cityIds);
     let data6 = JSON.parse(data + '');
     if (data6.code == 200) {
       resWe = data6;
@@ -33,129 +32,139 @@ export class ShuyouUtilsService extends BaseService {
   /**
    *
    *调用钉钉机器人发送消息GET
-   * @return {*} 
+   * @return {*}
    * @memberof ShuyouUtilsService
    */
   async dingRobot(text: string, atMobiles: string) {
-    const data = await dingRobot(text, atMobiles)
+    const data = await dingRobot(text, atMobiles);
     return data;
   }
   /**
    *
    *调用钉钉机器人发送消息Post
-   * @return {*} 
+   * @return {*}
    * @memberof ShuyouUtilsService
    */
   async postRobot(text: string, atMobiles) {
-    const data = await postRobot(text, atMobiles)
+    const data = await postRobot(text, atMobiles);
     return data;
   }
 
   /**
    *调用企业微信机器人发送消息Post:数优-加币/未完成播报群
-   * @return {*} 
+   * @return {*}
    * @memberof ShuyouUtilsService
    */
   async postRobotEnterpriseWeChat(text: string) {
-    const time = this.utils.formatDateTime(new Date())
-    const data = await postRobotEnterpriseWeChat(text, time)
+    const time = this.utils.formatDateTime(new Date());
+    const data = await postRobotEnterpriseWeChat(text, time);
     return data;
   }
 
   /**
    *调用企业微信机器人发送消息Post到:数据优化-深圳项目对接群
-   * @return {*} 
+   * @return {*}
    * @memberof ShuyouUtilsService
    */
   async postRobotEnterpriseWeChat2(text: string) {
-    const time = this.utils.formatDateTime(new Date())
-    const data = await postRobotEnterpriseWeChat2(text, time)
+    const time = this.utils.formatDateTime(new Date());
+    const data = await postRobotEnterpriseWeChat2(text, time);
     return data;
   }
   /**
-     *调用企业微信机器人发送消息Post到:数优资源报警群
-     * @return {*} 
-     * @memberof ShuyouUtilsService
-     */
+   *调用企业微信机器人发送消息Post到:数优资源报警群
+   * @return {*}
+   * @memberof ShuyouUtilsService
+   */
   async postRobotEnterpriseWeChat3(text: string) {
-    const time = this.utils.formatDateTime(new Date())
-    const data = await postRobotEnterpriseWeChat3(text, time)
+    const time = this.utils.formatDateTime(new Date());
+    const data = await postRobotEnterpriseWeChat3(text, time);
     return data;
   }
-
-
 }
 
 //=====================
 // 获取天气信息
 let getWeather = function (cityIds) {
-  var apiUrl = "http://aider.meizu.com/app/weather/listWeather?cityIds=" + cityIds;
+  var apiUrl =
+    'http://aider.meizu.com/app/weather/listWeather?cityIds=' + cityIds;
   var http = require('http');
   var pm = new Promise(function (resolve, reject) {
-    http.get(apiUrl, function (res) {
-      var html = '';
-      res.on('data', function (d) {
-        html += d.toString()
-      });
-      res.on('end', function () {
-        resolve(html);
+    http
+      .get(apiUrl, function (res) {
+        var html = '';
+        res.on('data', function (d) {
+          html += d.toString();
+        });
+        res.on('end', function () {
+          resolve(html);
+        });
+      })
+      .on('error', function (e) {
+        reject(e);
       });
-    }).on('error', function (e) {
-      reject(e)
-    });
   });
   return pm;
-}
+};
 // 钉钉机器人发送消息get
 let dingRobot = function (text: string, atMobiles: string) {
-  var access_token = '9513466adf38271afe11d02406497db43e4a8db7dbbe3d0bed2a5919efc3ac2f';
-  var apiUrl = "https://oapi.dingtalk.com/robot/send?access_token=" + access_token;
+  var access_token =
+    '9513466adf38271afe11d02406497db43e4a8db7dbbe3d0bed2a5919efc3ac2f';
+  var apiUrl =
+    'https://oapi.dingtalk.com/robot/send?access_token=' + access_token;
   let content = ``;
-  let atArr
+  let atArr;
   let atString = '';
   // console.log(atMobiles)
   if (atMobiles != '') {
-    atArr = atMobiles.split(',')
+    atArr = atMobiles.split(',');
     atArr.forEach(e => {
       atString = atString + '@' + e;
     });
   }
   // console.log(atArr);
-  content = atString + "**监控报警** \n" + text + "\n > ##### [点击查看详细数据](http://ykhvip.fun) \n"
+  content =
+    atString +
+    '**监控报警** \n' +
+    text +
+    '\n > ##### [点击查看详细数据](http://ykhvip.fun) \n';
   // console.log(content)
   // "#### @18408246387监控报警 \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"
-  const axios = require('axios')
+  const axios = require('axios');
   var pm = new Promise(function (resolve, reject) {
-    axios.post(apiUrl, {
-      "msgtype": "markdown",
-      "markdown": {
-        "title": "数据监控报警",
-        "text": content
-      },
-      "at": {
-        "atMobiles": atArr,
-        // 		"atUserIds": [
-        // 			"ykh001"
-        // 		],
-        "isAtAll": false
-      }
-    })
-      .then((res) => {
+    axios
+      .post(apiUrl, {
+        msgtype: 'markdown',
+        markdown: {
+          title: '数据监控报警',
+          text: content,
+        },
+        at: {
+          atMobiles: atArr,
+          // 		"atUserIds": [
+          // 			"ykh001"
+          // 		],
+          isAtAll: false,
+        },
+      })
+      .then(res => {
         // console.log(`statusCode: ${res.statusCode}`)
         // console.log(res.data)
         resolve(res.data);
       })
-      .catch((error) => {
+      .catch(error => {
         // console.error(error)
-        reject(error)
-      })
+        reject(error);
+      });
   });
   return pm;
-}
+};
 // 钉钉机器人发送消息post
 let postRobot = function (text: string, atMobiles: []) {
-  var access_token = '9513466adf38271afe11d02406497db43e4a8db7dbbe3d0bed2a5919efc3ac2f';
-  var apiUrl = "https://oapi.dingtalk.com/robot/send?access_token=" + access_token;
+  var access_token =
+    '9513466adf38271afe11d02406497db43e4a8db7dbbe3d0bed2a5919efc3ac2f';
+  var apiUrl =
+    'https://oapi.dingtalk.com/robot/send?access_token=' + access_token;
   let content = ``;
   let atString = '';
   // console.log(atArr);
@@ -164,119 +173,140 @@ let postRobot = function (text: string, atMobiles: []) {
       atString = atString + '@' + e;
     });
   }
-  content = atString + "**监控报警** \n" + text + "\n > ##### [点击查看详细数据](http://ykhvip.fun) \n"
+  content =
+    atString +
+    '**监控报警** \n' +
+    text +
+    '\n > ##### [点击查看详细数据](http://ykhvip.fun) \n';
   // console.log(content)
   // "#### @18408246387监控报警 \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"
-  const axios = require('axios')
+  const axios = require('axios');
   var pm = new Promise(function (resolve, reject) {
-    axios.post(apiUrl, {
-      "msgtype": "markdown",
-      "markdown": {
-        "title": "数据监控报警",
-        "text": content
-      },
-      "at": {
-        "atMobiles": atMobiles,
-        // 		"atUserIds": [
-        // 			"ykh001"
-        // 		],
-        "isAtAll": false
-      }
-    })
-      .then((res) => {
+    axios
+      .post(apiUrl, {
+        msgtype: 'markdown',
+        markdown: {
+          title: '数据监控报警',
+          text: content,
+        },
+        at: {
+          atMobiles: atMobiles,
+          // 		"atUserIds": [
+          // 			"ykh001"
+          // 		],
+          isAtAll: false,
+        },
+      })
+      .then(res => {
         // console.log(`statusCode: ${res.statusCode}`)
         // console.log(res.data)
         resolve(res.data);
       })
-      .catch((error) => {
+      .catch(error => {
         // console.error(error)
-        reject(error)
-      })
+        reject(error);
+      });
   });
   return pm;
-}
+};
 
 // 企业微信机器人发送消息post(数优-加币/未完成播报群)
 let postRobotEnterpriseWeChat = function (text: string, time: string) {
   var access_token = '7d095d5b-8240-45fd-a68c-baff3628d83b';
-  var apiUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + access_token;
+  var apiUrl =
+    'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' + access_token;
   let content = ``;
-  content = "**监控报警" + time + "** \n" + text + "\n > ##### [点击进入查看详细数据](http://ykhvip.fun) \n"
+  content =
+    '**监控报警' +
+    time +
+    '** \n' +
+    text +
+    '\n > ##### [点击进入查看详细数据](http://ykhvip.fun) \n';
   // console.log(content)
   // "#### @18408246387监控报警 \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"
-  const axios = require('axios')
+  const axios = require('axios');
   var pm = new Promise(function (resolve, reject) {
-    axios.post(apiUrl, {
-      "msgtype": "markdown",
-      "markdown": {
-        "content": content
-      }
-    })
-      .then((res) => {
+    axios
+      .post(apiUrl, {
+        msgtype: 'markdown',
+        markdown: {
+          content: content,
+        },
+      })
+      .then(res => {
         // console.log(`statusCode: ${res.statusCode}`)
         // console.log(res.data)
         resolve(res.data);
       })
-      .catch((error) => {
+      .catch(error => {
         // console.error(error)
-        resolve(error)
-      })
+        resolve(error);
+      });
   });
   return pm;
-}
+};
 // 企业微信机器人发送消息post(数据优化-深圳项目对接群)
 let postRobotEnterpriseWeChat2 = function (text: string, time: string) {
   var access_token = '5ccfb180-c062-48b5-ae18-0c96f7c19f0b';
-  var apiUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + access_token;
+  var apiUrl =
+    'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' + access_token;
   let content = ``;
-  content = "**监控报警" + time + "** \n" + text + "\n > ##### [点击进入查看详细数据](http://ykhvip.fun) \n"
+  content =
+    '**监控报警' +
+    time +
+    '** \n' +
+    text +
+    '\n > ##### [点击进入查看详细数据](http://ykhvip.fun) \n';
   // console.log(content)
   // "#### @18408246387监控报警 \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"
-  const axios = require('axios')
+  const axios = require('axios');
   var pm = new Promise(function (resolve, reject) {
-    axios.post(apiUrl, {
-      "msgtype": "markdown",
-      "markdown": {
-        "content": content
-      }
-    })
-      .then((res) => {
+    axios
+      .post(apiUrl, {
+        msgtype: 'markdown',
+        markdown: {
+          content: content,
+        },
+      })
+      .then(res => {
         // console.log(`statusCode: ${res.statusCode}`)
         // console.log(res.data)
         resolve(res.data);
       })
-      .catch((error) => {
+      .catch(error => {
         // console.error(error)
-        resolve(error)
-      })
+        resolve(error);
+      });
   });
   return pm;
-}
+};
 // 企业微信机器人发送消息post(数优资源报警群)
 let postRobotEnterpriseWeChat3 = function (text: string, time: string) {
   var access_token = '34cbfa5a-c31d-464f-baf8-8363d6f4ac6a';
-  var apiUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + access_token;
+  var apiUrl =
+    'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' + access_token;
   let content = ``;
-  content = "**资源不足报警" + time + "** \n" + text + "\n"
+  content = '**资源不足报警' + time + '** \n' + text + '\n';
   // console.log(content)
   // "#### @18408246387监控报警 \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"
-  const axios = require('axios')
+  const axios = require('axios');
   var pm = new Promise(function (resolve, reject) {
-    axios.post(apiUrl, {
-      "msgtype": "markdown",
-      "markdown": {
-        "content": content
-      }
-    })
-      .then((res) => {
+    axios
+      .post(apiUrl, {
+        msgtype: 'markdown',
+        markdown: {
+          content: content,
+        },
+      })
+      .then(res => {
         // console.log(`statusCode: ${res.statusCode}`)
         // console.log(res.data)
         resolve(res.data);
       })
-      .catch((error) => {
+      .catch(error => {
         // console.error(error)
-        resolve(error)
-      })
+        resolve(error);
+      });
   });
   return pm;
-}
+};

+ 2 - 1
cool-admin-vue-vue3-ts-vite/package.json

@@ -22,6 +22,7 @@
         "file-saver": "^2.0.5",
         "glob": "^7.1.6",
         "js-beautify": "^1.13.5",
+        "js-file-download": "^0.4.12",
         "merge": "^2.1.1",
         "mitt": "^2.1.0",
         "mockjs": "^1.1.0",
@@ -65,4 +66,4 @@
         "vite-plugin-style-import": "^1.0.1",
         "vite-svg-loader": "^2.1.0"
     }
-}
+}

+ 8 - 1
cool-admin-vue-vue3-ts-vite/src/cool/modules/shuyou/components/shuyouGameDirector-select.vue

@@ -1,3 +1,10 @@
+<!--
+ * @Author: YKH
+ * @Date: 2021-12-08 10:29:23
+ * @LastEditTime: 2022-10-03 19:48:17
+ * @Description: file content
+ * @FilePath: \cool-admin-3.x\cool-admin-vue-vue3-ts-vite\src\cool\modules\shuyou\components\shuyouGameDirector-select.vue
+-->
 <template>
 	<el-select v-model="value" v-bind="props" @change="onChange">
 		<el-option v-for="(item, index) in list" :key="index" :value="item.id" :label="item.name" />
@@ -37,7 +44,7 @@ export default defineComponent({
 		watch(
 			() => props.modelValue,
 			(val: any) => {
-				value.value =  val 
+				value.value = val;
 				//value.value =  (isArray(val) ? val : [val]).filter(Boolean);
 			},
 			{

+ 3 - 3
cool-admin-vue-vue3-ts-vite/src/cool/modules/shuyou/components/shuyouRentComputerShop-select.vue

@@ -1,9 +1,9 @@
 <!--
  * @Author: YKH
  * @Date: 2022-09-02 22:49:06
- * @LastEditTime: 2022-09-02 22:56:10
+ * @LastEditTime: 2022-10-03 20:10:59
  * @Description: file content
- * @FilePath: \cool-admin\cool-admin-vue-vue3-ts-vite\src\cool\modules\shuyou\components\shuyouRentComputerShop-select.vue
+ * @FilePath: \cool-admin-3.x\cool-admin-vue-vue3-ts-vite\src\cool\modules\shuyou\components\shuyouRentComputerShop-select.vue
 -->
 <template>
 	<el-select v-model="value" v-bind="props" @change="onChange">
@@ -43,7 +43,7 @@ export default defineComponent({
 		watch(
 			() => props.modelValue,
 			(val: any) => {
-				value.value = val  //(isArray(val) ? val : [val]).filter(Boolean);
+				value.value = val; //(isArray(val) ? val : [val]).filter(Boolean);
 			},
 			{
 				immediate: true

+ 2 - 2
cool-admin-vue-vue3-ts-vite/src/cool/modules/shuyou/service/rent_computer.ts

@@ -1,9 +1,9 @@
 /*
  * @Author: YKH
  * @Date: 2022-09-02 19:24:43
- * @LastEditTime: 2022-09-23 14:20:32
+ * @LastEditTime: 2022-10-03 17:14:07
  * @Description: file content
- * @FilePath: \cool-admin\cool-admin-vue-vue3-ts-vite\src\cool\modules\shuyou\service\rent_computer.ts
+ * @FilePath: \cool-admin-3.x\cool-admin-vue-vue3-ts-vite\src\cool\modules\shuyou\service\rent_computer.ts
  */
 import { BaseService, Permission, Service } from "/@/core";
 

+ 232 - 0
cool-admin-vue-vue3-ts-vite/src/cool/modules/shuyou/utils/export2excel.ts

@@ -0,0 +1,232 @@
+/* eslint-disable */
+// @ts-nocheck
+import { saveAs } from 'file-saver';
+import XLSX from 'xlsx';
+
+function generateArray(table) {
+    var out = [];
+    var rows = table.querySelectorAll('tr');
+    var ranges = [];
+    for (var R = 0; R < rows.length; ++R) {
+        var outRow = [];
+        var row = rows[R];
+        var columns = row.querySelectorAll('td');
+        for (var C = 0; C < columns.length; ++C) {
+            var cell = columns[C];
+            var colspan = cell.getAttribute('colspan');
+            var rowspan = cell.getAttribute('rowspan');
+            var cellValue = cell.innerText;
+            if (cellValue !== '' && cellValue == +cellValue) cellValue = +cellValue;
+
+            //Skip ranges
+            ranges.forEach(function(range) {
+                if (
+                    R >= range.s.r &&
+                    R <= range.e.r &&
+                    outRow.length >= range.s.c &&
+                    outRow.length <= range.e.c
+                ) {
+                    for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
+                }
+            });
+
+            //Handle Row Span
+            if (rowspan || colspan) {
+                rowspan = rowspan || 1;
+                colspan = colspan || 1;
+                ranges.push({
+                    s: {
+                        r: R,
+                        c: outRow.length
+                    },
+                    e: {
+                        r: R + rowspan - 1,
+                        c: outRow.length + colspan - 1
+                    }
+                });
+            }
+
+            //Handle Value
+            outRow.push(cellValue !== '' ? cellValue : null);
+
+            //Handle Colspan
+            if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
+        }
+        out.push(outRow);
+    }
+    return [out, ranges];
+}
+
+function datenum(v, date1904) {
+    if (date1904) v += 1462;
+    var epoch = Date.parse(v);
+    return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
+}
+
+function sheet_from_array_of_arrays(data, opts) {
+    var ws = {};
+    var range = {
+        s: {
+            c: 10000000,
+            r: 10000000
+        },
+        e: {
+            c: 0,
+            r: 0
+        }
+    };
+    for (var R = 0; R != data.length; ++R) {
+        for (var C = 0; C != data[R].length; ++C) {
+            if (range.s.r > R) range.s.r = R;
+            if (range.s.c > C) range.s.c = C;
+            if (range.e.r < R) range.e.r = R;
+            if (range.e.c < C) range.e.c = C;
+            var cell = {
+                v: data[R][C]
+            };
+            if (cell.v == null) continue;
+            var cell_ref = XLSX.utils.encode_cell({
+                c: C,
+                r: R
+            });
+
+            if (typeof cell.v === 'number') cell.t = 'n';
+            else if (typeof cell.v === 'boolean') cell.t = 'b';
+            else if (cell.v instanceof Date) {
+                cell.t = 'n';
+                cell.z = XLSX.SSF._table[14];
+                cell.v = datenum(cell.v);
+            } else cell.t = 's';
+
+            ws[cell_ref] = cell;
+        }
+    }
+    if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
+    return ws;
+}
+
+function Workbook() {
+    if (!(this instanceof Workbook)) return new Workbook();
+    this.SheetNames = [];
+    this.Sheets = {};
+}
+
+function s2ab(s) {
+    var buf = new ArrayBuffer(s.length);
+    var view = new Uint8Array(buf);
+    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
+    return buf;
+}
+
+export function export_table_to_excel(id) {
+    var theTable = document.getElementById(id);
+    var oo = generateArray(theTable);
+    var ranges = oo[1];
+
+    /* original data */
+    var data = oo[0];
+    var ws_name = 'SheetJS';
+
+    var wb = new Workbook(),
+        ws = sheet_from_array_of_arrays(data);
+
+    /* add ranges to worksheet */
+    // ws['!cols'] = ['apple', 'banan'];
+    ws['!merges'] = ranges;
+
+    /* add worksheet to workbook */
+    wb.SheetNames.push(ws_name);
+    wb.Sheets[ws_name] = ws;
+
+    var wbout = XLSX.write(wb, {
+        bookType: 'xlsx',
+        bookSST: false,
+        type: 'binary'
+    });
+
+    saveAs(
+        new Blob([s2ab(wbout)], {
+            type: 'application/octet-stream'
+        }),
+        'test.xlsx'
+    );
+}
+
+export function export_json_to_excel({
+    multiHeader = [],
+    header,
+    data,
+    filename,
+    merges = [],
+    autoWidth = true,
+    bookType = 'xlsx'
+} = {}) {
+    /* original data */
+    filename = filename || 'excel-list';
+    data = [...data];
+    data.unshift(header);
+
+    for (let i = multiHeader.length - 1; i > -1; i--) {
+        data.unshift(multiHeader[i]);
+    }
+
+    var ws_name = 'SheetJS';
+    var wb = new Workbook(),
+        ws = sheet_from_array_of_arrays(data);
+
+    if (merges.length > 0) {
+        if (!ws['!merges']) ws['!merges'] = [];
+        merges.forEach(item => {
+            ws['!merges'].push(XLSX.utils.decode_range(item));
+        });
+    }
+
+    if (autoWidth) {
+        /*设置worksheet每列的最大宽度*/
+        const colWidth = data.map(row =>
+            row.map(val => {
+                /*先判断是否为null/undefined*/
+                if (val == null) {
+                    return {
+                        wch: 10
+                    };
+                } else if (val.toString().charCodeAt(0) > 255) {
+                    /*再判断是否为中文*/
+                    return {
+                        wch: val.toString().length * 2
+                    };
+                } else {
+                    return {
+                        wch: val.toString().length
+                    };
+                }
+            })
+        );
+        /*以第一行为初始值*/
+        let result = colWidth[0];
+        for (let i = 1; i < colWidth.length; i++) {
+            for (let j = 0; j < colWidth[i].length; j++) {
+                if (result[j]['wch'] < colWidth[i][j]['wch']) {
+                    result[j]['wch'] = colWidth[i][j]['wch'];
+                }
+            }
+        }
+        ws['!cols'] = result;
+    }
+
+    /* add worksheet to workbook */
+    wb.SheetNames.push(ws_name);
+    wb.Sheets[ws_name] = ws;
+
+    var wbout = XLSX.write(wb, {
+        bookType: bookType,
+        bookSST: false,
+        type: 'binary'
+    });
+    saveAs(
+        new Blob([s2ab(wbout)], {
+            type: 'application/octet-stream'
+        }),
+        `${filename}.${bookType}`
+    );
+}

+ 5 - 4
cool-admin-vue-vue3-ts-vite/src/cool/modules/shuyou/utils/index.ts

@@ -1,10 +1,11 @@
 /*
  * @Author: YKH
  * @Date: 2022-02-11 10:59:45
- * @LastEditTime: 2022-02-11 10:59:59
- * @Description: 
- * @FilePath: \cool-admin\cool-admin-vue-vue3-ts-vite\src\cool\modules\shuyou\utils\index.ts
+ * @LastEditTime: 2022-10-03 14:58:31
+ * @Description:
+ * @FilePath: \cool-admin-3.x\cool-admin-vue-vue3-ts-vite\src\cool\modules\shuyou\utils\index.ts
  */
+import { export_json_to_excel } from "./export2excel";
 
 function currentDate() {
 	const d: Date = new Date();
@@ -19,4 +20,4 @@ function currentDate() {
 	};
 }
 
-export { currentDate };
+export { export_json_to_excel, currentDate };

+ 1 - 1
cool-admin-vue-vue3-ts-vite/src/cool/modules/shuyou/views/idcard.vue

@@ -398,7 +398,7 @@ export default defineComponent({
 				spinner: "el-icon-loading",
 				background: "rgba(0, 0, 0, 0.7)"
 			});
-			console.log(urls);
+			// console.log(urls);
 			const params = {
 				uploadday: state.uploadday,
 				fileaddress: urls,

+ 35 - 6
cool-admin-vue-vue3-ts-vite/src/cool/modules/shuyou/views/rent_computer.vue

@@ -3,9 +3,15 @@
 		<el-row type="flex">
 			<cl-refresh-btn />
 			<cl-add-btn />
-			<!-- <el-button type="primary" size="mini" @click="visible_import = true"
+			<el-button type="primary" size="mini" @click="visible_import = true"
 				>批量导入</el-button
-			> -->
+			>
+
+			<el-button type="primary" size="mini"
+				><a class="aa" href="http://127.0.0.1:8001//uploads/模板文件/租机模板.xlsx"
+					><slot>下载模板</slot></a
+				></el-button
+			>
 			<cl-multi-delete-btn />
 			<demo-query-is_expire />
 			<cl-flex1 />
@@ -304,6 +310,16 @@
 							</cl-upload>
 						</el-col>
 					</el-form-item>
+					<el-form-item label="租赁人" prop="type_id">
+						<el-col :span="12">
+							<shuyou-gameDirector-select v-model="importForm.rent_person_id" />
+						</el-col>
+					</el-form-item>
+					<el-form-item label="供应商名" prop="type_id">
+						<el-col :span="12">
+							<shuyou-rentComputerShop-select v-model="importForm.shop_id" />
+						</el-col>
+					</el-form-item>
 					<el-form-item>
 						<el-button
 							size="mini"
@@ -330,6 +346,8 @@ import dayjs from "dayjs";
 import { ElMessage, ElMessageBox, ElLoading } from "element-plus";
 import { useRefs } from "/@/core";
 import AdvSearch from "../components/adv-search-computer.vue";
+import shuyouGameDirectorselect from "../components/shuyouGameDirector-select.vue";
+import shuyouRentComputerShopSelect from "../components/shuyouRentComputerShop-select.vue";
 
 export default defineComponent({
 	name: "rent-computer",
@@ -337,7 +355,9 @@ export default defineComponent({
 	components: {
 		"demo-query-is_expire": QueryIsExpire,
 		"demo-select-rentComputerList": shuyouRentComputerListSelect,
-		"demo-adv-computer-search": AdvSearch
+		"demo-adv-computer-search": AdvSearch,
+		"shuyou-gameDirector-select": shuyouGameDirectorselect,
+		"shuyou-rentComputerShop-select": shuyouRentComputerShopSelect
 	},
 
 	setup() {
@@ -348,7 +368,9 @@ export default defineComponent({
 			relevance: 1
 		});
 		const importForm = reactive<any>({
-			urls: ""
+			urls: "",
+			rent_person_id: null,
+			shop_id: null
 		});
 		const saving = ref<boolean>(false);
 		// 表单值
@@ -384,6 +406,7 @@ export default defineComponent({
 		const visible_import = ref<boolean>(false);
 		let cardList = ref<any[]>([]);
 		const rent_end = ref<string>("");
+		const loading = ref<boolean>(false);
 
 		// 新增、编辑配置
 		const upsert = reactive<Upsert>({
@@ -1028,9 +1051,11 @@ export default defineComponent({
 				spinner: "el-icon-loading",
 				background: "rgba(0, 0, 0, 0.7)"
 			});
-			console.log(importForm.urls);
+			// console.log(importForm.urls);
 			const params = {
-				fileaddress: importForm.urls
+				fileaddress: importForm.urls,
+				rent_person_id: importForm.rent_person_id,
+				shop_id: importForm.shop_id
 			};
 			await service.shuyouRentComputer
 				.batchImport(params)
@@ -1110,4 +1135,8 @@ export default defineComponent({
 	border-radius: 3px;
 	margin-left: 30px;
 }
+.aa {
+	text-decoration: none;
+	color: rgb(255, 255, 255);
+}
 </style>

+ 5 - 0
cool-admin-vue-vue3-ts-vite/yarn.lock

@@ -3168,6 +3168,11 @@ js-beautify@^1.13.5:
     mkdirp "^1.0.4"
     nopt "^5.0.0"
 
+js-file-download@^0.4.12:
+  version "0.4.12"
+  resolved "https://registry.npmmirror.com/js-file-download/-/js-file-download-0.4.12.tgz#10c70ef362559a5b23cdbdc3bd6f399c3d91d821"
+  integrity sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==
+
 js-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"