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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
import * as path from "path";
import BaseController from "../baseController";
import { Post } from "egg-shell-decorators";
import { BaseConsignor } from "../../entity/basicInfo/consignor/baseConsignor";
import { TMSWayBillReceive } from "../../entity/express/tms/tmsWayBillReceive";
import { TMSWayBillUpload } from "../../entity/express/tms/tmsWayBillUpload";
import { TMSWayBillTracking } from "../../entity/express/tms/tmsWayBillTracking";
import { TMSWayBill } from "../../entity/express/tms/tmsWayBill";
import { TMSWayBillList } from "../../entity/express/tms/tmsWayBillList";
import { BaseCity } from "../../entity/basicInfo/base/baseCity";
import { TmsGoodsRegion } from "../../entity/express/panel/tmsGoodsRegion";
import { BaseStorage } from "../../entity/basicInfo/base/baseStorage";
import { TMSWayBillAbnormal } from "../../entity/express/tms/tmsWayBillAbnormal";
import { BasePostCode } from "../../entity/basicInfo/base/basePostCode";
import moment = require("moment");
 
/**
 * 菜单管理
 */
export default class WaybillUploadController extends BaseController {
  //#region 运单根据口岸获取关联下拉框类别
 
  //#region 导入面单图片数据
  /**
   * 导入面单图片数据
   */
  @Post()
  public async importWayBillUpload() {
    let { ctx } = this;
    let body = ctx.request.body;
    let userInfo = await ctx.helper.userInfo();
    let storage_Id = 0;
    let storageName = "";
    try {
      let errorMsg = "";
      let uploadCount = 0;
      for (let imageInfo of body.imageList) {
        //#region 校验数据
        let ext = path.extname(imageInfo.imageName);
        let wayBillCode = path.basename(imageInfo.imageName, ext).toUpperCase();
 
        //效验揽件是否存在该运单号
        let receiveInfo = await this.dbRead.findOne(TMSWayBillReceive, {
          wayBillCode: wayBillCode,
          userProduct_Id: userInfo.userProduct_Id
        });
        if (!receiveInfo) {
          errorMsg += "<font color='red'>运单号" + wayBillCode + "未在揽件记录中查询到数据;</font><br/>";
        } else if (receiveInfo.collectStatus == "已揽收") {
          let conInfo = await this.dbRead.findOne(BaseConsignor, receiveInfo.consignor_Id);
          if (!conInfo) {
            errorMsg += "<font color='red'>运单号" + wayBillCode + "未设置门店;</font><br/>";
          } else {
            let uploadInfo = await this.dbRead.findOne(TMSWayBillUpload, {
              wayBillCode: wayBillCode,
              userProduct_Id: userInfo.userProduct_Id
            });
            let imageUrl = imageInfo.imageUrl;
            if (imageUrl.indexOf("/") !== 0) {
              imageUrl = "/" + imageUrl;
            }
            if (uploadInfo) {
              errorMsg += "<font color='blue'>运单号" + wayBillCode + "在面单上传记录中已经存在了,图片已更新;</font><br/>";
              uploadInfo.filePath = imageUrl;
              await this.dbWrite.update(TMSWayBillUpload, uploadInfo.wayBillUpload_Id, {
                filePath: imageUrl
              });
            } else {
              uploadCount += 1;
              storage_Id = receiveInfo.storage_Id;
              storageName = receiveInfo.storageName;
              let uploadInfo = new TMSWayBillUpload();
              uploadInfo.filePath = imageUrl;
              uploadInfo.wayBillCode = wayBillCode;
              uploadInfo.port_Id = body.port_Id;
              uploadInfo.portName = body.portName;
              uploadInfo.expressCorp_Id = body.expressCorp_Id;
              uploadInfo.expressCorpType = body.expressCorpType;
              uploadInfo.storage_Id = storage_Id;
              uploadInfo.storageName = storageName;
              uploadInfo.expressCorpName = body.expressCorpName;
              uploadInfo.userProduct_Id = userInfo.userProduct_Id;
              uploadInfo.userProductCode = userInfo.userProductCode;
              uploadInfo.userProductAlias = userInfo.userProductAlias;
              uploadInfo.orderStatus = "待录入";
 
              uploadInfo.consignorName = conInfo.consignorName;
              uploadInfo.consignor_Id = conInfo.consignor_Id;
              uploadInfo.consignorCode = conInfo.consignorCode;
 
              uploadInfo.createDate = new Date();
              uploadInfo.creator = userInfo.userTrueName;
 
              await this.dbWrite.insert(TMSWayBillUpload, uploadInfo);
              errorMsg += "<font color='blue'>运单号" + wayBillCode + "在面单上传成功;</font><br/>";
            }
          }
        } else {
          errorMsg += "<font color='red'>运单号" + wayBillCode + receiveInfo.collectStatus + "不允许上传面单;</font><br/>";
        }
        //#endregion
      }
      errorMsg += "<font color='blue'>上传成功面单合计" + uploadCount + "单;</font><br/>";
 
      this.info.result = true;
      this.info.msg = errorMsg;
      ctx.body = this.info;
      return;
    } catch (ex) {
      let msg = "<font color='red'>出现异常:" + ex.message + "</font><br/>";
      this.info.result = false;
      this.info.msg = msg;
      ctx.body = this.info;
      return;
    }
  }
  //#endregion
 
  //#region 面单上传统计
  /**
   * 面单上传统计
   */
  @Post()
  public async getSumCount() {
    let { ctx } = this;
    try {
      let beingSql = "SELECT COUNT(1) as cnt FROM dbo.TMS_WayBillUpload WHERE orderStatus='待录入'";
      let endSql = "SELECT COUNT(1) as cnt FROM dbo.TMS_WayBillUpload WHERE orderStatus='已录入'";
      let beginNum = (await this.dbRead.query(beingSql))[0].cnt;
      let endNum = (await this.dbRead.query(endSql))[0].cnt;
      let dataInfo = {
        beginNum: beginNum,
        endNum: endNum
      };
      this.info.result = true;
      this.info.data = dataInfo;
      ctx.body = this.info;
    } catch (ex) {
      let msg = "异常错误信息:" + ex.message;
      this.info.result = false;
      this.info.msg = msg;
      ctx.body = this.info;
    }
  }
  //#endregion
 
  //#region 根据面单号获取面单信息
  /**
   * 根据面单号获取面单信息
   */
  @Post()
  public async getWayBillUploadInfo() {
    let { ctx } = this;
    let body = ctx.request.body;
    let userInfo = await ctx.helper.userInfo();
    try {
      let wayBilUploadInfo = new TMSWayBillUpload();
      //如果运单号为空自动寻找最早一天待录入的单子
      if (!body.wayBillCode) {
        wayBilUploadInfo = await this.dbRead
          .createQueryBuilder(TMSWayBillUpload, "t")
          .where("userProduct_Id=:userProduct_Id and orderStatus='待录入'", {
            userProduct_Id: userInfo.userProduct_Id
          })
          .orderBy("NEWID()")
          .getOne();
        if (!wayBilUploadInfo) {
          this.info.msg = "已经没有待录入的面单上传数据了。";
          this.info.result = false;
          ctx.body = this.info;
          return;
        }
 
        //#region 判断是否退货
        let wayReceiveInfo = await this.dbRead.findOne(TMSWayBillReceive, {
          wayBillCode: wayBilUploadInfo.wayBillCode
        });
        if (wayReceiveInfo != null && wayReceiveInfo.collectStatus == "已退货") {
          this.info.msg = "当前单子已退货,请重新获取一下";
          this.info.result = false;
          await this.dbWrite.update(TMSWayBillUpload, wayBilUploadInfo.wayBillUpload_Id, {
            receiveDate: new Date(),
            orderStatus: "已退货"
          });
 
          ctx.body = this.info;
          return;
        }
        //#endregion
 
        await this.dbWrite.update(TMSWayBillUpload, wayBilUploadInfo.wayBillUpload_Id, {
          receiveDate: new Date(),
          orderStatus: "正在录入",
          recoder: userInfo.userTrueName
        });
      } else {
        wayBilUploadInfo = await this.dbRead.findOne(TMSWayBillUpload, {
          wayBillCode: body.wayBillCode,
          userProduct_Id: userInfo.userProduct_Id
        });
 
        if (!wayBilUploadInfo) {
          this.info.msg = "未找到该运单号的面单上传数据。";
          this.info.result = false;
          ctx.body = this.info;
          return;
        } else if (body.type != "edit" && wayBilUploadInfo.orderStatus != "待录入") {
          this.info.msg = "该运单号不是待录入状态,不能重复录入";
          this.info.result = false;
          ctx.body = this.info;
          return;
        }
 
        if (body.type != "edit") {
          await this.dbWrite.update(TMSWayBillUpload, wayBilUploadInfo.wayBillUpload_Id, {
            receiveDate: new Date(),
            orderStatus: "正在录入",
            recoder: userInfo.userTrueName
          });
        }
      }
 
      let wayBillTrackingList = await this.dbRead.find(TMSWayBillTracking, {
        wayBillCode: wayBilUploadInfo.wayBillCode,
        userProduct_Id: userInfo.userProduct_Id
      });
 
      let wayBillUploadData = {
        wayBilUploadInfo: wayBilUploadInfo,
        wayBillTrackingList: wayBillTrackingList,
        wayBillInfo: null
      };
 
      // 编辑信息获得运单信息
      if (body.type == "edit") {
        let wayBillInfo = await this.dbRead.findOne(TMSWayBill, {
          wayBillCode: wayBilUploadInfo.wayBillCode
        });
        let tmsWayBillList = await this.dbRead.find(TMSWayBillList, {
          wayBill_Id: wayBillInfo.wayBill_Id
        });
        wayBillInfo.tmsWayBillList = tmsWayBillList;
        wayBillUploadData.wayBillInfo = wayBillInfo;
      }
 
      this.info.data = wayBillUploadData;
      this.info.result = true;
      ctx.body = this.info;
    } catch (ex) {
      let msg = "异常错误信息:" + ex.message;
      this.info.result = false;
      this.info.msg = msg;
      ctx.body = this.info;
    }
  }
  //#endregion
 
  //#region 面单录入保存
  /**
   * 面单录入保存
   */
  @Post()
  public async submitWayBillInfo() {
    let { ctx } = this;
    let body = ctx.request.body;
    let userInfo = await ctx.helper.userInfo();
    ctx.logger.info("TMS运单录入数据:" + JSON.stringify(body));
    let _wayBillCode = body.wayBillUploadInfo.wayBillCode;
    // 保存到mongodb
    try {
      let db = this.app.mongodb;
      let collection = db.collection("tmsWayBill");
      let data = Object.assign({ createDate: moment(new Date()).format("YYYY-MM-DD HH:mm:ss") }, body);
      await collection.insert(data);
    } catch (error) {
      ctx.logger.info("tmsWayBill将数据保存至MongoDB错误:" + error.message);
    }
 
    try {
      //#region 校验
      let wayBillInfo: TMSWayBill = null;
      if (body.wayBillInfo.wayBill_Id > 0) {
        // 编辑数据
        wayBillInfo = await this.dbRead.findOne(TMSWayBill, body.wayBillInfo.wayBill_Id);
      } else {
        wayBillInfo = await this.dbRead.findOne(TMSWayBill, {
          wayBillCode: body.wayBillUploadInfo.wayBillCode,
          userProduct_Id: userInfo.userProduct_Id
        });
 
        //检验运单号是否重复
        if (wayBillInfo != null) {
          this.info.result = false;
          this.info.msg = "已经存在该运单号。";
 
          let _wayUploadInfo = await this.dbRead.findOne(TMSWayBillUpload, {
            wayBillCode: wayBillInfo.wayBillCode
          });
          if (_wayUploadInfo != null) {
            _wayUploadInfo.orderStatus = "已录入";
            // 领取人为空时,补上当前人员
            if (!_wayUploadInfo.recoder) {
              _wayUploadInfo.recoder = userInfo.userTrueName;
              _wayUploadInfo.receiveDate = new Date();
            }
            await this.dbWrite.save(_wayUploadInfo);
          }
 
          ctx.body = this.info;
          return;
        }
        wayBillInfo = new TMSWayBill();
      }
      if (!body.wayBillInfo.grossWeight || body.wayBillInfo.grossWeight <= 0) {
        this.info.result = false;
        this.info.msg = "重量不能为空。";
        ctx.body = this.info;
        return;
      }
      // 验证明细
      if (body.state != "录入异常") {
        let _billInfo = body.wayBillInfo;
        if (body.wayBillDetails.length <= 0) {
          this.info.result = false;
          this.info.msg = "明细不能为空。";
          ctx.body = this.info;
          return;
        }
        let addr1 = _billInfo.provinceName + _billInfo.cityName + _billInfo.regionName;
        if (_billInfo.consigneeAddress.indexOf(addr1) != 0) {
          this.info.result = false;
          this.info.msg = "详细地址开头省市区不全。";
          ctx.body = this.info;
          return;
        }
        // 验证省市是否一致
        let cityCount = await this.dbRead
          .createQueryBuilder(BaseCity, "C")
          .select("city_Id")
          .where(
            `C.cityName=:cityName
                            AND C.parentId=(SELECT TOP 1 P.city_Id FROM dbo.Base_City P WHERE P.cityName=:provinceName AND P.parentId=0)`,
            {
              cityName: _billInfo.cityName,
              provinceName: _billInfo.provinceName
            }
          )
          .getCount();
 
        if (!cityCount) {
          this.info.result = false;
          this.info.msg = "省市不匹配,无法保存。";
          ctx.body = this.info;
          return;
        }
 
        if (!_billInfo.consigneeName) {
          this.info.result = false;
          this.info.msg = "收货人姓名不能为空";
          ctx.body = this.info;
          return;
        }
        if (!_billInfo.consigneeMobile) {
          this.info.result = false;
          this.info.msg = "收货人手机号不能为空";
          ctx.body = this.info;
          return;
        }
        if (!_billInfo.provinceName || !_billInfo.cityName || !_billInfo.regionName || !_billInfo.consigneeAddress) {
          this.info.result = false;
          this.info.msg = "收货人省市区、详细地址不能为空";
          ctx.body = this.info;
          return;
        }
        if ((_billInfo.grossWeight || 0) <= 0) {
          this.info.result = false;
          this.info.msg = "包裹毛重不能小于等于0";
          ctx.body = this.info;
          return;
        }
        for (let item of body.wayBillDetails) {
          if (!item.productCode) {
            this.info.result = false;
            this.info.msg = "物料编号不能为空。";
            ctx.body = this.info;
            return;
          }
          if (!item.productName) {
            this.info.result = false;
            this.info.msg = "物料名称不能为空";
            ctx.body = this.info;
            return;
          }
          if (!item.productModel) {
            this.info.result = false;
            this.info.msg = "物料条码不能为空";
            ctx.body = this.info;
            return;
          }
          if (!item.quantityOrder || item.quantityOrder <= 0) {
            this.info.result = false;
            this.info.msg = "物料数量不能小于";
            ctx.body = this.info;
            return;
          }
        }
      }
      //#endregion
 
      let wayReceiveInfo = await this.dbRead.findOne(TMSWayBillReceive, {
        wayBillCode: body.wayBillUploadInfo.wayBillCode
      });
 
      // 获得计划格口
      let planDropOffPort = "";
      let regionInfo = await this.dbRead.findOne(TmsGoodsRegion, {
        portName: body.wayBillUploadInfo.portName
      });
      if (regionInfo && regionInfo.regionName) {
        planDropOffPort = regionInfo.regionName.replace(/#/gi, "");
      }
      //#region 主表添加、更新
      wayBillInfo = new TMSWayBill();
      wayBillInfo.consignorName = body.wayBillUploadInfo.consignorName;
      wayBillInfo.consignorCode = body.wayBillUploadInfo.consignorCode;
      wayBillInfo.consignor_Id = body.wayBillUploadInfo.consignor_Id;
      wayBillInfo.wayBillCode = body.wayBillUploadInfo.wayBillCode;
      wayBillInfo.consigneeName = body.wayBillInfo.consigneeName;
      wayBillInfo.provinceName = body.wayBillInfo.provinceName;
      wayBillInfo.province_Id = body.wayBillInfo.province_Id;
      wayBillInfo.cityName = body.wayBillInfo.cityName;
      wayBillInfo.city_Id = body.wayBillInfo.city_Id;
      wayBillInfo.regionName = body.wayBillInfo.regionName;
      wayBillInfo.region_Id = body.wayBillInfo.region_Id;
      wayBillInfo.street = body.wayBillInfo.street;
      wayBillInfo.consigneeAddress = body.wayBillInfo.consigneeAddress;
      wayBillInfo.consigneePostCode = body.wayBillInfo.consigneePostCode;
      wayBillInfo.consigneeMobile = body.wayBillInfo.consigneeMobile;
      wayBillInfo.consigneeIdcard = body.wayBillInfo.consigneeIdcard;
      wayBillInfo.weight = body.wayBillInfo.weight;
      wayBillInfo.grossWeight = body.wayBillInfo.grossWeight;
      wayBillInfo.unit = body.wayBillInfo.unit;
      wayBillInfo.isStoreMate = 0;
      wayBillInfo.orderType = "直邮";
      wayBillInfo.expressCorp_Id = body.wayBillUploadInfo.expressCorp_Id;
      wayBillInfo.expressCorpName = body.wayBillUploadInfo.expressCorpName;
      wayBillInfo.port_Id = body.wayBillUploadInfo.port_Id;
      wayBillInfo.portName = body.wayBillUploadInfo.portName;
      wayBillInfo.storage_Id = body.wayBillUploadInfo.storage_Id;
      wayBillInfo.storageName = body.wayBillUploadInfo.storageName;
      wayBillInfo.userProduct_Id = userInfo.userProduct_Id;
      wayBillInfo.userProductCode = userInfo.userProductCode;
      wayBillInfo.userProductAlias = userInfo.userProductAlias;
      wayBillInfo.orderStatus = "审核成功";
      wayBillInfo.collectStatus = wayReceiveInfo.collectStatus;
      wayBillInfo.makeWay = "TMS录入";
      wayBillInfo.expressCorpType = body.wayBillUploadInfo.expressCorpType;
      wayBillInfo.planDropOffPort = planDropOffPort;
      wayBillInfo.printStatus = "已打印";
      wayBillInfo.abnormalReason = body.Reason;
      wayBillInfo.createID = userInfo.user_Id;
      wayBillInfo.creator = userInfo.userTrueName;
 
      // 揽收身份证不为空,以揽收为准
      if (wayReceiveInfo.consigneeIdcard) {
        wayBillInfo.consigneeIdcard = wayReceiveInfo.consigneeIdcard;
        wayBillInfo.consigneeName = wayReceiveInfo.consigneeName;
      }
 
      //#region 更新仓库信息
      let storage = await this.dbRead.findOne(BaseStorage, {
        storage_Id: body.wayBillUploadInfo.storage_Id
      });
      if (storage != null) {
        wayBillInfo.billingName = storage.shipperCompanyName;
        wayBillInfo.billingMobile = storage.shipperTelephone;
        wayBillInfo.billingAddress = storage.shipperAddress;
      }
      //#endregion
 
      if (body.wayBillInfo.wayBill_Id > 0) {
        wayBillInfo.wayBill_Id = body.wayBillInfo.wayBill_Id;
      }
      if (body.state == "录入异常") {
        wayBillInfo.orderStatus = "录入异常";
      }
      if (body.wayBillInfo.wayBill_Id > 0) {
        // 更新
        await this.dbWrite.save(wayBillInfo);
      } else {
        ctx.logger.info(_wayBillCode + " 新增开始");
        // 新增
        wayBillInfo.createDate = new Date();
        await this.dbWrite.save(wayBillInfo);
        ctx.logger.info(_wayBillCode + " 新增结束");
        ctx.logger.info(_wayBillCode + " 新增查询开始");
        let _wayBillInfo = await this.dbWrite.findOne(TMSWayBill, {
          wayBillCode: wayBillInfo.wayBillCode
        });
        let wayBill_Id = _wayBillInfo.wayBill_Id;
        if (wayBill_Id == null) {
          ctx.logger.info(_wayBillCode + " 查询结果是空的");
        } else {
          if (wayBillInfo.wayBill_Id != wayBill_Id) {
            ctx.logger.info(wayBillInfo.wayBillCode + " 保存ID错乱" + wayBillInfo.wayBill_Id + ", 实际为:" + wayBill_Id);
            wayBillInfo.wayBill_Id = wayBill_Id;
          } else {
            ctx.logger.info(wayBillInfo.wayBillCode + " 保存ID" + wayBillInfo.wayBill_Id + ", 实际为:" + wayBill_Id);
            wayBillInfo.wayBill_Id = wayBill_Id;
          }
        }
        ctx.logger.info(_wayBillCode + " 新增查询结束");
      }
      ctx.logger.info("TMS运单录入数据-保存后:" + JSON.stringify(wayBillInfo));
      //#endregion
 
      //#region 录入异常
      if (body.state == "录入异常") {
        ctx.logger.info(_wayBillCode + " 录入异常开始");
        //添加异常记录
        let abnormalInfo = {
          wayBillCode: wayBillInfo.wayBillCode,
          wayBill_Id: wayBillInfo.wayBill_Id,
          AbnormalStatus: body.state,
          Abnormal: body.Reason,
          AbnormalDate: new Date()
        };
        ctx.logger.info(_wayBillCode + " 录入异常日志");
        await ctx.service.tms.wayBillHelper.setStatusHistory(wayBillInfo, "录入异常", "录入异常");
        await this.dbWrite.insert(TMSWayBillAbnormal, abnormalInfo);
        ctx.logger.info(_wayBillCode + " 录入异常结束");
      }
      //#endregion
 
      //#region 明细处理
      // 清空明细重新添加
      ctx.logger.info(_wayBillCode + " 明细删除开始");
      await this.dbWrite.delete(TMSWayBillList, {
        wayBill_Id: wayBillInfo.wayBill_Id
      });
      ctx.logger.info(_wayBillCode + " 明细删除结束");
 
      let totalQuantityOrder = 0; // 数量
      let totalMoney = 0; //总金额
      let totalweight = 0; //包裹净重
      ctx.logger.info(_wayBillCode + " 明细开始:个数=" + body.wayBillDetails.length);
      for (let wayBillDetailsInfo of body.wayBillDetails) {
        ctx.logger.info(_wayBillCode + " 明细开始:" + wayBillDetailsInfo.productName);
        //添加到TMSWayBillList表
        let detailInfo = new TMSWayBillList();
        detailInfo.wayBill_Id = wayBillInfo.wayBill_Id;
        detailInfo.product_Id = wayBillDetailsInfo.product_Id;
        detailInfo.productName = wayBillDetailsInfo.productName;
        detailInfo.productCode = wayBillDetailsInfo.productCode;
        detailInfo.productModel = wayBillDetailsInfo.productModel;
        detailInfo.productSpec = wayBillDetailsInfo.productSpec;
        detailInfo.quantityOrder = wayBillDetailsInfo.quantityOrder;
        detailInfo.smallUnit = wayBillDetailsInfo.smallUnit;
        detailInfo.salePrice = wayBillDetailsInfo.salePrice || 0;
        detailInfo.rowTotal = wayBillDetailsInfo.quantityOrder * (wayBillDetailsInfo.salePrice != null ? wayBillDetailsInfo.salePrice : 0);
        detailInfo.weight = wayBillDetailsInfo.weight;
        detailInfo.grossWeight = wayBillDetailsInfo.grossWeight;
 
        totalMoney += detailInfo.rowTotal;
        totalQuantityOrder += detailInfo.quantityOrder;
        totalweight += detailInfo.weight;
 
        await this.dbWrite.save(detailInfo);
        ctx.logger.info(_wayBillCode + " 明细开始:结束" + wayBillDetailsInfo.productName);
      }
      //#endregion
 
      //#region 合计处理
      ctx.logger.info(_wayBillCode + " 合计开始");
      // 更新合计金额合计数量
      await this.dbWrite.update(TMSWayBill, wayBillInfo.wayBill_Id, {
        totalQuantityOrder: totalQuantityOrder,
        grandTotal: totalMoney,
        weight: totalweight
      });
      //修改面单上传状态为已录入
      let wayBillUploadInfo = await this.dbRead.findOne(TMSWayBillUpload, {
        userProduct_Id: userInfo.userProduct_Id,
        wayBillCode: body.wayBillUploadInfo.wayBillCode
      });
      wayBillUploadInfo.orderStatus = "已录入";
      await this.dbWrite.update(TMSWayBillUpload, wayBillUploadInfo.wayBillUpload_Id, {
        orderStatus: "已录入"
      });
      ctx.logger.info(_wayBillCode + " 合计结束");
      //#endregion
 
      // 验证录入明细是否一致
      let detailCount = await this.dbRead.createQueryBuilder(TMSWayBillList, "t").whereInIds([wayBillInfo.wayBill_Id]).getCount();
      if (body.wayBillDetails.length != detailCount) {
        ctx.logger.info(`${wayBillInfo.wayBillCode} TMS运单录入数据:明细不一致,提交数量${detailCount},明细数量:${body.wayBillDetails.length}`);
      }
 
      //添加运单追踪记录
      if (body.state != "录入异常") {
        await ctx.service.tms.wayBillHelper.setStatusHistory(wayBillInfo, "运单录入", "审核成功", "订单创建成功");
      }
      this.info.msg = wayBillInfo.orderStatus;
      this.info.result = true;
      ctx.body = this.info;
    } catch (ex) {
      let msg = "异常错误信息:" + ex.message;
      this.info.result = false;
      this.info.msg = msg;
      ctx.logger.info(msg);
      ctx.body = this.info;
    }
  }
  //#endregion
 
  //#region 获得物料信息列表 GetProductList
  /**
   * 获得物料信息列表
   */
  @Post()
  public async getProductList() {
    let { ctx } = this;
    let body = ctx.request.body;
    let redis = ctx.app.redis.clients.get("product");
    let key: string = body.key;
    if (!key) {
      this.info.result = false;
      this.info.msg = "没有查询的数据!";
    }
    key = key.toLowerCase();
    let keys = await redis.keys(`*${key}*`);
    let dataList: Array<any> = [];
    keys = keys.filter((item, index) => item && index < 100);
 
    for (let key of keys) {
      let val = await redis.get(key);
      dataList.push(JSON.parse(val));
    }
    dataList = dataList
      .sort((a, b) => {
        return a.clickCount < b.clickCount ? 1 : -1;
      })
      .filter((item, index) => item && index < 50);
 
    if (dataList.length > 0) {
      this.info.result = true;
      this.info.data = dataList;
    } else {
      this.info.result = false;
      this.info.msg = "没有查询的数据!";
    }
 
    ctx.body = this.info;
  }
  //#endregion
 
  //#region GetWayBillInfo 获取运单信息
  @Post()
  public async getWayBillInfo() {
    let { ctx } = this;
    let body = ctx.request.body;
    this.info.result = true;
    let wayBillInfo = await this.dbRead.findOne(TMSWayBill, {
      wayBillCode: body.wayBillCode
    });
    if (wayBillInfo) {
      wayBillInfo.tmsWayBillList = await this.dbRead.find(TMSWayBillList, {
        wayBill_Id: wayBillInfo.wayBill_Id
      });
      this.info.data = wayBillInfo;
    }
 
    ctx.body = this.info;
  }
  //#endregion
 
  //#region getPostCode
  @Post()
  public async getPostCode() {
    let { ctx } = this;
    let body = ctx.request.body;
    try {
      //根据省市区详细地址获取邮编
      let consigneePostCode = "100000";
      let postCodeList = await this.dbRead.find(BasePostCode, {
        province: body.provinceName,
        city: body.cityName,
        district: body.regionName
      });
      if (postCodeList.length > 0) {
        for (let item of postCodeList) {
          let address = item.address;
          if (address.indexOf(body.consigneeAddress) >= 0) {
            consigneePostCode = item.postNumber;
          }
        }
        if (consigneePostCode == "100000") {
          //根据省市区查询邮政编码
          let dataInfo = await this.dbRead.findOne(BasePostCode, {
            province: body.provinceName,
            city: body.cityName,
            district: body.regionName
          });
          if (dataInfo) {
            consigneePostCode = dataInfo.postNumber;
          }
        }
      } else {
        //只根据省市查询邮政编码
        let dataInfo = await this.dbRead.findOne(BasePostCode, {
          province: body.provinceName,
          city: body.cityName
        });
        if (dataInfo) {
          consigneePostCode = dataInfo.postNumber;
        }
      }
      this.info.result = true;
      this.info.data = {
        consigneePostCode: consigneePostCode
      };
      ctx.body = this.info;
    } catch (ex) {
      this.info.result = false;
      this.info.msg = ex.message;
 
      ctx.body = this.info;
    }
  }
  //#endregion
 
  //#region GetWayBillInfo 根据手机号获取最近的收货人信息
  @Post()
  public async getConsigneeInfo() {
    let { ctx } = this;
    let body = ctx.request.body;
    if (!body.consigneeMobile) {
      this.info.result = false;
      this.info.msg = "手机号不能为空!";
 
      ctx.body = this.info;
      return;
    }
 
    let wayBillInfo = await this.dbRead.findOne(TMSWayBill, {
      where: {
        consigneeMobile: body.consigneeMobile
      },
      order: { wayBill_Id: "DESC" }
    });
    if (wayBillInfo != null) {
      this.info.result = true;
      wayBillInfo.consigneeIdcard = null; // 不带出身份证
      this.info.data = wayBillInfo;
    } else {
      this.info.result = false;
      this.info.msg = null;
    }
 
    ctx.body = this.info;
  }
  //#endregion
}