# 运维

# EQL CLI

通过通用查询语言管理单据,可以查询索引,单据字段,卡片字段等

查询语句实例

select dynamics.idNumber_keyword from doc where docType='RAD1';
select data.customer.idNumber from doc where docType='RAD1'
1
2

更新语句示例

update doc set data.customer.idCardAdress='哈哈我该地址了' where docId='8d3f96ef-402883b1-018d-3fab8afc-000e'  

1
2

TIP

执行更新语句需要十分谨慎。该更新记录会被记录在单据变更历史中

# 测试方法调用

该菜单可以执行代码中的方法
执行示例

nkTestImpl.detail("8d454aaa-ff808081-018d-5983fc97-11bb")
1

nkTestImpl 是类 NkTestImpl的组件名称,该类继承了NkAbstractTest抽象类
如果有自定义的实现方法,都要继承NkAbstractTest抽象类
该类的方法可以将所有的日志信息显示在结果中

代码示例

@Component("nkTestImpl")
public class NkTestImpl extends NkAbstractTest {
    @Autowired
    @SuppressWarnings("all")
    protected NkDocEngine docEngine;

    public List<String> detail(String docId) {
        LogRunResult<Object> sb = MemoryLogRunner.run(() -> {
            docEngine.detail(docId);
            log.info("显示日志");
            return null;
        });
        return sb.getLogs();
    }

    public List<String> 详情(String docId) {
        LogRunResult<Object> sb = MemoryLogRunner.run(() -> {
            docEngine.detail(docId);
            log.info("显示日志");
            return null;
        });
        return sb.getLogs();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 计划任务

计划任务菜单是对定时任务的管理,所有的定时任务都要继承NkAbstractQuartzJob

# 添加计划

配置name字段和cron字段可以为该定时任务增加执行计划,添加之后,可以在执行计划显示栏中看到下一次的执行时间
option字段是对定时任务入参的配置,若没有参数,则填写{},添加之后可以单次执行该任务

# 执行计划

点击详情可查看该执行计划近100次执行情况的描述
若某一次的执行记录的状态为FAILED,点击可以看到错误的详情日志

代码示例

@Component
@NkScheduled(cron = "0 45 15 * * ?")
@NkNote("任务测试")
@Slf4j
public class NkJobChangeDocTest extends NkAbstractQuartzJob  {
    @Autowired
    private NkDocEngine docEngine;
    @Autowired
    private NkSecurityRunner runner;
    @Autowired
    private DocHMapper docHMapper;
    @Override
    public void doExecute(JobExecutionContext jobExecutionContext, StatusManager function) throws JobExecutionException {
        List<DocH> docIds1 = docHMapper.selectByExample(new DocHExample());
        List<String>  docIds = docIds1.stream().map(DocH::getDocId).collect(Collectors.toList());
        if(docIds!=null){
            runner.returnAsUser("admin",()->{
                docIds.forEach(docId->{
                    // 逐条执行
                    try{
                        docEngine.doUpdate(docId,"",(docHV)->{
                                    System.out.println(1/0);
                                }
                        );
                        function.update(
                                NkJobTriggerStatus.create((docIds.indexOf(docId)+1) * 100 / docIds.size())
                        );
                    }catch(Exception e){
                        log.error(String.format("JOB[%s]发生错误:%s","任务测试",e.getMessage()),e);
                        function.update(
                                NkJobTriggerStatus.create(
                                        (docIds.indexOf(docId)+1) * 100 / docIds.size(),
                                        String.format("修改单据 %s 失败",docId),
                                        e
                                )
                        );
                    }
                });
                return null;
            });
        }
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

# 配置邮箱

任务执行失败可以通过邮箱通知相关人员


nk:
  scheduled:
    email:
      #发送方的邮箱,可以增加昵称:  昵称<XX@qq.com>
      from: XX@qq.com   
      #接收方的邮箱,可以配置多个 
      to:
      - AAA@qq.com    
      - BBB@qq.com    
      
spring:
  mail:
    #邮箱服务,这里是钉钉企业邮箱,也可以用其他服务:smtp.163.com:163邮箱,smtp.126.com:126邮箱,smtp.qq.com:qq邮箱
    host: smtp.qiye.aliyun.com
    #发送方的邮箱,与上面的配置一致
    username: yangfan@newcore.net.cn
    # 设置密码,该处的密码是发送方邮箱开启SMTP的授权码而非密码,钉钉企业邮箱设置版办法,设置-账户安全-开启三方客户端安全密码-生成密码
    password: xxxxx
    default-encoding: UTF-8
    properties:
      mail:
        smtp:
          ssl:
            enable: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25