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
import { default as BaseController } from "../baseController";
import { Post } from "egg-shell-decorators";
import { StorageAllocateApply } from "../../entity/storage/allocate/storageAllocateApply";
import * as sql from "mssql";
import * as XLSX from "xlsx";
import * as path from "path";
import { StorageAllocateApplyList } from "../../entity/storage/allocate/storageAllocateApplyList";
export default class AllocateApplyController extends BaseController {
  //#region auditing
  @Post()
  public async auditing() {
    let { ctx } = this;
    let body = ctx.request.body;
    let userInfo = await ctx.helper.userInfo();
 
    try {
      let result = await this.dbWrite.update(StorageAllocateApply, body.allocateApply_Id, {
        statusID: 2,
        statusText: "确认调拨",
        auditor: userInfo.userTrueName,
        auditing: body.auditing,
        auditDate: new Date()
      });
      if (result) {
        this.info.result = true;
        this.info.msg = "审核成功!";
      } else {
        this.info.result = false;
        this.info.msg = "审核失败!";
      }
    } catch (error) {
      this.info.result = false;
      this.info.msg = "审核失败:" + error.message;
    }
    ctx.body = this.info;
  }
  //#endregion
 
  //#region Stop
  @Post()
  public async stop() {
    let { ctx } = this;
    let body = ctx.request.body;
    try {
      let sql = `
            delete from Base_ProductPlaceHolder where ClassName='调拨出库' And MainID=@0;
      Update Storage_AllocateApply Set StatusID=5, StatusText='终止', SortingStatus=1, SortingDate=null Where AllocateApply_Id=@0`;
      await this.dbWrite.query(sql, [body.idValue]);
      this.info.result = true;
      this.info.msg = "终止成功!";
    } catch (error) {
      this.info.result = false;
      this.info.msg = "终止失败:" + error.message;
    }
    ctx.body = this.info;
  }
  //#endregion
 
  //#region Open
  @Post()
  public async open() {
    let { ctx } = this;
    let body = ctx.request.body;
    try {
      let reVal = await this.dbWrite.update(StorageAllocateApply, body.idValue, {
        statusID: 1,
        statusText: "新建"
      });
      this.info.data = reVal;
      this.info.result = true;
      this.info.msg = "开启成功";
    } catch (error) {
      this.info.result = false;
      this.info.msg = "开启失败!" + error.message;
    }
 
    ctx.body = this.info;
  }
  //#endregion
  //#region 开始分拣
  @Post()
  public async startSorting() {
    let { ctx } = this;
    let body = ctx.request.body;
    let userInfo = await ctx.helper.userInfo();
    if (!body.selectIDs) {
      this.info.result = false;
      this.info.msg = "数据不存在";
      ctx.body = this.info;
      return;
    }
    try {
      // 执行分拣
      const connection: any = await this.dbWrite.connection;
      let request = new sql.Request(connection.driver.master);
      request.input("allocateApply_Id", body.selectIDs);
      request.input("user_Id", userInfo.user_Id);
      request.output("outMsg", sql.NVarChar(2000));
      let result = await request.execute("sp_Storage_AllocateApply_Sorting");
      let outMsg = result.output.outMsg;
      //在outMsg中没有值时则返回true "分练成功"
      if (outMsg !== null && outMsg) {
        this.info.msg = outMsg;
        this.info.result = false;
        ctx.body = this.info;
        return;
      }
      this.info.msg = "分拣完成";
      this.info.result = true;
    } catch (ex) {
      this.info.result = false;
      this.info.msg = "错误信息:" + ex.message;
    }
    ctx.body = this.info;
  }
  //#endregion
 
  //#region 调拨申请明细导出
  /// <summary>
  /// 调拨申请明细导出
  /// </summary>
  /// <param name="body"></param>
  /// <returns></returns>
  @Post()
  public async exportList() {
    let { ctx } = this;
    let body = ctx.request.body;
 
    try {
      let sql = "";
      sql = `SELECT 
ProductCode AS '物料编号',ProductName AS '物料名称',ProductModel AS '条形码',BatchNumber AS '批次号',ProductSpec AS '物料规格',
Quantity AS '调入数量',PurchasePrice AS '成本价',PurchaseMoney AS '成本额',LackStorage AS '缺货数量',SmallUnit AS '小单位',
BigUnit AS '大单位',Remark AS '备注'
FROM Storage_AllocateApplyList 
WHERE AllocateApplyList_Id IN (select col from dbo.split(@0, ','))`;
 
      let transferList: Array<any> = await this.dbRead.query(sql, [body.ids]);
 
      let root = path.resolve();
      let url = "/download/调拨申请明细数据.xlsx";
      let fileName = root + url.replace(/\//g, path.sep);
      let pathToCreate = fileName.substring(0, fileName.lastIndexOf(path.sep));
      ctx.helper.mkdir(pathToCreate);
 
      // wayBillList = wayBillList.splice(0, 0, {
      //   "分运单号":"xxxxxx"
      // }, {"申报类型": "xxxxsssss"}, {});
      let jsonWorkSheet = XLSX.utils.json_to_sheet(transferList);
      // 构造workBook
      let workBook = {
        SheetNames: ["数据"],
        Sheets: {
          数据: jsonWorkSheet
        }
      };
      XLSX.writeFile(workBook, fileName);
 
      this.info.result = true;
      this.info.data = {
        url: url
      };
      this.info.msg = "导出成功!";
    } catch (ex) {
      this.info.result = false;
      this.info.msg = "错误信息:" + ex.message;
    }
    ctx.body = this.info;
  }
  //#endregion
 
  //#region 调拨申请导入Excel
  /// <summary>
  /// 调拨申请导入Excel
  /// </summary>
  /// <returns></returns>
  @Post()
  public async importExel() {
    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) {
    //   redis.rpush(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) {
        redis.rpush(body.key, "没有可导入的数据");
        return;
      }
 
      let msg = "";
      let i = 0;
      for (let row of dataList) {
        i++;
        let quantity = row["调入数量"];
        let product_Id = row["物料ID"];
        let productCode = row["物料编号"];
        let productName = row["物料名称"];
        let productModel = row["条形码"];
        // let productCode = row["物料编号"];
        if (!quantity) {
          msg += `${i}、调入数量不能为空`;
          redis.rpush(body.key, msg);
          this.info.result = false;
        }
        if (!product_Id) {
          msg += `${i}、物料ID不能为空`;
          redis.rpush(body.key, msg);
          this.info.result = false;
        }
        if (!productCode) {
          msg += `${i}、物料编号不能为空`;
          redis.rpush(body.key, msg);
          this.info.result = false;
        }
        if (!productName) {
          msg += `${i}、物料名称不能为空`;
          redis.rpush(body.key, msg);
          this.info.result = false;
        }
        if (!productModel) {
          msg += `${i}、条形码不能为空`;
          redis.rpush(body.key, msg);
          this.info.result = false;
        }
        // #endregion
 
        if (msg) {
          this.info.result = false;
          this.info.msg = msg;
        } else {
          await this.dbWrite.save(StorageAllocateApplyList, {
            allocateApply_Id: body.allocateApply_Id,
            createID: userInfo.user_Id,
            creator: userInfo.userTrueName,
            quantity: row["调入数量"],
            product_Id: row["物料ID"],
            productCode: row["物料编号"],
            productName: row["物料名称"],
            productModel: row["条形码"],
            productSpec: row["物料规格"],
            purchasePrice: row["成本价"],
            purchaseMoney: row["成本额"],
            lackStorage: row["缺货数量"],
            smallUnit: row["小单位"],
            bigUnit: row["大单位"],
            remark: row["备注"]
          });
 
          this.info.result = true;
          this.info.msg = "导入成功";
        }
      }
    } catch (ex) {
      this.info.msg = "出现异常:" + ex.message;
      this.info.result = false;
    }
 
    ctx.body = this.info;
  }
 
  // #endregion
}