补齐多项订单统计中的节点分布
This commit is contained in:
@@ -150,10 +150,10 @@ def read_orders(tenants,query,page=1,size=5,comparisons=()):
|
||||
connection.row_factory=sqlite3.Row
|
||||
connection.execute('BEGIN')
|
||||
total=with_inbound=0;groups=Counter();selected=[];tail=deque(maxlen=size)
|
||||
counts=[0 for _ in comparisons]
|
||||
comparison_groups=[Counter() for _ in comparisons]
|
||||
for item in scoped_orders(connection,tenants):
|
||||
for index,comparison in enumerate(comparisons):
|
||||
counts[index]+=matches_filters(item,comparison)
|
||||
if matches_filters(item,comparison):comparison_groups[index][item['stage']]+=1
|
||||
if not matches_filters(item,query):continue
|
||||
total+=1;with_inbound+=bool((item['inbound_code'] or '').strip());groups[item['stage']]+=1
|
||||
tail.append(item)
|
||||
@@ -161,7 +161,8 @@ def read_orders(tenants,query,page=1,size=5,comparisons=()):
|
||||
last=max(1,(total+size-1)//size)
|
||||
if page>last:
|
||||
page=last;selected=list(tail)[-(total-(last-1)*size):] if total else []
|
||||
return {'total':total,'with_inbound':with_inbound,'groups':groups,'rows':selected,'page':page,'counts':counts}
|
||||
return {'total':total,'with_inbound':with_inbound,'groups':groups,'rows':selected,'page':page,
|
||||
'counts':[sum(group.values()) for group in comparison_groups],'comparison_groups':comparison_groups}
|
||||
finally:connection.close()
|
||||
|
||||
|
||||
@@ -190,6 +191,11 @@ def summary_text(query,total):
|
||||
return text
|
||||
|
||||
|
||||
def stage_distribution(groups):
|
||||
return ['按当前实际物流节点分布(每票只计一次):']+[
|
||||
f'- {label}:{groups[code]}票' for code,label in STAGE_LABELS.items() if groups[code]]
|
||||
|
||||
|
||||
def answer_summary(intent,tenants,conv_id=None):
|
||||
from .customer_service import order_login_response
|
||||
if not tenants:return order_login_response()
|
||||
@@ -202,11 +208,13 @@ def answer_summary(intent,tenants,conv_id=None):
|
||||
try:
|
||||
data=read_orders(tenants,query,comparisons=comparisons)
|
||||
total=data['total']
|
||||
lines=[summary_text(part,count)+'。' for part,count in zip(comparisons,data['counts'])]
|
||||
lines=[]
|
||||
for part,count,groups in zip(summaries[:-1],data['counts'],data['comparison_groups']):
|
||||
lines.append(summary_text(part,count)+'。')
|
||||
if part.get('grouped'):lines.extend(stage_distribution(groups))
|
||||
lines.append(summary_text(query,total)+f',其中 {data["with_inbound"]} 票已登记入仓码。')
|
||||
if summaries[-1].get('grouped'):
|
||||
lines.append('按当前实际物流节点分布(每票只计一次):')
|
||||
lines.extend(f'- {label}:{data["groups"][code]}票' for code,label in STAGE_LABELS.items() if data['groups'][code])
|
||||
lines.extend(stage_distribution(data['groups']))
|
||||
for part in requested:
|
||||
if part['unsupported']:
|
||||
question=re.sub(r'\s+',' ',part['question'])[:120]
|
||||
|
||||
@@ -145,6 +145,16 @@ class OrderStatisticsTests(unittest.TestCase):
|
||||
self.assertIn('暂无实际节点:3票',text)
|
||||
self.assertIn('共有 16 票订单',self.ask('或者订单有多少条?')['t'])
|
||||
|
||||
def test_combined_statistics_keep_node_distribution_before_exception_count(self):
|
||||
self.login()
|
||||
text=self.ask('我的订单各个轨迹节点分别有多少,异常的有多少条')['t']
|
||||
self.assertIn('共有 16 票订单',text)
|
||||
self.assertIn('船舶已到目的港:10票',text)
|
||||
self.assertIn('已清关、可提柜:2票',text)
|
||||
self.assertIn('暂无实际节点:3票',text)
|
||||
self.assertIn('7 票明确标记异常',text)
|
||||
self.assertEqual(text.count('- 入仓码:'),5)
|
||||
|
||||
def test_ambiguous_speech_answers_the_clear_count_and_requests_the_missing_meaning(self):
|
||||
self.login()
|
||||
text=self.ask('当前,我的订单有多少条,一层有多少条?')['t']
|
||||
|
||||
Reference in New Issue
Block a user