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
import { default as BaseController } from "../baseController";
import { Post } from "egg-shell-decorators";
import * as XLSX from "xlsx";
import * as path from "path";
import { TMSWayBill } from "../../entity/express/tms/tmsWayBill";
import { In } from "typeorm";
import moment = require("moment");
 
/**
 * 运单更新
 */
export default class WayPackageImportController extends BaseController {
  //#region 面单导入Excel
  @Post()
  public async importExcel() {
    setTimeout(async () => {
      await this.importExcelWork();
    }, 0);
 
    this.info.result = true;
    this.ctx.body = this.info;
  }
  //#endregion
 
  //#region importExcelWork
  private async importExcelWork() {
    let { ctx } = this;
    let body = ctx.request.body;
    let redis = ctx.app.redis.clients.get("common"); // 将消息放入redis缓存
    let fileUrl = body.url;
    redis.expire(body.key, 5 * 60);
    if (!fileUrl) {
      this.setMsg("上传文件不存在", "red");
      return;
    }
    if (!body.key) {
      this.setMsg("上传key不存在", "red");
      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;
      }
      //#endregion
 
      let i = 1,
        successCount = 0,
        failCount = 0;
      for (let row of dataList) {
        i++;
        let wayBillCode = row["运单号"];
        let consigneeIdcard = row["收货人身份证号"];
        let consigneeAddress = row["收货人详细地址"];
        let consigneeName = row["收货人"];
        let provinceName = row["收货人省"];
        let cityName = row["收货人市"];
        let regionName = row["收货人区/县"];
        let grossWeight = row["复重重量(KG)"];
        let consigneeMobile = row["收货人电话"];
        let createDate = row["创建时间"];
        let expressCode = row["快递单号"];
        if (!wayBillCode) {
          this.setMsg(`第${i}行、运单号为空`, "red");
          failCount++;
          continue;
        }
        // 需要更新的数据
        let data: any = {};
        if (consigneeIdcard) {
          data.consigneeIdcard = consigneeIdcard == "null" ? null : consigneeIdcard;
        }
        if (consigneeAddress) {
          data.consigneeAddress = consigneeAddress == "null" ? null : consigneeAddress;
        }
        if (consigneeName) {
          data.consigneeName = consigneeName == "null" ? null : consigneeName;
        }
        if (provinceName) {
          data.provinceName = provinceName == "null" ? null : provinceName;
        }
        if (cityName) {
          data.cityName = cityName == "null" ? null : cityName;
        }
        if (regionName) {
          data.regionName = regionName == "null" ? null : regionName;
        }
        if (consigneeMobile) {
          data.consigneeMobile = consigneeMobile == "null" ? null : consigneeMobile;
        }
        if (grossWeight) {
          data.grossWeight = grossWeight == "null" ? null : grossWeight;
        }
        if (expressCode) {
          data.expressCode = expressCode == "null" ? null : expressCode;
        }
        if (createDate) {
          if (createDate == "null") {
            data.createDate = null;
          } else {
            if (typeof createDate == "number") {
              try {
                let d = moment(new Date(1900, 0, createDate - 1));
                data.createDate = d.toDate();
              } catch (error) {
                this.setMsg(`第${i}行、${wayBillCode}更新创建时间格式不正确`, "red");
              }
            } else {
              try {
                let d = moment(createDate);
                data.createDate = d.toDate();
              } catch (error) {
                this.setMsg(`第${i}行、${wayBillCode}更新创建时间格式不正确`, "red");
              }
            }
          }
        }
        if (!Object.keys(data).length) {
          this.setMsg(`第${i}行、${wayBillCode}没有可更新的数据`, "red");
          continue;
        }
 
        let wayInfo = await this.dbRead.findOne(TMSWayBill, {
          wayBillCode: "" + wayBillCode
        });
        if (!wayInfo) {
          this.setMsg(`第${i}行、${wayBillCode}不存在`, "red");
          failCount++;
          continue;
        }
 
        let statusList = ["审核成功", "组板异常", "处理中", "清关中"];
        if (statusList.indexOf(wayInfo.orderStatus) >= 0) {
          await this.dbWrite.update(
            TMSWayBill,
            {
              wayBillCode: "" + wayBillCode,
              orderStatus: In(statusList)
            },
            data
          );
          this.setMsg(`第${i}行、${wayBillCode}更新成功`);
          successCount++;
        } else {
          failCount++;
          this.setMsg(`第${i}行、${wayBillCode}更新失败,只有状态为${statusList.join(",")}才允许更新`, "red");
        }
      }
      this.setMsg(`共更新成功${successCount}条,失败${failCount}条`, "blue");
    } catch (ex) {
      this.setMsg("出现异常:" + ex.message, "red");
      this.info.result = false;
    }
    this.setMsg("-1");
  }
  //#endregion
}