333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
import { default as BaseController } from "../baseController";
import { Post } from "egg-shell-decorators";
import * as XLSX from "xlsx";
import * as path from "path";
import { TMSWayBillOther } from "../../entity/express/tms/tmsWayBillOther";
import { In } from "typeorm";
import moment = require("moment");
 
/**
 * 其他运单
 */
export default class TMSWayBillOtherController extends BaseController {
  //#region 导入Excel
  /// <summary>
  /// 导入Excel
  /// </summary>
  /// <returns></returns>
  @Post()
  public async importExcel() {
    setTimeout(async () => {
      await this.importExcelWork();
    }, 0);
 
    this.info.result = true;
    this.ctx.body = this.info;
  }
 
  @Post()
  public async importExcelWork() {
    let startDate = new Date();
    let { ctx } = this;
    let body = ctx.request.body;
    let userInfo = await ctx.helper.userInfo();
    let redis = ctx.app.redis.clients.get("common"); // 将消息放入redis缓存
    let fileUrl = body.url;
    redis.expire(body.key, 5 * 60);
    if (!body.key) {
      this.setMsg(body.key, "上传key不存在");
      return;
    }
    if (!fileUrl) {
      redis.rpush(body.key, "上传文件不存在");
      return;
    }
    try {
      let rootPath = path.resolve(); // 获得根目录
      let filePath = rootPath + path.sep + fileUrl.replace(/\//gi, path.sep); // 上传文件路径
      var workbook = XLSX.readFile(filePath); //整个 excel 文档
      var sheetNames = workbook.SheetNames; //获取所有工作薄名
      var sheet1 = workbook.Sheets[sheetNames[0]]; //根据工作薄名获取工作薄
      let dataList = XLSX.utils.sheet_to_json(sheet1); // 获得当前sheet表单数据转为json格式
 
      //#region 验证数据正确性
      this.info.result = true;
      if (!dataList.length) {
        this.setMsg(`没有可导入的数据`, "red");
        return;
      }
      this.isMsgError = false;
      let msg = "";
      let insertCount = 0;
      let updateCount = 0;
      let i = 0;
      for (let row of dataList) {
        i++;
        if (i % 500 === 1) {
          this.setMsg(`${i}、开始验证...`);
        }
        let consigneeMobile = row["收件人电话"];
        if (!row["运单号"]) {
          this.setMsg(`${i}、第${i + 1}运单号不能为空`, "red");
        }
        if (!row["收件人姓名"]) {
          this.setMsg(`${i}、第${i + 1}收件人姓名不能为空`, "red");
        }
        if (!row["收件人地址"]) {
          this.setMsg(`${i}、第${i + 1}收件人地址不能为空`, "red");
        }
        if (!row["收件人电话"]) {
          this.setMsg(`${i}、第${i + 1}收件人电话不能为空`, "red");
        } else {
          // let strPatern = /^(1[0-9][012345678]\d{7}|1[0123456789][012356789]\d{8})$/g;
          let strPatern = /^1\d{10}$/gi;
          var re = new RegExp(strPatern);
          var strPatern2 = /^((0\d{2,3}-\d{7,8})|(1[3584]\d{9}))$/;
          var st = new RegExp(strPatern2);
          if (!re.test(consigneeMobile) && !st.test(consigneeMobile)) {
            this.setMsg(`${i}、第${i + 1}电话格式不正确`, "red");
          }
        }
        if (!row["重量"]) {
          this.setMsg(`${i}、第${i + 1}重量不能为空`, "red");
        }
        if (!row["内件信息"]) {
          this.setMsg(`${i}、第${i + 1}内件信息不能为空`, "red");
        }
      }
      if (this.isMsgError) {
        this.setMsg("-1");
        return;
      }
 
      let otherList = await this.dbRead.find(TMSWayBillOther, {
        wayBillCode: In(dataList.map(item => item["运单号"]))
      });
 
      let insertList = [];
      let existList = [];
      for (let list of dataList) {
        let wayBillCode = list["运单号"];
        let expressCode = list["国内快递单号"];
        let consigneeName = list["收件人姓名"];
        let consigneeMobile = list["收件人电话"];
        let consigneeAddress = list["收件人地址"];
        let internalinformation = list["内件信息"];
        let weight = parseFloat(list["重量"]);
 
        let other = otherList.find(item => item.wayBillCode == wayBillCode);
        if (other) {
          updateCount += 1;
          existList.push(wayBillCode);
        } else {
          insertCount += 1;
          insertList.push({
            wayBillCode: wayBillCode,
            expressCode: expressCode,
            weight: weight,
            consigneeName: consigneeName,
            consigneeAddress: consigneeAddress,
            consigneeMobile: consigneeMobile,
            internalinformation: internalinformation,
            createID: userInfo.user_Id,
            creator: userInfo.userTrueName,
            createDate: new Date(),
            userProduct_Id: userInfo.userProduct_Id,
            userProductCode: userInfo.userProductCode,
            userProductAlias: userInfo.userProductAlias,
            platUser_Id: userInfo.platUser_Id,
            platUserCode: userInfo.platUserCode,
            platUserName: userInfo.platUserName,
            platCorpName: userInfo.platCorpName
          });
          if (insertCount % 50 === 0) {
            await this.dbWrite.insert(TMSWayBillOther, insertList);
            msg = "导入第" + insertCount + "行成功";
            this.setMsg(msg, "blue");
            insertList = [];
          }
        }
      }
      if (insertList.length > 0) {
        await this.dbWrite.insert(TMSWayBillOther, insertList);
        msg = "导入第" + insertCount + "行成功";
        this.setMsg(msg, "blue");
        insertList = [];
      }
      if (existList.length) {
        msg = "存在的单号:" + existList.join(", ");
        this.setMsg(msg, "red");
        existList = [];
      }
      let endDate = moment(Date.now());
      let totalSeconds = endDate.diff(startDate, "seconds");
      msg = `新增导入${insertCount}条成功,已存在${updateCount}条,共耗时${totalSeconds}秒`;
      this.setMsg(msg, "blue");
    } catch (ex) {
      this.setMsg("出现异常:" + ex.message + ex.StackTrace, "red");
    }
 
    this.setMsg("-1");
  }
 
  // #endregion
}