- 07:45 [设计时间规划功能](#20240422074500)

- 09:30	[预设1406动议的范例(针对env、error、knowledge的缺陷)](#20240422093000)
- 14:00	[日时间表动态生成](#20240422140000)
- 14:30	[寻找纯文本方式存放的甘特图](#20240422143000)
- 16:00	[准备error、env、knowledge metadata,为自动生成termset metada做准备。](#20240422160000)
This commit is contained in:
Huang,Yonggang 2024-04-22 17:35:44 +08:00
parent 25ddbf9b0b
commit 7afcc718e1
2 changed files with 458 additions and 47 deletions

View File

@ -82,46 +82,57 @@ function makedayplan(date) {
//console.log("wake time:"+waketime);
var draftmetafilename = draftrepopath + date.slice(0, 4) + "/" + date.slice(4, 6) + "/" + "d." + date + ".yaml";
var draftmetadata ;
var draftmetadata;
try {
if (fs.existsSync(draftmetafilename)){
if (fs.existsSync(draftmetafilename)) {
draftmetadata = yaml.load(fs.readFileSync(draftmetafilename, 'utf8'));
}else{
console.log("the draft metadata isn't exist:"+draftmetafilename);
} else {
console.log("the draft metadata isn't exist:" + draftmetafilename);
process.exit();
}
}catch (e) {
} catch (e) {
// failure
console.log("yaml read error" + e);
process.exit();
}
var plan = draftmetadata.plan;
var timeslicename = new Object();
for (var i in draftmetadata.time) {
timeslicename[draftmetadata.time[i].begin] = draftmetadata.time[i].name;
}
var planobj = yaml.load(fs.readFileSync("plan.yaml", 'utf8'));
//var planstr = planobj.dayplan[plan].planstr;
var planstr = `| 时间片 | 时长 | 用途 | 手稿 |
| --- | --- | --- | --- |
`;
for(var i in planobj.dayplan[plan].time){
var timeslice = planobj.dayplan[plan].time[i] ;
for (var i in planobj.dayplan[plan].time) {
var timeslice = planobj.dayplan[plan].time[i];
var beginhour = timeslice.beginhour;
var beginminute = timeslice.beginminute;
var amount = timeslice.amount ;
var endhour = beginhour+ parseInt((beginminute + amount)/60);
var endminute = (beginminute + amount)%60;
var amount = timeslice.amount;
var endhour = beginhour + parseInt((beginminute + amount) / 60);
var endminute = (beginminute + amount) % 60;
var begintime = date + beginhour.toString().padStart(2, '0') + beginminute.toString().padStart(2, '0') + "00";
var draftstr = "";
if(timeslice.namelink != null){
draftstr = "[在线同步]("+timeslice.namelink+")";
if (timeslicename[begintime] != null) {
draftstr = draftstr + timeslicename[begintime] + " ";
}
if(timeslice.type == "work"){
var begintime = date + beginhour.toString().padStart(2, '0') + beginminute.toString().padStart(2, '0') + "00";
if (timeslice.namelink != null) {
draftstr = draftstr + "[在线同步](" + timeslice.namelink + ")";
}
if (timeslice.type == "work") {
var draftfilename = draftrepopath + date.slice(0, 4) + "/" + date.slice(4, 6) + "/" + begintime + ".md";
draftstr = draftstr + " [离线归档](" + draftfilename + ")";
}
planstr = planstr + "| " + beginhour.toString().padStart(2, '0') + ":" + beginminute.toString().padStart(2, '0') + "~" + endhour.toString().padStart(2, '0') + ":" + endminute.toString().padStart(2, '0') + " | " + amount + " | " + timeslice.name + " | " + draftstr + " | \n" ;
planstr = planstr + "| " + beginhour.toString().padStart(2, '0') + ":" + beginminute.toString().padStart(2, '0') + "~" + endhour.toString().padStart(2, '0') + ":" + endminute.toString().padStart(2, '0') + " | " + amount + " | " + timeslice.name + " | " + draftstr + " | \n";
}
//console.log("planstr:\n"+planstr);
@ -130,30 +141,30 @@ function makedayplan(date) {
for (var i in draftmetadata.time) {
var subject = draftmetadata.time[i].subject;
var taskname = draftmetadata.time[i].name;
if(taskname === undefined){
taskname = "无名任务" ;
if (taskname === undefined) {
taskname = "无名任务";
}
var output = draftmetadata.time[i].output;
dayplan = dayplan + "- task:" + subject + " [" + taskname + "](../" + gitpath + output + ")\n";
var begintime = draftmetadata.time[i].begin ;
var beginhour = parseInt((begintime-parseInt(begintime/1000000)*1000000)/10000);
var beginminute = parseInt((begintime-parseInt(begintime/10000)*10000)/100);
var begintime = draftmetadata.time[i].begin;
var beginhour = parseInt((begintime - parseInt(begintime / 1000000) * 1000000) / 10000);
var beginminute = parseInt((begintime - parseInt(begintime / 10000) * 10000) / 100);
var amount = draftmetadata.time[i].amount;
var endhour = beginhour+parseInt((beginminute+amount)/60) ;
var endminute = (beginminute + amount)%60;
var endhour = beginhour + parseInt((beginminute + amount) / 60);
var endminute = (beginminute + amount) % 60;
//console.log(begintime,beginhour,beginminute,amount,endhour,endminute);
var timestr = "## "+beginhour.toString().padStart(2,"0")+":"+beginminute.toString().padStart(2,"0")+" ~ "+endhour.toString().padStart(2,"0")+":"+endminute.toString().padStart(2,"0")+"\n\n"+taskname+"\n\n";
var timestr = "## " + beginhour.toString().padStart(2, "0") + ":" + beginminute.toString().padStart(2, "0") + " ~ " + endhour.toString().padStart(2, "0") + ":" + endminute.toString().padStart(2, "0") + "\n\n" + taskname + "\n\n";
var timeviewfilename = draftrepopath + date.slice(0, 4) + "/" + date.slice(4, 6) + "/" + begintime + ".md";
console.log("time slice draft file name:"+timeviewfilename);
console.log("time slice draft file name:" + timeviewfilename);
console.log(timestr);
fs.writeFileSync(timeviewfilename, timestr);
}
var dayplanfilename = "time/d." + date + ".md";
console.log("dayplan file name:\n"+dayplanfilename+"\ncontent:\n"+dayplan);
console.log("dayplan file name:\n" + dayplanfilename + "\ncontent:\n" + dayplan);
fs.writeFileSync(dayplanfilename, dayplan);
}
@ -162,15 +173,15 @@ function makedaylog(date) {
var month = date.slice(4, 6);
var draftmetafilename = draftrepopath + date.slice(0, 4) + "/" + date.slice(4, 6) + "/" + "d." + date + ".yaml";
var draftmetadata ;
var draftmetadata;
try {
if (fs.existsSync(draftmetafilename)){
if (fs.existsSync(draftmetafilename)) {
draftmetadata = yaml.load(fs.readFileSync(draftmetafilename, 'utf8'));
}else{
console.log("the log isn't exist:"+draftmetafilename);
} else {
console.log("the log isn't exist:" + draftmetafilename);
process.exit();
}
}catch (e) {
} catch (e) {
// failure
console.log("yaml read error" + e);
process.exit();
@ -180,9 +191,40 @@ function makedaylog(date) {
var plan = draftmetadata.plan;
if (plan != null) {
var planobj = yaml.load(fs.readFileSync("plan.yaml", 'utf8'));
var planstr = planobj.dayplan[plan].planstr;
//var planstr = planobj.dayplan[plan].planstr;
daylog = daylog + "根据[ego模型时间接口](https://gitee.com/hyg/blog/blob/master/timeflow.md),今天绑定模版" + plan + "。\n\n" + planstr ;
var timeslicename = new Object();
for (var i in draftmetadata.time) {
timeslicename[draftmetadata.time[i].begin] = draftmetadata.time[i].name;
}
var planstr = `| 时间片 | 时长 | 用途 | 手稿 |
| --- | --- | --- | --- |
`;
for (var i in planobj.dayplan[plan].time) {
var timeslice = planobj.dayplan[plan].time[i];
var beginhour = timeslice.beginhour;
var beginminute = timeslice.beginminute;
var amount = timeslice.amount;
var endhour = beginhour + parseInt((beginminute + amount) / 60);
var endminute = (beginminute + amount) % 60;
var begintime = date + beginhour.toString().padStart(2, '0') + beginminute.toString().padStart(2, '0') + "00";
var draftstr = "";
if ((timeslicename[begintime] != null)&(timeslice.type == "work")) {
draftstr = draftstr + "[" + timeslicename[begintime] + "](#" + begintime + ")" ;
//var draftfilename = draftrepopath + date.slice(0, 4) + "/" + date.slice(4, 6) + "/" + begintime + ".md";
//draftstr = draftstr + " [离线归档](" + draftfilename + ")";
}
planstr = planstr + "| " + beginhour.toString().padStart(2, '0') + ":" + beginminute.toString().padStart(2, '0') + "~" + endhour.toString().padStart(2, '0') + ":" + endminute.toString().padStart(2, '0') + " | " + amount + " | " + timeslice.name + " | " + draftstr + " | \n";
}
daylog = daylog + "根据[ego模型时间接口](https://gitee.com/hyg/blog/blob/master/timeflow.md),今天绑定模版" + plan + "。\n\n" + planstr;
} else {
daylog = daylog + "当天未绑定时间模版"
}
@ -193,10 +235,10 @@ function makedaylog(date) {
//console.log(typeof(timelog.begin));
var hour = timelog.begin.toString().slice(8, 10);
var minute = timelog.begin.toString().slice(10, 12);
var taskname = timelog.name ;
var taskname = timelog.name;
//console.log(taskname);
if(taskname === undefined){
taskname = "无名任务" ;
if (taskname === undefined) {
taskname = "无名任务";
}
indexstr = indexstr + "- " + hour + ":" + minute + "\t[" + taskname + "](#" + timelog.begin + ") \n";
@ -210,7 +252,7 @@ function makedaylog(date) {
//console.log(daylog);
var daylogfilename = "time/d." + date + ".md";
//console.log("daylog file name:\n" + daylogfilename + "\ncontent:\n" + daylog);
console.log("daylog file name:\n" + daylogfilename + "\ncontent:\n" + daylog);
fs.writeFileSync(daylogfilename, daylog);
}

View File

@ -1,7 +1,8 @@
# 20240422
计划
小结
<a id="top"></a>
根据[ego模型时间接口](https://gitee.com/hyg/blog/blob/master/timeflow.md)今天绑定模版1。
| 时间片 | 时长 | 用途 | 手稿 |
@ -11,22 +12,390 @@
| 05:15~06:00 | 45 | 早餐 | |
| 06:00~06:45 | 45 | 会议、自习 | |
| 06:45~07:45 | 60 | 休整 | |
| 07:45~08:45 | 60 | 静默工作 | [在线同步](http://simp.ly/p/xtgD4F) [离线归档](../../draft/2024/04/20240422074500.md) |
| 07:45~08:45 | 60 | 静默工作 | [设计时间规划功能](#20240422074500) |
| 08:45~09:30 | 45 | 休整 | |
| 09:30~11:00 | 90 | 静默工作 | [在线同步](http://simp.ly/p/j1SspP) [离线归档](../../draft/2024/04/20240422093000.md) |
| 09:30~11:00 | 90 | 静默工作 | [预设1406动议的范例针对env、error、knowledge的缺陷](#20240422093000) |
| 11:00~14:00 | 180 | 备餐、午餐午休 | |
| 14:00~14:30 | 30 | 静默工作 | [在线同步](http://simp.ly/p/8t3vlk) [离线归档](../../draft/2024/04/20240422140000.md) |
| 14:30~15:00 | 30 | 静默工作 | [在线同步](http://simp.ly/p/5k9gJy) [离线归档](../../draft/2024/04/20240422143000.md) |
| 14:00~14:30 | 30 | 静默工作 | [日时间表动态生成](#20240422140000) |
| 14:30~15:00 | 30 | 静默工作 | [寻找纯文本方式存放的甘特图](#20240422143000) |
| 15:00~16:00 | 60 | 休整 | |
| 16:00~17:00 | 60 | 静默工作 | [在线同步](http://simp.ly/p/4QDThK) [离线归档](../../draft/2024/04/20240422160000.md) |
| 16:00~17:00 | 60 | 静默工作 | [准备error、env、knowledge metadata为自动生成termset metada做准备。](#20240422160000) |
| 17:00~19:00 | 120 | 晚餐 | |
| 19:00~20:00 | 60 | 讨论、整理提交 | |
---
<a id="index"></a>
- 07:45 [设计时间规划功能](#20240422074500)
- 09:30 [预设1406动议的范例针对env、error、knowledge的缺陷](#20240422093000)
- 14:00 [日时间表动态生成](#20240422140000)
- 14:30 [寻找纯文本方式存放的甘特图](#20240422143000)
- 16:00 [准备error、env、knowledge metadata为自动生成termset metada做准备。](#20240422160000)
---
[top](#top) | [index](#index)
<a id="20240422074500"></a>
## 7:45~8:44
设计时间规划功能
### 需求和流程
- 本季度的时间片估算,假设前两个月:
- 三分之一时间绑定模块二
- 有一个模块三
- 其余绑定模块一
- 不可抗力因素造成缺勤,在第三个月补足。
- 划分各任务的子任务和依赖关系、优先级、期限。
- 设立里程碑、期限。
- 自动排出各时间片的候选子任务可以人工调整如果在界面不好实现就手工编辑metadata
- 在日计划绑定模版自动初始化出draft的markdown和day metadata
- 在季度规划中列出后续时间片和候选任务、里程碑,预估完成时间。可以列在日小结后部。
### 数据结构和算法
- 增加season metadata
- 工作日天数默认60天。
- 日模版的分布默认40天模版一10天模版二10天模版三两组
- 各任务的上期结余,本期预订时间。
- 可以用task metadata中表达各任务的子任务和依赖关系优先级可以增加字段
- 优先级可以统一规划,定义,分配给任务。
- 任务内部可以分配子任务、里程碑的优先级,期限。
- 排序时综合考虑优先级和期限,给出抗风险冗余的总评估。
- 通过合同和共同体,对外提供任务的预估完成时间(及不同报价)。
- alltask metada和view中要区分已完成、进行中、未开始的任务时间分别统计。
- 全局的totaltime、treetotaltime不变
- 增加seasontime字段内容是对象。对象属性有上季度结余时间oldbalance、预订时间order、已提取时间checkout、已申请apply、结余时间balance可转入下一季度
下一步:
- 再斟酌排序算法的实现细节,以免整体架构频繁推倒重构。
- 需要的话先用excel和甘特图内部实践验证。
- 一定要内部使用成熟后再对外使用。
- season 和 alltask.tasklist.seasomtime 的配合。
- season人工编辑代码不编辑。
- alltask代码编辑人工不编辑。读与写之间有足够时间间隔以免底层时序混乱。
[top](#top) | [index](#index)
<a id="20240422093000"></a>
## 9:30~10:59
预设1406动议的范例针对env、error、knowledge的缺陷
- 先针对1406动议人工编辑一套范例。
- 在error metadata中添加interface字段。
- 在knowledge中表达了1406动议可以解决割据问题。
error.1.yaml
```
name: 执行部门陷入割据
id: 1
interface:
entity:
1: 共同体
2: 上级
3: 决策部门
4: 执行部门
asset:
1: 工单
2: 日志
term:
id: name
event:
id:
text: |
出现以下情况之一:
- <entity.3>未界定<entity.4>工作的合规性要求。
- <entity.3>界定了<entity.4>工作的合规性要求。
- <entity.4>成员对指令不进行合规检查,即使不合规也执行。
- <entity.4>成员及下达指令者未按要求填写和提交表单,比如<asset.1><asset.2>
readme: |
- <entity.2>的指令包括对更早指令的掩盖,通过互相包庇产生系统性的对抗。
- <entity.1>曾经对<entity.2>违约,以一定范围内的割据作为抵押物。这是历史上资源紧缺,无法兑现约定报酬的后遗症。
- 把一定范围内的割据作为违约抵押物的情况,解除割据应该同时处理历史欠账。在<entity.1>设立阶段,就要确定是否符合<term.1>,如果符合应该在设立时解决。
```
env.1.yaml
```
name: 原始状态-1
id: 1
error:
- id: 1
readme: |
创始团队缺乏经验,使用的外来模版遗漏了结局问题的章节。
```
knowledge.1.yaml
```
name: 1406解决割据问题
id: 1
envid: 1
termset:
- id: 056e71fb
error:
- id: 1
percent: 50
text: |
- 1406动议可以消除已出现的割据问题。
- 如果是因为资源问题未解决,欠付报酬而以一定范围割据作为抵押物,今后还会出现新的割据问题。这种情况需要同时处理历史欠账,并且根除资源问题。
readme: |
```
- 发现的问题:
- 难以自动识别割据问题、资源问题,这依赖人工核实。因此写入条款,在内部成员之间形成制约,才能触发既定条款,并在内部人员操作时提供后续动议。数据结构应该服务于这个流程,而不是外部人员或者代码直接干预。
- 难以表达解决割据问题之前无效的条款。
- 目标条款: 如果符合附件44执行部门陷入割据的情况则附件14061406动议自动生效。
···
D:\huangyg\git\PSMD\src>node term commit
执行部门陷入割据 0ccddb29
如果割据就启用1406 583d6243
预设1406动议 b3124d50
../data/term.0ccddb29.yaml文件已更新。../data/term.1.yaml可以删除。
../data/term.583d6243.yaml文件已更新。../data/term.2.yaml可以删除。
path replace:term.2.yaml term.583d6243.yaml
path replace:term.1.yaml term.0ccddb29.yaml
旧文件:../data/termset.1.yaml中itemset:2的id:056e71fb未能替换请人工检查。
../data/termset.b3124d50.yaml文件已更新。../data/termset.1.yaml可以删除。
D:\huangyg\git\PSMD\src>node term termset b3124d50
../view/termset.b3124d50.md文件更新内容如下:
1. 如果符合附件44的情况则附件1406自动生效。
附件44. 出现以下情况之一:
- 决策部门未界定执行部门工作的合规性要求。
- 决策部门界定了执行部门工作的合规性要求。
- 执行部门成员对指令不进行合规检查,即使不合规也执行。
- 执行部门成员及下达指令者未按要求填写和提交表单,比如通用工单、日志。
附件1406.
附件1406.1. 在执行部门内,基本制度和劳动合同未定义的事项由经理直接指挥。
附件1406.2. 直接指挥的方式:
- 经理填写通用工单明确事项的处理要求,并交给负责执行的成员;
- 经理制订具体规章明确事项的处理要求,并提交给决策部门备案,决策部门签收后具体规章即生效。执行部门成员根据生效的具体规章自行填写通用工单并执行。
附件1406.3. 经理和执行人员都要向决策部门归档通用工单。执行人员应在收到或自行填写通用工单24小时内归档。经理填写的通用工单归档要求是
- 在决策部门的一个审议周期内每一事项的前3份通用工单应在出具24小时内向决策部门归档
- 在决策部门的一个审议周期内同一事项的第4份通用工单起可以汇总后在审议周期结束前一并归档。
附件1406.4. 决策部门成员应:
- 在审议周期的第10天结束前阅读完上一个审议周期结束前归档的通用工单提交审议报告以及基本制度的修订动议。
- 在审议周期的第20天结束前阅读完其他成员提交的审议报告和基本制度的修订动议提交审议报告。
- 在审议周期结束前对基本制度修订动议进行表决。
---
附件44. readme:
- 下达指令者的指令包括对更早指令的掩盖,通过互相包庇产生系统性的对抗。
- 共同体曾经对下达指令者违约,以一定范围内的割据作为抵押物。这是历史上资源紧缺,无法兑现约定报酬的后遗症。
- 把一定范围内的割据作为违约抵押物的情况,解除割据应该同时处理历史欠账。在共同体设立阶段,就要确定是否符合基本制度,如果符合应该在设立时解决。
附件1406. readme:
1406准确的定位是决策部门的动议套件可以用作其它模型的附件。
附件1406.2. readme:
在使用IT系统时可修改为经理向系统提交通用工单并由系统通知负责执行的成员。
附件1406.3. readme:
- 如果出现重大失误,决策部门可能召开临时会议干预。所以要求及时归档。
- 在使用IT系统时可以由系统实时归档。本条款可以根据情况修订。
附件1406.4. readme:
- 时间按一月一周期安排,只是范例。可以根据基本制度的完善程度自行调节,从一周到一年都可以考虑。
- 基本制度生效后,所规定的工作事项就不再允许经理直接指挥。相应的具体规章也同时失效。
- 基本制度的规定,可能与通用工单规定的相同、相似、相反......
---
···
下一步:
- termset metadata中interface中的term还是映射到字符串而不是同一个termset.item下的sortid。虽然可以人工保持同名但还不是真正互通。也许可以在代码内把它们衔接起来
- termset.item.map中可以映射到同级sortid
- 优先映射到sortid找不到的才映射到interface。
- 分别标注id: {sortid: id} or id: {interfaceid: id}
- 统一映射到interface其中部分与sortid同名。有违interface字段本意对外暴露的接口
- 如果只是定义error-termset-error关系termset能解决error2但是只在error1解决之后有效。那么在termset中添加两个字段就可以了。env-termset-error怎么能表达更广泛的条件组合。它们结合人工选择切入点or锋面可以自动生成定制的入门目录。
[top](#top) | [index](#index)
<a id="20240422140000"></a>
## 14:00~14:29
日时间表动态生成
- 已完成日计划中的时间表。
- 已完成日小结中的时间表。
下一步:
- 整理重复代码,需要时调整数据结构。
[top](#top) | [index](#index)
<a id="20240422143000"></a>
## 14:30~14:59
寻找纯文本方式存放的甘特图
- https://frappe.io/gantt
~~~
var tasks = [
{
id: 'Task 1',
name: 'Redesign website',
start: '2016-12-28',
end: '2016-12-31',
progress: 20,
dependencies: 'Task 2, Task 3',
custom_class: 'bar-milestone' // optional
},
...
]
var gantt = new Gantt("#gantt", tasks);
~~~
- https://www.ganttproject.biz/ 自定义的*.gan是xml文件。也可以导出导入csv文件文档没有找到csv格式历史上有一些bug。
```
<?xml version="1.0" encoding="UTF-8"?><project name="Untitled Gantt Project" company="" webLink="http://" view-date="2024-04-20" view-index="0" gantt-divider-location="351" resource-divider-location="300" version="3.3.3307" locale="zh_CN">
<description/>
<view zooming-state="default:2" id="gantt-chart">
<field id="tpd3" name="名称" width="200" order="0"/>
<field id="tpd4" name="开始日期" width="75" order="1"/>
<field id="tpd5" name="结束日期" width="75" order="2"/>
<field id="tpd15" name="备注" width="20" order="3"/>
<option id="filter.completedTasks" value="false"/>
<option id="filter.dueTodayTasks" value="false"/>
<option id="filter.overdueTasks" value="false"/>
<option id="filter.inProgressTodayTasks" value="false"/>
</view>
<view id="resource-table">
<field id="0" name="名称" width="210" order="0"/>
<field id="1" name="默认角色" width="86" order="1"/>
</view>
<!-- -->
<calendars>
<day-types>
<day-type id="0"/>
<day-type id="1"/>
<default-week id="1" name="default" sun="1" mon="0" tue="0" wed="0" thu="0" fri="0" sat="1"/>
<only-show-weekends value="false"/>
<overriden-day-types/>
<days/>
</day-types>
</calendars>
<tasks empty-milestones="true">
<taskproperties>
<taskproperty id="tpd0" name="type" type="default" valuetype="icon"/>
<taskproperty id="tpd1" name="priority" type="default" valuetype="icon"/>
<taskproperty id="tpd2" name="info" type="default" valuetype="icon"/>
<taskproperty id="tpd3" name="name" type="default" valuetype="text"/>
<taskproperty id="tpd4" name="begindate" type="default" valuetype="date"/>
<taskproperty id="tpd5" name="enddate" type="default" valuetype="date"/>
<taskproperty id="tpd6" name="duration" type="default" valuetype="int"/>
<taskproperty id="tpd7" name="completion" type="default" valuetype="int"/>
<taskproperty id="tpd8" name="coordinator" type="default" valuetype="text"/>
<taskproperty id="tpd9" name="predecessorsr" type="default" valuetype="text"/>
</taskproperties>
<task id="0" uid="cfb128ba2d4a4fd2861da77002fb8f4b" name="raw" meeting="false" start="2024-04-22" duration="1" complete="0" expand="true"/>
<task id="1" uid="3263d29e698d4b44bfcfca068b617d48" name="ego" meeting="false" start="2024-04-22" duration="1" complete="0" expand="true"/>
<task id="2" uid="99f82a958e994c069bb2489ae0304c65" name="PSMD" meeting="false" start="2024-04-23" duration="7" complete="0" expand="true">
<task id="3" uid="062dfe42d33443eba053aa99d62aaf51" name="modeling" meeting="false" start="2024-04-23" duration="2" complete="0" expand="true">
<depend id="5" type="2" difference="0" hardness="Strong"/>
</task>
<task id="5" uid="e5c7a53e088b47028459b68e451ae18e" name="deploy" meeting="false" start="2024-04-25" duration="5" complete="0" expand="true"/>
</task>
<task id="6" uid="441e7f0c8dc64c5593937f732db8832e" name="learn" meeting="false" start="2024-04-22" duration="1" complete="0" expand="true">
<task id="7" uid="9998dbce7d5a40ab921264a116103568" name="js" meeting="false" start="2024-04-22" duration="1" complete="0" expand="true"/>
</task>
</tasks>
<resources/>
<allocations/>
<vacations/>
<previous/>
<roles roleset-name="Default"/>
</project>
```
csv范例
```
"序号",名称,开始日期,结束日期,持续,完成,成本,协调者,前置任务,大纲编号,资源,Assignments,新任务,备注,网页连接,备注
0,raw,2024/4/22,2024/4/22,1,0,0,,,1,,,,,
1,ego,2024/4/22,2024/4/22,1,0,0,,,2,,,,,
2,PSMD,2024/4/23,2024/5/1,7,0,0,,,3,,,"#000000",,
3," modeling",2024/4/23,2024/4/24,2,0,0,,,3.1,,,,,
5," deploy",2024/4/25,2024/5/1,5,0,0,,3,3.2,,,,,
6,learn,2024/4/22,2024/4/22,1,0,0,,,4,,,"#000000",,
7," js",2024/4/22,2024/4/22,1,0,0,,,4.1,,,,,
出错了 (
The header contains a duplicate entry: '备注' in [序号, 名称, 开始日期, 结束日期, 持续, 完成, 成本, 协调者, 前置任务, 大纲编号, 资源, Assignments, 新任务, 备注, 网页连接, 备注]
查看日志
)
```
- https://github.com/DHTMLX/gantt
```
gantt.config.date_format = "%Y-%m-%d %H:%i";
gantt.init("gantt_here");
gantt.parse({
data: [
{id: 1, text: "Project #1", start_date: null, duration: null, parent:0, progress: 0, open: true},
{id: 2, text: "Task #1", start_date: "2019-08-01 00:00", duration:5, parent:1, progress: 1},
{id: 3, text: "Task #2", start_date: "2019-08-06 00:00", duration:2, parent:1, progress: 0.5},
{id: 4, text: "Task #3", start_date: null, duration: null, parent:1, progress: 0.8, open: true},
{id: 5, text: "Task #3.1", start_date: "2019-08-09 00:00", duration:2, parent:4, progress: 0.2},
{id: 6, text: "Task #3.2", start_date: "2019-08-11 00:00", duration:1, parent:4, progress: 0}
],
links:[
{id:1, source:2, target:3, type:"0"},
{id:2, source:3, target:4, type:"0"},
{id:3, source:5, target:6, type:"0"}
]
});
```
[top](#top) | [index](#index)
<a id="20240422160000"></a>
## 16:00~16:59
准备error、env、knowledge metadata为自动生成termset metada做准备。
继续使用上午9:30的分析
### 流程
1. 委托者自述问题受托者评估委托者自身问题以及委托者自述的问题结合两者编辑metadata文件。
- 成熟后委托者可以通过通用的入门目录自行操作产生metadata文件。
1. 受托者提交metadata文件由代码检索后产生解决方案的termset metadata再进一步产生termset view。过程中受托者可以手工编辑termset metadata。
- 可以设置模版文件以产生不同风格的termset的metadata和view。
- 成熟后委托者可以自行操作产生termset view。
### 需求及架构、数据结构
1. 委托者自身问题以及委托者自述的问题都是error和term(set)的组合。因此env metadata还是需要的。
1. knowledge是引用env还是自带error和term(set)组合:应该自带。
1. 可能要表达的knowledge
- 某termset能解决error1但是只在error2解决之后有效。
- 分解成两个knowledge分别表达error2解决和未解决的env检索非常不方便。
- 专门设置必须先解决的前置error字段表达这则knowledge更直观也更容易检索。
- 某termset能解决error1但是只在error2、error3、erro4解决之后才有效。
- 前置error字段是个数组。
1. 参考甘特图的字段名:
- dependencies
- depend
完成error.1 error.2 env.1 knowledge.1 knoeledge.2 metadata需要引用error.cde3c3e2。
下一步:
继续完成这批metadata生成termset metadata的代码范例。
- task:ego [设计时间规划功能](../../../draft/2024/04/20240422074500.md)
- task:PSMD [预设1406动议的范例针对env、error、knowledge的缺陷](../../../draft/2024/04/20240422093000.md)
- task:ego [日时间表动态生成](../../../draft/2024/04/20240422140000.md)
- task:learn [寻找纯文本方式存放的甘特图](../../../draft/2024/04/20240422143000.md)
- task:PSMD [根据error、env、knowledge自动生成termset metada的范例](../../../draft/2024/04/20240422160000.md)