|  | @@ -105,8 +105,25 @@ $(function () {
 | 
	
		
			
				|  |  |          let realNo = $("#realNoLabel").val();
 | 
	
		
			
				|  |  |          // 从全局变量获取药师执业资格证号
 | 
	
		
			
				|  |  |          let pharPracCertNo = window.currentPharPracCertNo || '';
 | 
	
		
			
				|  |  | -        sendMedicineProcessing(realNo, orderNo, receiptNo, times, patientId, name, pharPracCertNo);
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        // 先验证追溯码数量,再决定是否发药
 | 
	
		
			
				|  |  | +        validateTracCodgQuantity(realNo, orderNo, receiptNo, times, patientId, name, pharPracCertNo);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    // 追溯码数量确认弹框的确认发药按钮
 | 
	
		
			
				|  |  | +    $("#confirmTracCodgSend").click(function (t) {
 | 
	
		
			
				|  |  | +        // 获取存储的发药参数
 | 
	
		
			
				|  |  | +        let sendParams = window.pendingSendParams;
 | 
	
		
			
				|  |  | +        if (sendParams) {
 | 
	
		
			
				|  |  | +            // 隐藏确认弹框
 | 
	
		
			
				|  |  | +            $('#tracCodgConfirmModal').modal('hide');
 | 
	
		
			
				|  |  | +            // 执行发药处理
 | 
	
		
			
				|  |  | +            sendMedicineProcessing(sendParams.realNo, sendParams.orderNo, sendParams.receiptNo, 
 | 
	
		
			
				|  |  | +                                sendParams.times, sendParams.patientId, sendParams.name, sendParams.pharPracCertNo);
 | 
	
		
			
				|  |  | +            // 清除存储的参数
 | 
	
		
			
				|  |  | +            window.pendingSendParams = null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  |      $("#printSend").click(function (t) {
 | 
	
		
			
				|  |  |          $('#zydybqModal').modal('hide');
 | 
	
		
			
				|  |  |          $("#zyypbq_name").attr("value", $("#zydyNameLabel").val());
 | 
	
	
		
			
				|  | @@ -3539,4 +3556,102 @@ function callYbReturnGoodsItemWithData(ybData, item) {
 | 
	
		
			
				|  |  |              // 医保接口失败不影响退药流程,只记录日志
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * 验证追溯码数量与处方数量的匹配情况
 | 
	
		
			
				|  |  | + * @param realNo 流水号
 | 
	
		
			
				|  |  | + * @param orderNo 处方号
 | 
	
		
			
				|  |  | + * @param receiptNo 发票分票号
 | 
	
		
			
				|  |  | + * @param times 次数
 | 
	
		
			
				|  |  | + * @param patientId 病人ID
 | 
	
		
			
				|  |  | + * @param name 病人姓名
 | 
	
		
			
				|  |  | + * @param pharPracCertNo 药师执业资格证号
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function validateTracCodgQuantity(realNo, orderNo, receiptNo, times, patientId, name, pharPracCertNo) {
 | 
	
		
			
				|  |  | +    // 获取处方明细表格数据
 | 
	
		
			
				|  |  | +    let tableData = $("#tb_table_right").bootstrapTable('getData');
 | 
	
		
			
				|  |  | +    let mismatchDetails = [];
 | 
	
		
			
				|  |  | +    let hasMismatch = false;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    console.log('开始验证追溯码数量,表格数据:', tableData);
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    // 遍历每种药品,检查追溯码数量
 | 
	
		
			
				|  |  | +    for (let i = 0; i < tableData.length; i++) {
 | 
	
		
			
				|  |  | +        let drug = tableData[i];
 | 
	
		
			
				|  |  | +        let prescriptionQuantity = parseInt(drug.quantity) || 0; // 处方数量
 | 
	
		
			
				|  |  | +        let tracCodgCount = 0; // 追溯码数量
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        // 计算该药品的追溯码数量
 | 
	
		
			
				|  |  | +        if (!isEmpty(drug.drugTracCodg)) {
 | 
	
		
			
				|  |  | +            // 按<br>分割追溯码,过滤空值
 | 
	
		
			
				|  |  | +            let tracCodgList = drug.drugTracCodg.split('<br>').filter(code => code.trim().length > 0);
 | 
	
		
			
				|  |  | +            tracCodgCount = tracCodgList.length;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        console.log('药品:', drug.drugname, '处方数量:', prescriptionQuantity, '追溯码数量:', tracCodgCount);
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        // 检查数量是否匹配
 | 
	
		
			
				|  |  | +        if (tracCodgCount !== prescriptionQuantity) {
 | 
	
		
			
				|  |  | +            hasMismatch = true;
 | 
	
		
			
				|  |  | +            let mismatchInfo = {
 | 
	
		
			
				|  |  | +                drugName: drug.drugname,
 | 
	
		
			
				|  |  | +                prescriptionQuantity: prescriptionQuantity,
 | 
	
		
			
				|  |  | +                tracCodgCount: tracCodgCount,
 | 
	
		
			
				|  |  | +                difference: tracCodgCount - prescriptionQuantity
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +            mismatchDetails.push(mismatchInfo);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    // 如果有不匹配的情况,显示确认弹框
 | 
	
		
			
				|  |  | +    if (hasMismatch) {
 | 
	
		
			
				|  |  | +        // 存储发药参数,供确认后使用
 | 
	
		
			
				|  |  | +        window.pendingSendParams = {
 | 
	
		
			
				|  |  | +            realNo: realNo,
 | 
	
		
			
				|  |  | +            orderNo: orderNo,
 | 
	
		
			
				|  |  | +            receiptNo: receiptNo,
 | 
	
		
			
				|  |  | +            times: times,
 | 
	
		
			
				|  |  | +            patientId: patientId,
 | 
	
		
			
				|  |  | +            name: name,
 | 
	
		
			
				|  |  | +            pharPracCertNo: pharPracCertNo
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        // 构建不匹配详情HTML
 | 
	
		
			
				|  |  | +        let detailsHtml = '<div class="table-responsive"><table class="table table-bordered table-striped">';
 | 
	
		
			
				|  |  | +        detailsHtml += '<thead><tr><th>药品名称</th><th>处方数量</th><th>追溯码数量</th><th>差异</th></tr></thead><tbody>';
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        for (let i = 0; i < mismatchDetails.length; i++) {
 | 
	
		
			
				|  |  | +            let detail = mismatchDetails[i];
 | 
	
		
			
				|  |  | +            let differenceText = '';
 | 
	
		
			
				|  |  | +            let rowClass = '';
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            if (detail.difference > 0) {
 | 
	
		
			
				|  |  | +                differenceText = '<span style="color: orange;">多输入 ' + detail.difference + ' 个</span>';
 | 
	
		
			
				|  |  | +                rowClass = 'warning';
 | 
	
		
			
				|  |  | +            } else if (detail.difference < 0) {
 | 
	
		
			
				|  |  | +                differenceText = '<span style="color: red;">缺少 ' + Math.abs(detail.difference) + ' 个</span>';
 | 
	
		
			
				|  |  | +                rowClass = 'danger';
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            detailsHtml += '<tr class="' + rowClass + '">';
 | 
	
		
			
				|  |  | +            detailsHtml += '<td>' + detail.drugName + '</td>';
 | 
	
		
			
				|  |  | +            detailsHtml += '<td>' + detail.prescriptionQuantity + '</td>';
 | 
	
		
			
				|  |  | +            detailsHtml += '<td>' + detail.tracCodgCount + '</td>';
 | 
	
		
			
				|  |  | +            detailsHtml += '<td>' + differenceText + '</td>';
 | 
	
		
			
				|  |  | +            detailsHtml += '</tr>';
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        detailsHtml += '</tbody></table></div>';
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        // 显示确认弹框
 | 
	
		
			
				|  |  | +        $('#tracCodgMismatchDetails').html(detailsHtml);
 | 
	
		
			
				|  |  | +        $('#tracCodgConfirmModal').modal('show');
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        console.log('追溯码数量不匹配,显示确认弹框:', mismatchDetails);
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +        // 数量匹配,直接发药
 | 
	
		
			
				|  |  | +        console.log('追溯码数量匹配,直接发药');
 | 
	
		
			
				|  |  | +        sendMedicineProcessing(realNo, orderNo, receiptNo, times, patientId, name, pharPracCertNo);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 |