import { EntityManager, getEntityManager, Query } from "relaen"; import { NfNode } from "../entity/nfnode"; import { NFProcess } from "../process"; import { INFNextParam, NFNodeCfg } from "../types"; import { NFNode } from "./node"; import { NfUser } from "../entity/nfuser"; import { NFError } from "../error"; import { NFTaskUtil } from "../taskutil"; import { NFUserManager } from "../usermanager"; /** * 任务节点 */ export class NFTaskNode extends NFNode{ /** * 对应实例实体 */ public nfNode:NfNode; /** * 创建任务节点。 * * @param cfg - 节点配置 * @param process - 所属流程 */ constructor(cfg:NFNodeCfg,process:NFProcess){ super(cfg,process); Object.assign(this,cfg); if(cfg.type){ this.type = cfg.type; } } /** * 结束任务(仅落库,不推进流程;推进由 {@link NFProcess.next} 负责)。 * * @param cfg - 办理参数(`userId` / `agree` / `reason`) * @throws `1205` 不是当前办理人 * @throws `1203` 未认领且不是候选人 */ async finish(cfg?:INFNextParam){ const em:EntityManager = await getEntityManager(); const query:Query = em.createQuery(NfNode.name); const node = await query.select("*") .where({"nfProcess":this.process.entity.processId,defId:this.id,endTime:null}) .orderBy({nodeId:"desc"}) .getResult(); if(node){ if(cfg?.userId != null){ const uid = Number(cfg.userId); if(node.assignee != null){ if(Number(node.assignee) !== uid){ await em.close(); throw new NFError("1205"); } }else{ const groups = await NFUserManager.getGroupIdsByUserId(uid); if(!NFTaskUtil.isCandidate(node,uid,groups)){ await em.close(); throw new NFError("1203"); } node.assignee = uid; node.candidateUsers = NFTaskUtil.formatIdList([uid]); } } node.endTime = new Date().getTime(); if(node.startTime){ node.waitTime = node.endTime - node.startTime; } if(cfg){ const agree = cfg.agree ?? cfg.isAgree; if(agree !== undefined){ node.isAgree = agree ? 1 : 0; } node.reason = cfg.reason; if(cfg.userId){ node.nfUser = await NfUser.find(cfg.userId); }else if(node.assignee != null){ node.nfUser = await NfUser.find(node.assignee); } } node.nfProcess = this.process.entity; await node.save(); this.nfNode = node; } await em.close(); } }