☰ Java 复习 · C8 实战总图更新 10-13 15:41

⑦ H厂实操(完整文件 + 逐行)

三个H厂需求,放进完整文件里逐行写

三个需求都出自H厂真资料,每个都放进完整文件里写,让你看到它在文件的哪个位置。全部 草稿:没进虚拟机跑过,标「待查」的地方要先查到才能填。

需求 1:款式页显示「中文品名」「客户」

依据:属性表「产品属性」:中文品名 C8_Style_ZhName 文本;客户 C8_Style_Customer 引用单选。H厂的真值:客户 = 客户B(追踪表 Label BM),中文品名H厂资料里没有(成品基本资料文件夹是空的)。

前提:两个字段已在 Setup → Business Objects → Style 里建好、Enabled。

Site.xml(完整片段)

代码(一行一行)这一行在干什么
<NodeRef Type="Style">扩展「款式」对象(属性表:维度 = 产品 → Style)
<Headings>字段组
<Heading Id="C8_Style_ZhName"/>文本字段 → 自闭合
<Heading Id="C8_Style_Customer">ref 字段 → 不自闭合
<Relationship Type="Customer"/>引用的对象是 Customer(属性清单第 1 行:品牌 → BO = Customer)
</Heading>
</Headings>
</NodeRef>

en.js(加在 "Style" 里)

代码(一行一行)这一行在干什么
"Style": {已有的款式块
"CntColorway": "…",原来的,保留;后面逗号
"C8_Style_ZhName": "\u4e2d\u6587\u54c1\u540d",中文品名
"C8_Style_Customer": "\u5ba2\u6237",客户
"Action": { … }原来的按钮翻译,保留
}
字段要出现在 AllStyles 列表里(知识库已验证的路径):Home → Style → Styles → Views → Save As… → Manage Custom Views → Attributes → Style → Available Attributes → Add > → 保存。
详情页不显示是知识库里还没解决的问题,别把它当成你写错了。

需求 2:新建成本单时,币种默认 USD(但可以改)

依据:属性表 CBD 页「幣種 C8_CSM_Currency,默認 USD」;纪要「成品报价以美元为主,人民币较少」;H厂 CBD 表头「汇率 USD:RMB 6.8」。

为什么用 addDefaultValue 不用 addFixedValue:有人民币报价,要允许改。

Site.js:放在第 ⑥ 段 topic.subscribe 的 switch 里,新加一个 case

代码(一行一行)这一行在干什么
topic.subscribe("/csi/view/start", function (view) {已有的页面订阅,不新建
var key = view.defView.getKey();已有
switch (key) {已有
case "__Form__|Style": { … break; };已有的 case,不动
case "__Form__|<成本单Type名>": {新加:打开成本单新建表单时。Type 名 待查(CBD 属性 Id 前缀是 C8_CSM_,对象名还不知道)
view.addDefaultValue("C8_CSM_Currency", "<币种枚举名>:USD");默认 USD,可改。枚举完整写法 待查
break;必须
};
}
});

需求 3:成本单填了 IE 分钟,自动算人工费和制造费

依据(真数验算过,见第 ② 页):H厂 CBD:人工费 = 69.2 × 0.10833 × 0.6 = 4.498;制造 = 69.2 × 0.10833 × 0.4 = 2.9987。属性 ID:C8_CSM_IETtlMin、C8_CSM_LaborPerM、C8_CSM_LaborCost、C8_CSM_ManCost。

Site.js:放在第 ⑦ 段(监听),照搬「审核人」那个验证过的结构

代码(一行一行)这一行在干什么
api.watchAttribute("<成本单Type名>", "C8_CSM_IETtlMin", function (ac, cn, node, id) {盯住 IE 分钟数
var minutes = ac.newValue;刚填的分钟数,例 69.2
var perMin = node.C8_CSM_LaborPerM;同一张单上的每分钟人工费,例 0.10833
if (minutes && perMin) {两个都有值才算(Java 的 if 一样)
var total = minutes * perMin;69.2 × 0.10833 = 7.4966
ac.m_writer写数据
.changeNode(node.$URL)改当前这张成本单
.changeAttribute("C8_CSM_LaborCost", "double", total * 0.6)人工费 = 4.498
.changeAttribute("C8_CSM_ManCost", "double", total * 0.4);制造费 = 2.9987
ac.bRefreshNode = true;刷新
}
return true;必须
});
做之前必须问清:①0.6 / 0.4 谁定的、会不会按客户变(纪要待确认问题 2)——会变就不能写死 ②改了「每分钟人工费」也要重算吗——要的话还得再监听一个字段 ③这种计算放 Site.js、C8 表达式,还是 Java 后端 plmservice。

同一件事,用 C8 表达式写(课件 6 第 28 页的 changeAttributeExp)我的推断

ac.m_writer.changeNode(node.$URL)
  .changeAttributeExp("C8_CSM_LaborCost", "C8_CSM_IETtlMin * C8_CSM_LaborPerM * 0.6", false);

isOneTimeExp = false:不是只算一次,字段变了会跟着变(按课件「true 表示一次性表达式」反推)。

上线前核对(知识库「Update 前核对清单」)

  1. Site.xml 用 NodeRef,没复制整个 Node
  2. 新 Heading / Action 跟原有的并列,没覆盖
  3. Id 在 Site.xml、Site.js、en.js 三处一字不差
  4. OnAction="Site.X" 对应 return 里的 X
  5. JS 函数之间有逗号;define / return 括号完整
  6. enum 值带枚举名前缀
  7. 原字段、原按钮、原翻译都还在
  8. 三个文件都 Ctrl+S(标题栏没有 *)
  9. 只跑一次 Update;Full Update 可能 3–4 分钟才弹 Yes/No,别重复点

出问题先查什么

现象先查
显示内部 Id(如 C8_ReviewApproval)en.js 没保存;Id 拼错
字段在列表里找不到要走 Manage Custom Views → Attributes 加,表格「三根竖条」菜单加不了新字段
字段在详情页不显示知识库未解决问题,先记下来问人
下拉改值没反应枚举是不是 枚举名:Key 完整写法
按钮点了没反应OnAction 名字和 return 里的不一致;return 里少逗号
按钮还在(想隐藏的)你是管理员账号(hideRevisionAction 对管理员无效)
Update 报错XML 没闭合、JS 括号/逗号
监听没触发字段是图片/文件类型(监听不到)

待问清单(攒着一次问)

  1. BOM 行、工序行、成本单在 C8 里的 Type 名
  2. 币种枚举的完整写法
  3. 人工 0.6 / 制造 0.4 谁定、会不会按客户变;自动计算放 Site.js、表达式还是后端
  4. 按钮里什么时候必须写 execute({sync:true})
  5. 没有 C8_ 前缀的 Id(Code、LossPct、PcsPerHr)是不是 C8 标准字段
  6. HB-XXXXX 工段工时文件「明細」页为什么是另一个款
  7. BOM 型板说明里「放大格」是什么意思
  8. 内部估价用量 0.154 和客户表 0.209 的换算规则
  9. C8 里的材料编码要不要沿用H厂 2012 料号规则
  10. 我在这个项目里会不会亲手改 Site.xml,还是只做调研整理
← ⑥ en.js 全讲

出处:带教同事《箱包属性信息整理 V1.0》、H厂.zip、会议纪要 10-08、课件 5《前端开发 xml》、课件 6《js》、知识库 C8配置规则_7.8.1。