kyy
2025-12-04 aa6c2ce07e6a8a99d3d861ce5fae8fa76f62d36f
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
namespace NewPdaSqlServer.service.@base
{
    using NewPdaSqlServer.Dto.service;
    using NewPdaSqlServer.entity;
    using SqlSugar;
    using System;
    using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
    using System.Data;
    using NewPdaSqlServer.DB;
 
    using System.Data.SqlClient;
    using Microsoft.EntityFrameworkCore.Metadata.Internal;
 
 
    public class MesPrintMangeer : Repository<dynamic>
    {
        public dynamic getPrintInfo(dynamic query)
        {
 
            // 使用参数化查询防止SQL注入
            var sqlParams = new List<SugarParameter> { new("@userAccount", query.userName) };
 
            var sql1 = @"SELECT TOP 1 ip,port fROM print_info A
                           left join SYS_USER_BIND B on A.guid = B.aboutGuid
                           left join SYS_USER C ON C.GUID = B.userGuid
                          WHERE C.ACCOUNT = @userAccount AND B.fType = '打印机'";
 
            var printInfo = Db.Ado.SqlQuery<dynamic>(sql1, sqlParams);
 
            if (printInfo.Count < 1 ) throw new Exception("当前用户未绑定打印机,请维护后使用拆分功能!");
 
            return printInfo;
        }
 
 
        public dynamic getCfInfo(dynamic query) // 使用具体类型替代dynamic
        {
            // 参数校验
            if (string.IsNullOrEmpty(query?.cfBarcode))
                throw new ArgumentException("拆分条码不能为空");
            if (string.IsNullOrEmpty(query?.barcode))
                throw new ArgumentException("原始条码不能为空");
 
            // 使用强类型参数
            var sqlParams = new List<SugarParameter> { 
                new("@cfBar", query.cfBarcode.Trim()),
                new("@oldBar", query.barcode.Trim()) 
            };
 
            var sql = @"SELECT TOP 1 C.ITEM_NO,C.item_name,C.item_model,B.OLDQTY as QUANTITY,B.CREATE_DATE, '拆分条码' AS BarType,A.ITEM_BARCODE,GETDATE() as print_date
            FROM MES_INV_ITEM_STOCKS A
            LEFT JOIN MES_INV_ITEM_BARCODES B ON A.ITEM_BARCODE = B.ITEM_BARCODE
            LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
            WHERE A.ITEM_BARCODE = @cfBar
            
            UNION ALL
            
            SELECT TOP 1 C.ITEM_NO,C.item_name,C.item_model,A.QUANTITY as QUANTITY,B.CREATE_DATE, '原始条码' AS BarType,A.ITEM_BARCODE,GETDATE() as print_date
            FROM MES_INV_ITEM_STOCKS A
            LEFT JOIN MES_INV_ITEM_BARCODES B ON A.ITEM_BARCODE = B.ITEM_BARCODE
            LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
            WHERE A.ITEM_BARCODE = @oldBar";
 
            var mergedData = Db.Ado.SqlQuery<dynamic>(sql, sqlParams);
 
            if (mergedData.Count < 2) throw new Exception("条码信息存在异常,请联系管理员!");
 
            return mergedData;
        }
 
        // // 现场收料展示列表
        // public class PrintBarInfo
        // {
        //     public List<dynamic> cfBarInfo { get; set; }
        //     public List<dynamic> oldBarInfo { get; set; }
        // }
 
        public dynamic getCfBeforeInfo(dynamic query) // 使用具体类型替代dynamic
        {
            // 参数校验
            if (string.IsNullOrEmpty(query?.cfBarcode))
                throw new ArgumentException("拆分条码不能为空");
            if (string.IsNullOrEmpty(query?.barcode))
                throw new ArgumentException("原始条码不能为空");
 
            // 使用强类型参数
            var sqlParams = new List<SugarParameter> {
                new("@cfBar", query.cfBarcode.Trim()),
                new("@oldBar", query.barcode.Trim())
            };
 
            var sql = @"SELECT TOP 1 C.ITEM_NO,C.item_name,C.item_model,B.OLDQTY as QUANTITY,B.CREATE_DATE, '拆分条码' AS BarType,B.ITEM_BARCODE,GETDATE() as print_date
            FROM MES_INV_ITEM_BARCODES B
            LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
            WHERE B.ITEM_BARCODE = @cfBar
 
            UNION ALL
 
            SELECT TOP 1 C.ITEM_NO,C.item_name,C.item_model,B.QUANTITY as QUANTITY,B.CREATE_DATE, '原始条码' AS BarType,B.ITEM_BARCODE,GETDATE() as print_date
            FROM  MES_INV_ITEM_BARCODES B
            LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
            WHERE B.ITEM_BARCODE = @oldBar";
 
            var mergedData = Db.Ado.SqlQuery<dynamic>(sql, sqlParams);
 
            if (mergedData.Count < 2) throw new Exception("条码信息存在异常,请联系管理员!");
 
            return mergedData;
        }
        /*-------------------------------2025-10-25 重写拆分条码返回信息新增打印人信息返回----------------------------------*/
 
 
        public dynamic getCfInfo(dynamic query, dynamic unity) // 使用具体类型替代dynamic
        {
            // 参数校验
            if (string.IsNullOrEmpty(query?.cfBarcode))
                throw new ArgumentException("拆分条码不能为空");
            if (string.IsNullOrEmpty(query?.barcode))
                throw new ArgumentException("原始条码不能为空");
 
            var printUser = GetPrinterUserNameByAccount(unity.userName.Trim());
      
            // 使用强类型参数
            var sqlParams = new List<SugarParameter> {
                new("@cfBar", query.cfBarcode.Trim()),
                new("@oldBar", query.barcode.Trim()),
                new("@printBy", printUser)
            };
 
            // 3. 执行SQL查询(通过UNION ALL合并原始条码与拆分后条码的信息)
            var sql = @"SELECT TOP 1 
                    C.ITEM_NO,
                    C.item_name,
                    C.item_model,
                    @printBy AS printBy,
                    B.OLDQTY AS QUANTITY,
                    B.CREATE_DATE,
                    '拆分条码' AS barType,
                    B.ITEM_BARCODE,
                    u.fname AS unit,
                    GETDATE() AS print_date
                FROM MES_INV_ITEM_BARCODES B
                LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
                LEFT JOIN MES_UNIT u ON u.id = C.storeunit 
               WHERE B.ITEM_BARCODE = @cfBar
 
                UNION ALL
 
                SELECT TOP 1 
                    C.ITEM_NO,
                    C.item_name,
                    C.item_model,
                    @printBy AS printBy,
                    B.QUANTITY AS QUANTITY,
                    B.CREATE_DATE,
                    '原始条码' AS barType,
                    B.ITEM_BARCODE,
                    u.fname AS unit,
                    GETDATE() AS print_date
                FROM MES_INV_ITEM_BARCODES B
                LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
                LEFT JOIN MES_UNIT u ON u.id = C.storeunit
                WHERE B.ITEM_BARCODE = @oldBar";
 
            var mergedData = Db.Ado.SqlQuery<dynamic>(sql, sqlParams);
 
            if (mergedData.Count < 2) throw new Exception("条码信息存在异常,请联系管理员!");
 
            return mergedData;
        }
 
 
 
 
 
        /// <summary>
        /// 获取入库前拆分的条码信息(含原始条码与拆分后条码的物料、打印相关数据)
        /// </summary>
        /// <param name="query">拆分结果对象(需包含原始条码barcode、拆分后条码cfBarcode)</param>
        /// <param name="unity">查询参数对象(需包含打印人userName)</param>
        /// <returns>合并后的条码信息列表(原始条码+拆分后条码,共2条数据)</returns>
        /// <exception cref="ArgumentException">参数为空时抛出</exception>
        /// <exception cref="Exception">条码信息异常时抛出</exception>
        public dynamic getCfBeforeInfo(dynamic query, dynamic unity) // 注:建议后续替换为具体实体类型(如BarSplitResult、WarehouseQuery)
        {
            // 1. 参数合法性校验(确保核心条码和打印人信息不为空)
            if (string.IsNullOrEmpty(query?.cfBarcode?.Trim()))
                throw new ArgumentException("拆分后条码不能为空");
 
            if (string.IsNullOrEmpty(query?.barcode?.Trim()))
                throw new ArgumentException("原始条码不能为空");
 
            if (string.IsNullOrEmpty(unity?.userName?.Trim()))
                throw new ArgumentException("打印人(userName)不能为空");
            
             var printUser = GetPrinterUserNameByAccount(unity.userName.Trim());
            // 2. 构建SQL参数(避免SQL注入,统一处理参数空格)
            var sqlParams = new List<SugarParameter>
            {
            new("@cfBar", query.cfBarcode.Trim()),    // 拆分后的新条码
            new("@oldBar", query.barcode.Trim()),    // 拆分前的原始条码
            new("@printBy", printUser)   // 执行打印操作的用户
           };
 
            // 3. 执行SQL查询(通过UNION ALL合并原始条码与拆分后条码的信息)
            var sql = @"SELECT TOP 1 
                    C.ITEM_NO,
                    C.item_name,
                    C.item_model,
                    @printBy AS printBy,
                    B.OLDQTY AS QUANTITY,
                    B.CREATE_DATE,
                    '拆分条码' AS barType,
                    B.ITEM_BARCODE,
                    u.fname AS unit,
                    GETDATE() AS print_date
                FROM MES_INV_ITEM_BARCODES B
                LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
                LEFT JOIN MES_UNIT u ON u.id = C.storeunit 
               WHERE B.ITEM_BARCODE = @cfBar
 
                UNION ALL
 
                SELECT TOP 1 
                    C.ITEM_NO,
                    C.item_name,
                    C.item_model,
                    @printBy AS printBy,
                    B.QUANTITY AS QUANTITY,
                    B.CREATE_DATE,
                    '原始条码' AS barType,
                    B.ITEM_BARCODE,
                    u.fname AS unit,
                    GETDATE() AS print_date
                FROM MES_INV_ITEM_BARCODES B
                LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
                LEFT JOIN MES_UNIT u ON u.id = C.storeunit
                WHERE B.ITEM_BARCODE = @oldBar";
 
            // 4. 执行查询并处理结果
            var mergedData = Db.Ado.SqlQuery<dynamic>(sql, sqlParams);
 
            // 校验结果:需同时获取到原始条码和拆分后条码的信息(共2条数据)
            if (mergedData?.Count != 2)
                throw new Exception("条码信息存在异常(未查询到完整的原始/拆分条码数据),请联系管理员!");
 
            return mergedData;
        }
 
 
 
        /// <summary>
        /// 公共方法:根据用户账号查询对应的打印机用户名
        /// </summary>
        /// <param name="userAccount">用户账号(即原unity.userName)</param>
        /// <param name="userPrinterMainTable">用户-打印机关联表名(默认值可根据实际表名配置)</param>
        /// <returns>匹配的打印机用户名</returns>
        /// <exception cref="ArgumentException">入参为空时抛出</exception>
        /// <exception cref="Exception">未查询到数据或结果为空时抛出</exception>
        public string GetPrinterUserNameByAccount(string userAccount)
        {
            // 1. 入参校验
            if (string.IsNullOrEmpty(userAccount?.Trim()))
                throw new ArgumentException("查询打印机用户的入参【userAccount】不能为空");
 
 
            // 2. 构建参数化查询(防SQL注入)
            var userParams = new List<SugarParameter>
    {
        new("@userAccount", userAccount.Trim())
        
    };
 
            // 3. 动态表名的SQL(适配不同表名场景)
            var userSql = @"SELECT C.USER_NAME FROM SYS_USER C WHERE C.ACCOUNT = @userAccount ";
 
            // 4. 执行查询
            var printUsers = Db.Ado.SqlQuery<dynamic>(userSql, userParams);
            if (printUsers == null || printUsers.Count == 0)
                throw new Exception($"未查询到账号【{userAccount}】对应的打印机用户信息");
 
            // 5. 提取并校验结果(取第一个匹配值,可根据业务调整为多值处理)
            var printUser = printUsers.First()?.USER_NAME?.Trim();
            if (string.IsNullOrEmpty(printUser))
                throw new Exception($"账号【{userAccount}】查询到的打印机用户名为空");
 
            return printUser;
        }
 
    }
}