tum 11 miesięcy temu
rodzic
commit
88f9751339
2 zmienionych plików z 282 dodań i 19 usunięć
  1. BIN
      app/report/coi_templates.xlsx
  2. 282 19
      app/report/views.py

BIN
app/report/coi_templates.xlsx


+ 282 - 19
app/report/views.py

@@ -104,6 +104,13 @@ def hide_con(placeholders, mark_value, hide_rows):
104 104
     else:
105 105
         placeholders[mark_value] = f"0[{hide_rows}]"
106 106
 
107
+def clear_values(n, m):
108
+    placeholders = {}
109
+    for i in range(1, n + 1):
110
+        for j in range(1, m + 1):
111
+            placeholders[f'v{i}_{j}'] = " "
112
+    return placeholders
113
+
107 114
 def generate_hardness_out_values(lot_no):
108 115
     """
109 116
     Generate a dictionary of placeholder values for a given lot_no.
@@ -112,10 +119,15 @@ def generate_hardness_out_values(lot_no):
112 119
     :return: A dictionary with placeholders (e.g., v1_1, v1_2, ...) as keys and their respective values.
113 120
     """
114 121
     # Query the Data model for records matching the given lot_no
115
-    records = Data.objects.filter(lot_no=lot_no).order_by('row_no')
122
+    # records = Data.objects.filter(lot_no=lot_no).order_by('row_no')
123
+    data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no'))
124
+    data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no'))
125
+
126
+    records = list(chain(data_h1, data_h2))
127
+    
116 128
     print(f"records {lot_no} = {records.values()}")
117 129
     # Initialize an empty dictionary to store placeholder values
118
-    placeholders = {}
130
+    placeholders = clear_values(2,5)
119 131
 
120 132
     # Iterate over the records to populate placeholder values
121 133
     for record_idx, record in enumerate(records, start=1):
@@ -129,7 +141,12 @@ def generate_hardness_out_values(lot_no):
129 141
 
130 142
 def generate_hardness_out_in_values(lot_no):
131 143
     # Fetch records from the Data model
132
-    records = Data.objects.filter(lot_no=lot_no).order_by('row_no')
144
+    # records = Data.objects.filter(lot_no=lot_no).order_by('row_no')
145
+    data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no'))
146
+    data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no'))
147
+
148
+    records = list(chain(data_h1, data_h2))
149
+
133 150
     out_data = []
134 151
     in_data = []
135 152
 
@@ -141,7 +158,8 @@ def generate_hardness_out_in_values(lot_no):
141 158
             in_data.append(record)
142 159
 
143 160
     # Prepare placeholders
144
-    placeholders = {}
161
+    # placeholders = {}
162
+    placeholders = clear_values(4,5)
145 163
     for idx, record in enumerate(out_data, start=1):
146 164
         placeholders[f'v{idx}_1'] = record.p1
147 165
         placeholders[f'v{idx}_2'] = record.p2
@@ -165,13 +183,31 @@ def generate_hardness_out_in_values(lot_no):
165 183
     
166 184
     return placeholders
167 185
 
168
-def clear_values(n, m):
169
-    placeholders = {}
170
-    for i in range(1, n + 1):
171
-        for j in range(1, m + 1):
172
-            placeholders[f'v{i}_{j}'] = " "
186
+def generate_hardness_both_size_values(lot_no, ms):
187
+    # Fetch records from the Data model
188
+    # records = Data.objects.filter(lot_no=lot_no).order_by('row_no')
189
+    data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no', 'sub_order'))
190
+    data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no', 'sub_order'))
191
+
192
+    records = list(chain(data_h1, data_h2))
193
+
194
+    out_data = []
195
+    in_data = []
196
+
197
+    placeholders = clear_values(20,5)
198
+    # Separate OUT and IN data
199
+    for idx, record in enumerate(records, start=0):
200
+        if record.sub_order == 1:
201
+            for i,v in enumerate(["p1", "p2", "p3", "avg", "rgrade"],start=1):
202
+                placeholders[f"v{idx*2+1}_{i}"] = getattr(record,v)
203
+        if record.sub_order == 2:
204
+            for i,v in enumerate(["p1", "p2", "p3", "avg", "rgrade"],start=1):
205
+                placeholders[f"v{idx*2+2}_{i}"] = getattr(record,v)
206
+    # Prepare placeholders
207
+    # placeholders = {}
173 208
     return placeholders
174 209
 
210
+
175 211
 # # Example usage:
176 212
 # placeholders_dict = clear_values(6, 3)
177 213
 # print(placeholders_dict)
@@ -185,7 +221,7 @@ def generate_dimension_values(lot_no):
185 221
     manual_size_records = Manualsize.objects.filter(lotno=lot_no)
186 222
 
187 223
     # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
188
-    data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')[:2]
224
+    data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
189 225
 
190 226
     # Prepare placeholders
191 227
 
@@ -229,7 +265,7 @@ def generate_dimension_values(lot_no):
229 265
             placeholders[f'v6_2'] = r.hsize
230 266
             placeholders[f'v6_3'] = r.hsizeok
231 267
 
232
-    hide_con(placeholders, "v4_2", "24:28")
268
+    hide_con(placeholders, "v4_1", "24:28")
233 269
     return placeholders
234 270
 
235 271
 def is_ok(instance):
@@ -252,7 +288,7 @@ def generate_dimension_app_values(lot_no):
252 288
     manual_size_records = Manualsize.objects.filter(lotno=lot_no)
253 289
 
254 290
     # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
255
-    data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')[:2]
291
+    data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
256 292
 
257 293
     # Prepare placeholders
258 294
 
@@ -313,6 +349,99 @@ def generate_dimension_app_values(lot_no):
313 349
     hide_con(placeholders, "v5_1", "26:32")
314 350
     return placeholders
315 351
 
352
+def generate_dimension_bal_weight_values(lot_no, ms):
353
+    """
354
+    Fetch dimension records from manualSize and DataMs models
355
+    and generate placeholder values for Standard, Actual, and Judgement.
356
+    Supports two row_no entries per lot.
357
+    """
358
+    # Fetch standard values from manualSize (limit to 2 rows)
359
+    manual_size_records = Manualsize.objects.filter(lotno=lot_no)
360
+
361
+    # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
362
+    data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
363
+
364
+    data_wb = DataWb.objects.filter(lot_no=lot_no).order_by('row_no')
365
+    
366
+    data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no'))
367
+    data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no'))
368
+
369
+    data_ho = list(chain(data_h1, data_h2))
370
+    # Prepare placeholders
371
+
372
+    # placeholders = {}
373
+    placeholders = clear_values(10,3)
374
+    # for i in range(1,7):
375
+        # for j in range(1,4):
376
+            # placeholders[f'v{i}_{j}'] = 0
377
+    
378
+    pprint(placeholders)
379
+    pprint(manual_size_records) 
380
+    
381
+    if ms:
382
+        w = ms.PRO6
383
+        placeholders['v4_1'] = placeholders['v9_1'] = w
384
+
385
+    for m in manual_size_records:
386
+        if m.size_name == "D":
387
+            placeholders['v1_1'] = placeholders['v6_1'] = f'D{m.std} +{m.tolup} {m.tolun}'
388
+        if m.size_name == "T":
389
+            placeholders['v2_1'] = placeholders['v7_1'] = f'T{m.std} +{m.tolup} {m.tolun}'
390
+        if m.size_name == "H":
391
+            placeholders['v3_1'] = placeholders['v8_1'] = f'H{m.std} +{m.tolup} {m.tolun}'
392
+
393
+
394
+
395
+    # Ensure that we map each manualSize entry to a corresponding DataMs entry
396
+    for r in data_ms_records:
397
+        if r.row_no == 1:
398
+            placeholders[f'v1_2'] = r.dsize
399
+            placeholders[f'v1_3'] = r.dsizeok
400
+            
401
+            placeholders[f'v2_2'] = r.tsize
402
+            placeholders[f'v2_3'] = r.tsizeok
403
+            
404
+            placeholders[f'v3_2'] = r.hsize
405
+            placeholders[f'v3_3'] = r.hsizeok
406
+
407
+            # if is_ok(r):
408
+                # placeholders[f'v4_1'] = 'OK'
409
+                # placeholders[f'v4_2'] = 'OK'
410
+            # else:
411
+                # placeholders[f'v4_1'] = 'NG'
412
+                # placeholders[f'v4_2'] = 'OK'
413
+        
414
+        if r.row_no == 2:
415
+            placeholders[f'v6_2'] = r.dsize
416
+            placeholders[f'v6_3'] = r.dsizeok
417
+            
418
+            placeholders[f'v7_2'] = r.tsize
419
+            placeholders[f'v7_3'] = r.tsizeok
420
+            
421
+            placeholders[f'v8_2'] = r.hsize
422
+            placeholders[f'v8_3'] = r.hsizeok
423
+
424
+            # if is_ok(r):
425
+                # placeholders[f'v8_1'] = 'OK'
426
+                # placeholders[f'v8_2'] = 'OK'
427
+            # else:
428
+                # placeholders[f'v8_1'] = 'NG'
429
+                # placeholders[f'v8_2'] = 'NG'
430
+
431
+    for r in data_wb:
432
+        if r.row_no == 1:
433
+            placeholders["v4_2"] = r.result
434
+            placeholders["v4_3"] = r.judgement
435
+            placeholders["v5_2"] = r.weight
436
+            placeholders["v5_3"] = r.judgement
437
+        if r.row_no == 2:
438
+            placeholders["v9_2"] = r.result
439
+            placeholders["v9_3"] = r.judgement
440
+            placeholders["v10_2"] = r.weight
441
+            placeholders["v10_3"] = r.judgement
442
+    # hide_con(placeholders, "v5_1", "26:32")
443
+    return placeholders
444
+
316 445
 def generate_dim_bal_app_hard_values(lot_no, first_result):
317 446
     """
318 447
     Fetch dimension records from manualSize and DataMs models
@@ -323,11 +452,11 @@ def generate_dim_bal_app_hard_values(lot_no, first_result):
323 452
     manual_size_records = Manualsize.objects.filter(lotno=lot_no)
324 453
 
325 454
     # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
326
-    data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')[:2]
327
-    data_wb = DataWb.objects.filter(lot_no=lot_no).order_by('row_no')[:2]
455
+    data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
456
+    data_wb = DataWb.objects.filter(lot_no=lot_no).order_by('row_no')
328 457
     
329
-    data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no')[:2])
330
-    data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no')[:2])
458
+    data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no'))
459
+    data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no'))
331 460
 
332 461
     data_ho = list(chain(data_h1, data_h2))
333 462
 
@@ -430,6 +559,136 @@ def generate_dim_bal_app_hard_values(lot_no, first_result):
430 559
     # hide_con(placeholders, "v5_1", "26:32")
431 560
     return placeholders
432 561
 
562
+def generate_dim_bal_app_rot_hard_values(lot_no, first_result):
563
+    """
564
+    Fetch dimension records from manualSize and DataMs models
565
+    and generate placeholder values for Standard, Actual, and Judgement.
566
+    Supports two row_no entries per lot.
567
+    """
568
+    # Fetch standard values from manualSize (limit to 2 rows)
569
+    manual_size_records = Manualsize.objects.filter(lotno=lot_no)
570
+
571
+    # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
572
+    data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
573
+    data_wb = DataWb.objects.filter(lot_no=lot_no).order_by('row_no')
574
+    
575
+    data_h1 = list(Data.objects.filter(lot_no=lot_no).order_by('row_no'))
576
+    data_h2 = list(DataRl.objects.filter(lot_no=lot_no).order_by('row_no'))
577
+
578
+    data_ho = list(chain(data_h1, data_h2))
579
+
580
+
581
+    rotates = RotateData.objects.filter(lot_no=lot_no).order_by('row_no')
582
+
583
+    if first_result:
584
+        out_limit = f"Out 外  ({first_result.MI18} - {first_result.MI19})"
585
+        in_limit = f"In 内 ({first_result.MI22} - {first_result.MI23})"
586
+        mid_limit = f"Middle   中  -"
587
+    else:
588
+        out_limit = f"Out 外"
589
+        in_limit = f"In 内"
590
+        mid_limit = f"Middle   中"
591
+    
592
+    
593
+
594
+    # Prepare placeholders
595
+
596
+    # placeholders = {}
597
+    placeholders = clear_values(18,5)
598
+    # for i in range(1,7):
599
+        # for j in range(1,4):
600
+            # placeholders[f'v{i}_{j}'] = 0
601
+    placeholders['v6_0'] = placeholders['v14_0'] = out_limit
602
+    placeholders['v7_0'] = placeholders['v15_0'] = mid_limit
603
+    placeholders['v18_0'] = placeholders['v16_0'] = in_limit
604
+
605
+    pprint(placeholders)
606
+    pprint(manual_size_records) 
607
+    if first_result:
608
+        w = first_result.PRO6
609
+        placeholders['v4_1'] = placeholders['v13_1'] = w
610
+
611
+    for m in manual_size_records:
612
+        if m.size_name == "D":
613
+            placeholders['v1_1'] = placeholders['v10_1'] = f'D{m.std} +{m.tolup} {m.tolun}'
614
+        if m.size_name == "T":
615
+            placeholders['v2_1'] = placeholders['v11_1'] = f'T{m.std} +{m.tolup} {m.tolun}'
616
+        if m.size_name == "H":
617
+            placeholders['v3_1'] = placeholders['v12_1'] = f'H{m.std} +{m.tolup} {m.tolun}'
618
+
619
+
620
+
621
+    # Ensure that we map each manualSize entry to a corresponding DataMs entry
622
+    for r in data_ms_records:
623
+        if r.row_no == 1:
624
+            placeholders[f'v1_2'] = r.dsize
625
+            placeholders[f'v1_3'] = r.dsizeok
626
+            
627
+            placeholders[f'v2_2'] = r.tsize
628
+            placeholders[f'v2_3'] = r.tsizeok
629
+            
630
+            placeholders[f'v3_2'] = r.hsize
631
+            placeholders[f'v3_3'] = r.hsizeok
632
+
633
+            # if is_ok(r):
634
+                # placeholders[f'v4_1'] = 'OK'
635
+                # placeholders[f'v4_2'] = 'OK'
636
+            # else:
637
+                # placeholders[f'v4_1'] = 'NG'
638
+                # placeholders[f'v4_2'] = 'OK'
639
+        
640
+        if r.row_no == 2:
641
+            placeholders[f'v10_2'] = r.dsize
642
+            placeholders[f'v10_3'] = r.dsizeok
643
+            
644
+            placeholders[f'v11_2'] = r.tsize
645
+            placeholders[f'v11_3'] = r.tsizeok
646
+            
647
+            placeholders[f'v12_2'] = r.hsize
648
+            placeholders[f'v12_3'] = r.hsizeok
649
+
650
+            # if is_ok(r):
651
+                # placeholders[f'v8_1'] = 'OK'
652
+                # placeholders[f'v8_2'] = 'OK'
653
+            # else:
654
+                # placeholders[f'v8_1'] = 'NG'
655
+                # placeholders[f'v8_2'] = 'NG'
656
+
657
+    for r in data_wb:
658
+        if r.row_no == 1:
659
+            placeholders["v4_2"] = r.weight
660
+            placeholders["v4_3"] = r.judgement
661
+        if r.row_no == 2:
662
+            placeholders["v13_2"] = r.weight
663
+            placeholders["v13_3"] = r.judgement
664
+
665
+    for r in data_ho:
666
+        if r.row_no == 1:
667
+            rmap = {'OUT': 7, 'MID': 8, 'IN': 9}
668
+            for index, v in enumerate(["p1", "p2", "p3", "avg", "rgrade"], start=1):
669
+                idx = rmap.get(r.r_type, None)
670
+                if idx:
671
+                    placeholders[f'v{idx}_{index}']  = getattr(r, v) 
672
+        if r.row_no == 2:
673
+            rmap = {'OUT': 16, 'MID': 17, 'IN': 18}
674
+            for index, v in enumerate(["p1", "p2", "p3", "avg", "rgrade"], start=1):
675
+                idx = rmap.get(r.r_type, None)
676
+                if idx:
677
+                    placeholders[f'v{idx}_{index}']  = getattr(r, v)
678
+
679
+    for r in rotates:
680
+        if r.row_no == 1:
681
+            placeholders["v6_1"] = r.speed_spec
682
+            placeholders["v6_2"] = r.speed_test
683
+            placeholders["v6_3"] = r.speedok
684
+        if r.row_no == 2:
685
+            placeholders["v15_1"] = r.speed_spec
686
+            placeholders["v15_2"] = r.speed_test
687
+            placeholders["v15_3"] = r.speedok
688
+
689
+    # hide_con(placeholders, "v5_1", "26:32")
690
+    return placeholders
691
+
433 692
 def generate_centering_values(lot_no):
434 693
     """
435 694
     Fetch dimension records from manualSize and DataMs models
@@ -440,7 +699,7 @@ def generate_centering_values(lot_no):
440 699
     manual_size_records = Manualsize.objects.filter(lotno=lot_no)
441 700
 
442 701
     # Fetch actual and judgement values from DataMs ordered by row_no (limit to 2 rows)
443
-    data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')[:2]
702
+    data_ms_records = DataMs.objects.filter(lot_no=lot_no).order_by('row_no')
444 703
 
445 704
     # Prepare placeholders
446 705
 
@@ -537,18 +796,22 @@ def create_coi_file(lot_no, sheets, user, md):
537 796
                 sheet_data[sheet_name] = generate_hardness_out_values(lot_no)
538 797
             case 'hardness_out_in':
539 798
                 sheet_data[sheet_name] = generate_hardness_out_in_values(lot_no)
799
+            case 'hardness_both_size':
800
+                sheet_data[sheet_name] = generate_hardness_both_size_values(lot_no, first_result)
540 801
             case 'dimension':
541 802
                 sheet_data[sheet_name] = generate_dimension_values(lot_no)
542 803
             case 'dimension_app':
543 804
                 sheet_data[sheet_name] = generate_dimension_app_values(lot_no)
544
-            case 'centering':
545
-                sheet_data[sheet_name] = generate_centering_values(lot_no)
805
+            case 'dimension_bal_weight':
806
+                sheet_data[sheet_name] = generate_dimension_bal_weight_values(lot_no, first_result)
546 807
             case 'centering':
547 808
                 sheet_data[sheet_name] = generate_centering_values(lot_no)
548 809
             case 'thickness_8_point':
549 810
                 sheet_data[sheet_name] = generate_t8_values(lot_no)
550 811
             case 'dim_bal_app_hard':
551 812
                 sheet_data[sheet_name] = generate_dim_bal_app_hard_values(lot_no, first_result)
813
+            case 'dim_bal_app_rot_hard':
814
+                sheet_data[sheet_name] = generate_dim_bal_app_rot_hard_values(lot_no, first_result)
552 815
     
553 816
     converted_data = convert_sheet_data(sheet_data)
554 817