当前位置: 首页 > news >正文

【sap-cap】

初始化工程

  • nodejs

cds init --add nodejs incident-management

  • java

cds init --add java incident-management
npm install

启动

  • nodejs

cds watch

  • java 使用如下

mvn cds:watch

model

进入db目录下schema.cds

using{cuid, managed, sap.common.CodeList}from'@sap/cds/common';namespace sap.capire.incidents;/** * Incidents created by Customers. */ entity Incidents:cuid, managed{customer:Association to Customers;title:String @title:'Title';urgency:Association to Urgency default'M';status:Association to Status default'N';conversation:Composition of many{key ID:UUID;timestamp:typeof managed:createdAt;author:typeof managed:createdBy;message:String;};}/** * Customers entitled to create support Incidents. */ entity Customers:managed{key ID:String;firstName:String;lastName:String;name:String=trim(firstName||' '||lastName);email:EMailAddress;phone:PhoneNumber;incidents:Association to many Incidents on incidents.customer=$self;creditCardNo:String(16)@assert.format:'^[1-9]\d{15}$';addresses:Composition of many Addresses on addresses.customer=$self;}entity Addresses:cuid, managed{customer:Association to Customers;city:String;postCode:String;streetAddress:String;}entity Status:CodeList{key code:String enum{new='N';assigned='A';in_process='I';on_hold='H';resolved='R';closed='C';};criticality:Integer;}entity Urgency:CodeList{key code:String enum{high='H';medium='M';low='L';};}typeEMailAddress:String;typePhoneNumber:String;

服务

进入srv下的 services.cds文件

using{sap.capire.incidents as my}from'../db/schema';/** * Service used by support personell, i.e. the incidents' 'processors'. */serviceProcessorService{entity Incidents as projection on my.Incidents;@readonly entity Customers as projection on my.Customers;}/** * Service used by administrators to manage customers and incidents. */serviceAdminService{entity Customers as projection on my.Customers;entity Incidents as projection on my.Incidents;}

初始数据

cds add data

文件如下:

  • db/data/sap.capire.incidents-Addresses.csv
  • db/data/sap.capire.incidents-Customers.csv
  • db/data/sap.capire.incidents-Incidents.csv
  • db/data/sap.capire.incidents-Incidents.conversation.csv
  • db/data/sap.capire.incidents-Status.csv
  • db/data/sap.capire.incidents-Status.texts.csv
  • db/data/sap.capire.incidents-Urgency.csv
  • db/data/sap.capire.incidents-Urgency.texts.csv

server.js

  • java
package customer.incident_management.handler;importcds.gen.processorservice.Incidents;importcds.gen.processorservice.ProcessorService_;importcds.gen.sap.capire.incidents.*;importcom.sap.cds.ql.Select;importcom.sap.cds.services.ErrorStatuses;importcom.sap.cds.services.ServiceException;importcom.sap.cds.services.cds.CqnService;importcom.sap.cds.services.handler.EventHandler;importcom.sap.cds.services.handler.annotations.Before;importcom.sap.cds.services.handler.annotations.ServiceName;importcom.sap.cds.services.persistence.PersistenceService;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.stereotype.Component;importjava.util.List;importjava.util.Locale;@Component @ServiceName(ProcessorService_.CDS_NAME)public class ProcessorServiceHandler implements EventHandler{private static final Logger logger=LoggerFactory.getLogger(ProcessorServiceHandler.class);private final PersistenceService db;public ProcessorServiceHandler(PersistenceService db){this.db=db;}/* * Change the urgency of an incident to"high"ifthe title contains the word"urgent"*/ @Before(event=CqnService.EVENT_CREATE)public void ensureHighUrgencyForIncidentsWithUrgentInTitle(List<Incidents>incidents){for(Incidents incident:incidents){if(incident.getTitle().toLowerCase(Locale.ENGLISH).contains("urgent")&&incident.getUrgencyCode()==null||!incident.getUrgencyCode().equals("H")){incident.setUrgencyCode("H");logger.info("Adjusted Urgency for incident '{}' to 'HIGH'.", incident.getTitle());}}}/* * Handler to avoid updating a"closed"incident */ @Before(event=CqnService.EVENT_UPDATE)public void ensureNoUpdateOnClosedIncidents(Incidents incident){Incidentsin=db.run(Select.from(Incidents_.class).where(i ->i.ID().eq(incident.getId()))).single(Incidents.class);if(in.getStatusCode().equals("C")){throw new ServiceException(ErrorStatuses.CONFLICT,"Can't modify a closed incident");}}}
  • nodejs
const cds=require('@sap/cds')class ProcessorService extends cds.ApplicationService{/** Registering custom event handlers */init(){this.before("UPDATE","Incidents",(req)=>this.onUpdate(req));this.before("CREATE","Incidents",(req)=>this.changeUrgencyDueToSubject(req.data));returnsuper.init();}changeUrgencyDueToSubject(data){leturgent=data.title?.match(/urgent/i)if(urgent)data.urgency_code='H'}/** Custom Validation */ async onUpdate(req){letclosed=await SELECT.one(1).from(req.subject).where`status.code='C'`if(closed)req.reject`Can't modify a closed incident!`}}module.exports={ProcessorService}
http://www.jsqmd.com/news/503107/

相关文章:

  • 从零到一:STM32CubeMX实战CAN通讯与图莫斯UTA0403联调指南
  • Gazebo模型加载失败?三步搞定Fuel下载模型的URI路径修复
  • Wan2.1-UMT5多风格效果对比:从写实到动漫的视觉转换能力展示
  • Bootstrap 导航元素
  • 重构Mac滚动体验:Mos实现鼠标操作的丝滑革命
  • PyTorch实战:5分钟搞定GradCAM++可视化(附完整代码与效果对比)
  • 医院直饮水解决方案提供商怎么选?破解医疗饮水痛点 - 妙妙水侠
  • 5分钟搞定Google OAuth2.0登录:从创建凭据到获取用户信息的完整流程
  • 单细胞RNA测序数据可视化终极指南:用scRNAtoolVis轻松制作发表级图表
  • 2026年东莞硅胶制品厂家哪家好?硅胶加工厂、硅胶定制厂家、食品级硅胶厂家、硅塑胶制品厂、硅胶制品厂推荐及选择指南 - 海棠依旧大
  • 新手福音:用claude code和快马平台轻松入门第一个待办事项应用
  • JavaScript 实用封装技巧
  • GFXReconstruct完全解析:从结构到配置的实战指南
  • Linux系统调用无陷入实现-ARM64 5.15
  • Dify混合RAG召回率突破95%的最后临界点(仅限头部AIGC团队内部使用的动态分片+缓存穿透防护协议)
  • 贝叶斯优化LSTM在MATLAB中的时间序列单输入单输出预测模型(2021版)
  • ComfyUI可视化工作流:无缝集成OWL ADVENTURE进行复杂视觉任务编排
  • Alpamayo-R1-10B部署教程:20GB显存适配与WebUI免配置实操
  • 公司战略缺乏AI人才基础,与CAIE认证合作开展定制培训是否可行?
  • 毕业论文降AI率售后体验对比:比话/嘎嘎/率零谁更让人放心 - 我要发一区
  • Meta-Reinforcement Learning实战:如何用MAML让AI快速适应新游戏关卡?
  • 如何在 MySQL 中监控和优化慢 SQL?
  • Bidili Generator新手福利:免费商用SDXL工具,附赠提示词秘籍
  • 降AI率效果不达标,我是怎么拿到全额退款的(真实经历) - 我要发一区
  • 突破数据传输瓶颈:Apache Arrow IPC技术深度解析与实战
  • CMS / G1 / ZGC:收集器怎么选?它们分别怎么工作?
  • Chord视频分析新手入门:第一次使用如何上传视频并获取分析结果
  • 3分钟掌握GFXReconstruct:图形API捕获与重放实战指南
  • 解锁5大系统调优引擎:AtlasOS性能提升实战指南
  • 效率重构:PaperZZ AI 如何让本科论文从选题到成稿实现高效落地