自己写的第一个triger

简化前: 
sql 代码
  1. Create Or Replace Trigger tr_cust_order   
  2. AFTER  UPDATE  
  3. ON te_cust_order   
  4. FOR EACH ROW   
  5. WHEN (NEW.status=6)   
  6. DECLARE    
  7.    exhok NUMBER;   
  8.    exhid NUMBER;   
  9.    regok NUMBER;   
  10.    seqexh NUMBER;   
  11.    sql_stat varchar2(200);   
  12. BEGIN  
  13.      
  14. --判断是否为展览订单             
  15. DECLARE    
  16.     CURSOR emp_cursor IS  
  17.         SELECT service_item_id FROM te_cust_order    
  18.     WHERE service_item_id IN  
  19.     (SELECT t.id FROM te_cust_service_item t WHERE t.service_type_id IN (2,3,4) );   
  20.     emp_record emp_cursor%ROWTYPE;   
  21. BEGIN  
  22.     OPEN emp_cursor;   
  23.     LOOP   
  24.         FETCH emp_cursor INTO emp_record;   
  25.         exit when emp_cursor%NOTFOUND;   
  26.     if emp_record.service_item_id = :old.SERVICE_ITEM_ID then  
  27.            exhok := 1;     
  28.     end if;     
  29.     END LOOP;   
  30.     CLOSE emp_cursor;   
  31. END;   
  32.   
  33. if exhok != 1 then     
  34. return;   
  35. end if;   
  36.   
  37. --取得展览ID   
  38. exhid := 0;   
  39. DECLARE    
  40.     CURSOR exh_cursor IS  
  41.         SELECT exh_id FROM te_exh_order    
  42.     WHERE order_no = :new.order_no;   
  43.     exh_record exh_cursor%ROWTYPE;   
  44. BEGIN  
  45.     OPEN exh_cursor;   
  46.     LOOP   
  47.         FETCH exh_cursor INTO exh_record;   
  48.         exit when exh_cursor%NOTFOUND;   
  49.     exhid := exh_record.exh_id ;   
  50.     END LOOP;   
  51.     CLOSE exh_cursor;   
  52. END;   
  53.   
  54. if exhid < 1 then     
  55. return;   
  56. end if;   
  57.   
  58. --判断是否已经报名了   
  59. regok := 0;   
  60. SELECT count(*) INTO regok FROM teexhibitiontomember    
  61.  WHERE EXHIBITIONID =  exhid and CUSTOMERNO = :new.CUSTOMER_NO;   
  62. if regok >0 then     
  63. return;   
  64. end if;   
  65.   
  66. --增加报名记录   
  67. select teexhibitionmemberseq.nextval into seqexh    
  68. from teexhibitiontomember t where rownum = 1;   
  69.   
  70. sql_stat := 'insert into teexhibitiontomember(ID,MEMBERID,EXHIBITIONID,CUSTOMERNO) values ('   
  71.           || seqexh || ',0,' ||exhid||','''|| :new.CUSTOMER_NO||''')';   
  72.              
  73. execute immediate sql_stat;   
  74.   
  75.   
  76. END tr_cust_order;   
 
简化后:
sql 代码
  1. /*==============================================================*/   
  2. /* Trigger: tr_cust_order                               */   
  3. /*==============================================================*/   
  4.   
  5. Create Or Replace Trigger tr_cust_order   
  6.   AFTER UPDATE ON te_cust_order   
  7.   FOR EACH ROW   
  8.   WHEN (NEW.status = 6)   
  9. DECLARE  
  10.   exhid    NUMBER;   
  11.   regok    NUMBER;   
  12.   seqexh   NUMBER;   
  13.   sql_stat varchar2(200);   
  14. BEGIN  
  15.   
  16.   --取得展览ID   
  17.   SELECT exh_id   
  18.     into exhid   
  19.     FROM te_exh_order   
  20.    WHERE order_no = :new.order_no;   
  21.   
  22.   if exhid < 1 then  
  23.     return;   
  24.   end if;   
  25.   
  26.   --判断是否已经报名了   
  27.   regok := 0;   
  28.   SELECT count(*)   
  29.     INTO regok   
  30.     FROM teexhibitiontomember   
  31.    WHERE EXHIBITIONID = exhid   
  32.      and CUSTOMERNO = :new.CUSTOMER_NO;   
  33.   if regok > 0 then  
  34.     return;   
  35.   end if;   
  36.   
  37.   --增加报名记录   
  38.   select teexhibitionmemberseq.nextval into seqexh from dual;   
  39.   
  40.   sql_stat := 'insert into teexhibitiontomember(ID,MEMBERID,EXHIBITIONID,CUSTOMERNO) values (' ||   
  41.               seqexh || ',0,' || exhid || ',''' || :new.CUSTOMER_NO ||   
  42.               ''')';   
  43.   
  44.   execute immediate sql_stat;   
  45.   
  46. END tr_cust_order;   
<think>嗯,用户之前问过如何设计一个自动提醒的计划清单软件,现在他们想知道如何自己动手一个这样的软件。首先,我需要回顾一下之前的回答,确保这次的建议是连贯的。用户可能有一定的技术背景,但可能还是新手,所以需要分步骤指导,并且语言要易懂。 用户的需求很明确,就是根据之前的系统设计,自己动手实现一个计划清单软件。他们可能需要具体的步骤,从技术选型到开发步骤,再到测试和优化。可能还需要一些代码示例,但用户可能需要更详细的指导,比如如何分模块开发,每个模块具体怎么做。 首先,我需要确认用户的技术栈。之前的回答提到了Python,所以可能用户对Python比较熟悉。不过,也可能他们想用其他语言,但考虑到之前的例子用Python,继续用Python作为示例比较合适。需要分阶段来指导,比如准备阶段、核心功能实现、进阶功能、测试部署等。 接下来,用户可能关心的是具体的实现步骤,比如如何解析自然语言,如何设置定时任务,如何处理多端同步等。需要详细说明每个模块的实现方法,同时给出代码示例。比如,自然语言处理可以用正则表达式,或者更高级的NLP库,但考虑到复杂度,可能先推荐正则表达式。 另外,用户可能需要知道如何管理任务数据,比如使用本地数据库还是文件存储。对于MVP(最小可行产品),可能先用JSON文件存储,简单易用。之后可以升级到SQLite或其他数据库。 在提醒功能方面,需要跨平台的支持,比如使用plyer库,但要注意不同平台的通知实现可能不同。可能需要说明如何处理不同操作系统的兼容性问题。 测试部分,用户可能需要知道如何模拟时间触发,或者如何调试后台任务。比如使用APScheduler的测试模式,或者添加日志记录。 进阶功能方面,用户可能对AI预测和多端同步感兴趣,但需要先完成核心功能。这里可以简要提到后续的可能方向,但重点放在基础功能的实现上。 最后,部署部分可能需要指导如何打包成可执行文件,或者如何设置开机启动,确保后台服务一直运行。特别是Windows和Linux的不同处理方法。 总结来说,回答需要结构清晰,分步骤,提供具体代码示例,同时指出可能遇到的问题和解决方案。需要保持语言简洁,避免过于技术化,让用户能够一步步跟着做。同时,考虑到用户可能的时间和技术限制,推荐从简单开始,逐步迭代。</think>以下是一个从零开始开发计划清单软件的完整实现指南,包含技术选型、开发步骤和关键代码示例: --- ### **一、开发准备** #### 1. 技术选型建议 ```markdown - 语言:Python(快速原型)/ JavaScript(全栈方案) - 核心库: - 定时任务:`APScheduler`(Python) / `node-schedule`(Node.js) - 系统通知:`plyer`(跨平台通知)/ `electron-notify`(桌面端) - 数据存储:`SQLite`(本地数据库)/ `JSON文件`(快速测试) - 界面框架:`Tkinter`(Python原生)/ `Electron`(跨平台桌面) ``` #### 2. 环境搭建示例(Python版) ```bash # 创建虚拟环境 python -m venv venv source venv/bin/activate # Linux/Mac venv\Scripts\activate.bat # Windows # 安装核心依赖 pip install apscheduler plyer python-dateutil ``` --- ### **二、分模块开发指南** #### 1. 核心数据结构设计 ```python # task_model.py from dataclasses import dataclass from datetime import datetime @dataclass class Task: id: str name: str start_time: datetime end_time: datetime is_recurring: bool = False recurrence_rule: str = None # 例如 "daily", "weekly" ``` #### 2. 自然语言解析实现 ```python # time_parser.py from dateparser import parse # 需要安装 dateparser 库 import re def parse_natural_time(text): # 示例解析:"明天下午3点开始,持续2小时" start_match = re.search(r"(.*?)(开始|起)", text) duration_match = re.search(r"持续(\d+)小时", text) start_time = parse(start_match.group(1)) if start_match else datetime.now() duration = int(duration_match.group(1)) if duration_match else 1 return { "start": start_time, "end": start_time + timedelta(hours=duration) } ``` #### 3. 定时任务调度核心 ```python # scheduler_manager.py from apscheduler.schedulers.background import BackgroundScheduler from plyer import notification class SchedulerManager: def __init__(self): self.scheduler = BackgroundScheduler() self.active_jobs = {} def add_reminder(self, task): # 开始提醒 start_job = self.scheduler.add_job( self._trigger_notification, 'date', run_date=task.start_time, args=[f"任务即将开始: {task.name}"] ) # 结束提醒 end_job = self.scheduler.add_job( self._trigger_notification, 'date', run_date=task.end_time, args=[f"任务时间结束: {task.name}"] ) self.active_jobs[task.id] = (start_job.id, end_job.id) def _trigger_notification(self, message): notification.notify( title='计划提醒', message=message, app_name='智能清单', timeout=10 ) ``` #### 4. 数据持久化实现 ```python # database.py import sqlite3 from contextlib import closing class TaskDB: def __init__(self, db_path='tasks.db'): self.conn = sqlite3.connect(db_path) self._init_db() def _init_db(self): with closing(self.conn.cursor()) as c: c.execute('''CREATE TABLE IF NOT EXISTS tasks (id TEXT PRIMARY KEY, name TEXT, start_time TIMESTAMP, end_time TIMESTAMP, is_recurring BOOLEAN, recurrence_rule TEXT)''') self.conn.commit() def save_task(self, task): # 实现插入/更新逻辑 pass def load_tasks(self): # 实现任务加载 pass ``` --- ### **三、界面开发方案** #### 1. 命令行界面(CLI)示例 ```python # cli_interface.py from prompt_toolkit import prompt # 需要安装 prompt_toolkit def main_cli(): while True: user_input = prompt("> 输入任务(或输入exit退出): ") if user_input.lower() == 'exit': break # 解析并保存任务 parsed_time = parse_natural_time(user_input) new_task = Task( id=str(uuid.uuid4()), name=extract_task_name(user_input), **parsed_time ) db.save_task(new_task) scheduler.add_reminder(new_task) ``` #### 2. 图形界面方案(Tkinter) ```python # gui_main.py import tkinter as tk from tkinter import ttk class TaskApp(tk.Tk): def __init__(self): super().__init__() self.title("智能计划清单") # 任务列表 self.tree = ttk.Treeview(columns=("Start", "End")) self.tree.heading("#0", text="任务名称") self.tree.heading("Start", text="开始时间") self.tree.heading("End", text="结束时间") self.tree.pack(fill=tk.BOTH, expand=True) # 输入框 self.entry = tk.Entry(width=50) self.entry.pack(pady=10) # 添加按钮 tk.Button(text="添加任务", command=self.add_task).pack() def add_task(self): input_text = self.entry.get() # 调用解析和保存逻辑 ``` -- ### **四、部署与优化** #### 1. 打包为可执行文件 ```bash # 使用 PyInstaller 打包 pip install pyinstaller pyinstaller --onefile --windowed --icon=app.ico main.py ``` #### 2. 后台服务化(Windows) ```python # 注册为Windows服务 import win32serviceutil # 需要 pywin32 class TaskService(win32serviceutil.ServiceFramework): _svc_name_ = "SmartReminder" _svc_display_name_ = "智能计划提醒服务" def SvcDoRun(self): scheduler.scheduler.start() def SvcStop(self): scheduler.scheduler.shutdown() ``` #### 3. 性能优化建议 ```markdown 1. 使用内存数据库缓存高频访问数据 2. 批量处理重复任务的调度计算 3. 异步入数据库(注意异常处理) 4. 实现任务过期自动清理机制 ``` --- ### **五、测试方案设计** 1. **时间模拟测试** ```python from freezegun import freeze_time # 需要安装 freezegun def test_reminder_trigger(): with freeze_time("2023-15 13:59:00"): # 添加14:00开始的任务 add_test_task() with freeze_time("2023-08-15 14:00:00"): # 验证是否触发通知 assert notification_sent() ``` 2. **压力测试脚本** ```python # 模拟同时添加1000个任务 for i in range(1000): fake_task = Task( id=f"task_{i}", name=f"测试任务{i}", start_time=datetime.now() + timedelta(minutes=i), end_time=datetime.now() + timedelta(minutes=i+30) ) scheduler.add_reminder(fake_task) ``` --- ### **六、迭代开发建议** 1. 第一阶段:实现命令行版本(1周) 2. 第二阶段:开发基础GUI(2周) 3. 第三阶段:添加多平台支持(1周) 4. 第四阶段:开发移动端APP(使用Kivy或React Native) 建议使用Git进行版本控制,采用`feature分支`开发模式。核心功能稳定后,可考虑开源或发布到应用商店。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值