@things-factory/id-rule-base 6.1.84 → 6.1.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/service/doc-number/doc-number-mutation.js +112 -0
- package/dist-server/service/doc-number/doc-number-mutation.js.map +1 -0
- package/dist-server/service/doc-number/doc-number-query.js +167 -0
- package/dist-server/service/doc-number/doc-number-query.js.map +1 -0
- package/dist-server/service/doc-number/doc-number-type.js +161 -0
- package/dist-server/service/doc-number/doc-number-type.js.map +1 -0
- package/dist-server/service/doc-number/doc-number.js +175 -0
- package/dist-server/service/doc-number/doc-number.js.map +1 -0
- package/dist-server/service/doc-number/index.js +9 -0
- package/dist-server/service/doc-number/index.js.map +1 -0
- package/dist-server/service/id-rule/id-rule-types.js +0 -1
- package/dist-server/service/id-rule/id-rule-types.js.map +1 -1
- package/dist-server/service/id-rule/id-rule.js +3 -33
- package/dist-server/service/id-rule/id-rule.js.map +1 -1
- package/dist-server/service/index.js +4 -2
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/server/service/doc-number/doc-number-mutation.ts +121 -0
- package/server/service/doc-number/doc-number-query.ts +145 -0
- package/server/service/doc-number/doc-number-type.ts +116 -0
- package/server/service/doc-number/doc-number.ts +164 -0
- package/server/service/doc-number/index.ts +7 -0
- package/server/service/id-rule/id-rule-types.ts +2 -3
- package/server/service/id-rule/id-rule.ts +3 -35
- package/server/service/index.ts +4 -2
- package/translations/en.json +15 -0
- package/translations/ja.json +15 -0
- package/translations/ko.json +16 -1
- package/translations/ms.json +16 -1
- package/translations/zh.json +16 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/id-rule-base",
|
|
3
|
-
"version": "6.1.
|
|
3
|
+
"version": "6.1.87",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@types/codemirror": "^5.60.5"
|
|
35
35
|
},
|
|
36
|
-
"gitHead": "
|
|
36
|
+
"gitHead": "7bd2bd5ae49b9a2d60383bdb0022bc0227fd094e"
|
|
37
37
|
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
|
|
2
|
+
import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'
|
|
3
|
+
import { In } from 'typeorm'
|
|
4
|
+
import { DocNumber } from './doc-number'
|
|
5
|
+
import { NewDocNumber, DocNumberPatch } from './doc-number-type'
|
|
6
|
+
import { Domain, getRepository } from '@things-factory/shell'
|
|
7
|
+
import { User } from '@things-factory/auth-base'
|
|
8
|
+
|
|
9
|
+
@Resolver(DocNumber)
|
|
10
|
+
export class DocNumberMutation {
|
|
11
|
+
@Directive('@transaction')
|
|
12
|
+
@Mutation(returns => DocNumber, { description: 'To create new DocNumber' })
|
|
13
|
+
async createDocNumber(@Arg('docNumber') docNumber: NewDocNumber, @Ctx() context: any): Promise<DocNumber> {
|
|
14
|
+
const { domain, user, tx } = context.state
|
|
15
|
+
|
|
16
|
+
return await tx.getRepository(DocNumber).save({
|
|
17
|
+
...docNumber,
|
|
18
|
+
domain,
|
|
19
|
+
creator: user,
|
|
20
|
+
updater: user
|
|
21
|
+
})
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@Directive('@transaction')
|
|
25
|
+
@Mutation(returns => DocNumber, { description: 'To modify DocNumber information' })
|
|
26
|
+
async updateDocNumber(
|
|
27
|
+
@Arg('id') id: string,
|
|
28
|
+
@Arg('patch') patch: DocNumberPatch,
|
|
29
|
+
@Ctx() context: any
|
|
30
|
+
): Promise<DocNumber> {
|
|
31
|
+
const { domain, user, tx } = context.state
|
|
32
|
+
|
|
33
|
+
const repository = tx.getRepository(DocNumber)
|
|
34
|
+
const docNumber = await repository.findOne(
|
|
35
|
+
{
|
|
36
|
+
where: { domain: { id: domain.id }, id },
|
|
37
|
+
relations: ['domain','updater','creator']
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
return await repository.save({
|
|
42
|
+
...docNumber,
|
|
43
|
+
...patch,
|
|
44
|
+
updater: user
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@Directive('@transaction')
|
|
49
|
+
@Mutation(returns => [DocNumber], { description: "To modify multiple DocNumbers' information" })
|
|
50
|
+
async updateMultipleDocNumber(
|
|
51
|
+
@Arg('patches', type => [DocNumberPatch]) patches: DocNumberPatch[],
|
|
52
|
+
@Ctx() context: any
|
|
53
|
+
): Promise<DocNumber[]> {
|
|
54
|
+
const { domain, user, tx } = context.state
|
|
55
|
+
|
|
56
|
+
let results = []
|
|
57
|
+
const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
|
|
58
|
+
const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
|
|
59
|
+
const docNumberRepo = tx.getRepository(DocNumber)
|
|
60
|
+
|
|
61
|
+
if (_createRecords.length > 0) {
|
|
62
|
+
for (let i = 0; i < _createRecords.length; i++) {
|
|
63
|
+
const newRecord = _createRecords[i]
|
|
64
|
+
|
|
65
|
+
const result = await docNumberRepo.save({
|
|
66
|
+
...newRecord,
|
|
67
|
+
domain,
|
|
68
|
+
creator: user,
|
|
69
|
+
updater: user
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
results.push({ ...result, cuFlag: '+' })
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (_updateRecords.length > 0) {
|
|
77
|
+
for (let i = 0; i < _updateRecords.length; i++) {
|
|
78
|
+
const updRecord = _updateRecords[i]
|
|
79
|
+
const docNumber = await docNumberRepo.findOne({
|
|
80
|
+
where: { domain: { id: domain.id }, id:updRecord.id },
|
|
81
|
+
relations: ['domain','updater','creator']
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
const result = await docNumberRepo.save({
|
|
85
|
+
...docNumber,
|
|
86
|
+
...updRecord,
|
|
87
|
+
updater: user
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
results.push({ ...result, cuFlag: 'M' })
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return results
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@Directive('@transaction')
|
|
98
|
+
@Mutation(returns => Boolean, { description: 'To delete DocNumber' })
|
|
99
|
+
async deleteDocNumber(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {
|
|
100
|
+
const { domain, tx, user } = context.state
|
|
101
|
+
await tx.getRepository(DocNumber).remove({ domain, id, updater:user })
|
|
102
|
+
return true
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@Directive('@transaction')
|
|
106
|
+
@Mutation(returns => Boolean, { description: 'To delete multiple docNumbers' })
|
|
107
|
+
async deleteDocNumbers(
|
|
108
|
+
@Arg('ids', type => [String]) ids: string[],
|
|
109
|
+
@Ctx() context: any
|
|
110
|
+
): Promise<boolean> {
|
|
111
|
+
const { domain, tx, user } = context.state
|
|
112
|
+
|
|
113
|
+
let delEntitis = ids.map(id=>{
|
|
114
|
+
return {domain,id,updater:user}
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
await tx.getRepository(DocNumber).remove(delEntitis)
|
|
118
|
+
|
|
119
|
+
return true
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
|
|
2
|
+
import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
|
|
3
|
+
import { ListParam, convertListParams, getRepository, getQueryBuilderFromListParams } from '@things-factory/shell'
|
|
4
|
+
import { DocNumber } from './doc-number'
|
|
5
|
+
import { DocNumberList } from './doc-number-type'
|
|
6
|
+
|
|
7
|
+
import { User } from '@things-factory/auth-base'
|
|
8
|
+
import { Domain } from '@things-factory/shell'
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@Resolver(DocNumber)
|
|
12
|
+
export class DocNumberQuery {
|
|
13
|
+
@Query(returns => DocNumber, { description: 'To fetch a DocNumber' })
|
|
14
|
+
async docNumber(@Arg('id') id: string, @Ctx() context: any): Promise<DocNumber> {
|
|
15
|
+
const { domain } = context.state
|
|
16
|
+
return await getRepository(DocNumber).findOne({
|
|
17
|
+
where: { domain: { id: domain.id }, id }
|
|
18
|
+
})
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@Query(returns => DocNumberList, { description: 'To fetch multiple DocNumbers' })
|
|
22
|
+
async docNumbers(@Args() params: ListParam, @Ctx() context: any): Promise<DocNumberList> {
|
|
23
|
+
const { domain } = context.state
|
|
24
|
+
|
|
25
|
+
const queryBuilder = getQueryBuilderFromListParams({
|
|
26
|
+
domain,
|
|
27
|
+
params,
|
|
28
|
+
repository: await getRepository(DocNumber)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
const [items, total] = await queryBuilder.getManyAndCount()
|
|
32
|
+
return { items, total }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@Query(returns => DocNumber, { description: 'To generate a new DocNumber' })
|
|
36
|
+
async getNewDocNumber(@Arg('id') id: string, @Ctx() context: any): Promise<DocNumber> {
|
|
37
|
+
const { domain } = context.state
|
|
38
|
+
|
|
39
|
+
// 1. find one by id - TODO by Lock
|
|
40
|
+
let docNumber = await getRepository(DocNumber).findOne({
|
|
41
|
+
where: { domain: { id: domain.id }, id }
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
// 2. find one by code - TODO by Lock
|
|
45
|
+
if(docNumber == null) {
|
|
46
|
+
docNumber = await getRepository(DocNumber).findOne({
|
|
47
|
+
where: { domain: { id: domain.id }, code : id }
|
|
48
|
+
})
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 3. TODO throw exception
|
|
52
|
+
if(docNumber == null) {
|
|
53
|
+
return null
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// 4. 시퀀스 증가
|
|
57
|
+
let newDocNum = docNumber.currentNo
|
|
58
|
+
|
|
59
|
+
if(docNumber.useDbSeqFlag) {
|
|
60
|
+
// TODO DATABASE SEQUENCE 호출
|
|
61
|
+
newDocNum += 1
|
|
62
|
+
} else {
|
|
63
|
+
newDocNum = docNumber.currentNo ? docNumber.currentNo + 1 : 1
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// 5. 문서 번호 expression 구성
|
|
67
|
+
if(!docNumber.expression) {
|
|
68
|
+
docNumber.updateExpression()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
let expression = docNumber.expression
|
|
72
|
+
|
|
73
|
+
// 6. 시퀀스 번호 사이클 처리
|
|
74
|
+
if(newDocNum > docNumber.endNo) {
|
|
75
|
+
newDocNum = docNumber.startNo
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// 7. 자리수 설정
|
|
79
|
+
let newDocNoStr = newDocNum.toString()
|
|
80
|
+
let docNumLength = newDocNoStr.length
|
|
81
|
+
let docNoDigit = docNumber.seqDigitNum ? docNumber.seqDigitNum : 1
|
|
82
|
+
|
|
83
|
+
// 8. 시퀀스 번호가 시퀀스 번호 사이즈보다 작은 경우 앞에 0을 붙임
|
|
84
|
+
if(docNoDigit > docNumLength) {
|
|
85
|
+
let addZeroCnt = docNoDigit - docNumLength
|
|
86
|
+
for(let i = 0 ; i < addZeroCnt ; i++) {
|
|
87
|
+
newDocNoStr = '0' + newDocNoStr
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// 9. 문서 번호 구성
|
|
92
|
+
let newDocNumber = expression.replace('${SEQ}', newDocNoStr)
|
|
93
|
+
let docUpdateInterval = docNumber.updateInterval
|
|
94
|
+
if(docUpdateInterval && docUpdateInterval != 'NONE') {
|
|
95
|
+
const today = new Date();
|
|
96
|
+
let todayStr = today.getFullYear() + (today.getMonth() > 9 ? '' + today.getMonth() + 1 : '0' + today.getMonth() + 1) + today.getDate()
|
|
97
|
+
let intervalVal = ''
|
|
98
|
+
|
|
99
|
+
if(docUpdateInterval == 'yy') {
|
|
100
|
+
intervalVal = todayStr.substring(2, 4)
|
|
101
|
+
|
|
102
|
+
} else if(docUpdateInterval == 'yyyy') {
|
|
103
|
+
intervalVal = todayStr.substring(0, 4)
|
|
104
|
+
|
|
105
|
+
} else if(docUpdateInterval == 'yyMM') {
|
|
106
|
+
intervalVal = todayStr.substring(2, 6)
|
|
107
|
+
|
|
108
|
+
} else if(docUpdateInterval == 'yyyyMM') {
|
|
109
|
+
intervalVal = todayStr.substring(0, 6)
|
|
110
|
+
|
|
111
|
+
} else if(docUpdateInterval == 'yyMMdd') {
|
|
112
|
+
intervalVal = todayStr.substring(2, 8)
|
|
113
|
+
|
|
114
|
+
} else if(docUpdateInterval == 'yyyyMMdd') {
|
|
115
|
+
intervalVal = todayStr
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
newDocNumber = newDocNumber.replace('${' + docUpdateInterval + '}', intervalVal)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// 10. 현재 시퀀스 번호 저장
|
|
122
|
+
docNumber.domain = domain
|
|
123
|
+
docNumber.currentNo = newDocNum
|
|
124
|
+
docNumber.lastDocNumber = newDocNumber
|
|
125
|
+
await getRepository(DocNumber).save(docNumber)
|
|
126
|
+
|
|
127
|
+
// 11. 최종
|
|
128
|
+
return docNumber
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
@FieldResolver(type => Domain)
|
|
132
|
+
async domain(@Root() docNumber: DocNumber): Promise<Domain> {
|
|
133
|
+
return await getRepository(Domain).findOneBy({id:docNumber.domainId})
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@FieldResolver(type => User)
|
|
137
|
+
async creator(@Root() docNumber: DocNumber): Promise<User> {
|
|
138
|
+
return await getRepository(User).findOneBy({id:docNumber.creatorId})
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@FieldResolver(type => User)
|
|
142
|
+
async updater(@Root() docNumber: DocNumber): Promise<User> {
|
|
143
|
+
return await getRepository(User).findOneBy({id:docNumber.updaterId})
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
|
|
2
|
+
import { ObjectType, Field, InputType, Int, ID, Float, registerEnumType } from 'type-graphql'
|
|
3
|
+
import { ObjectRef } from '@things-factory/shell'
|
|
4
|
+
import { DocNumber } from './doc-number'
|
|
5
|
+
|
|
6
|
+
@InputType()
|
|
7
|
+
export class NewDocNumber {
|
|
8
|
+
|
|
9
|
+
@Field({ nullable: false })
|
|
10
|
+
code: string
|
|
11
|
+
|
|
12
|
+
@Field({ nullable: false })
|
|
13
|
+
description: string
|
|
14
|
+
|
|
15
|
+
@Field(type => Int, { nullable: true })
|
|
16
|
+
startNo: number
|
|
17
|
+
|
|
18
|
+
@Field(type => Int, { nullable: true })
|
|
19
|
+
endNo: number
|
|
20
|
+
|
|
21
|
+
@Field(type => Int, { nullable: true })
|
|
22
|
+
currentNo?: number
|
|
23
|
+
|
|
24
|
+
@Field({ nullable:true })
|
|
25
|
+
prefix?: string
|
|
26
|
+
|
|
27
|
+
@Field({ nullable:true })
|
|
28
|
+
suffix?: string
|
|
29
|
+
|
|
30
|
+
@Field({ nullable: true })
|
|
31
|
+
updateInterval?: string
|
|
32
|
+
|
|
33
|
+
@Field({ nullable: true })
|
|
34
|
+
useDbSeqFlag?: boolean
|
|
35
|
+
|
|
36
|
+
@Field({ nullable: false })
|
|
37
|
+
seqName: string
|
|
38
|
+
|
|
39
|
+
@Field(type => Int, { nullable: true })
|
|
40
|
+
seqDigitNum?: number
|
|
41
|
+
|
|
42
|
+
@Field({ nullable: true })
|
|
43
|
+
separator?: string
|
|
44
|
+
|
|
45
|
+
@Field({ nullable: true })
|
|
46
|
+
expression?: string
|
|
47
|
+
|
|
48
|
+
@Field({ nullable: true })
|
|
49
|
+
lastDocNumber?: string
|
|
50
|
+
|
|
51
|
+
@Field({ nullable: true })
|
|
52
|
+
activeFlag?: boolean
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@InputType()
|
|
56
|
+
export class DocNumberPatch {
|
|
57
|
+
@Field(type => ID, { nullable: true })
|
|
58
|
+
id?: string
|
|
59
|
+
|
|
60
|
+
@Field({ nullable: true })
|
|
61
|
+
code?: string
|
|
62
|
+
|
|
63
|
+
@Field({ nullable: true })
|
|
64
|
+
description?: string
|
|
65
|
+
|
|
66
|
+
@Field(type => Int, { nullable: true })
|
|
67
|
+
startNo?: number
|
|
68
|
+
|
|
69
|
+
@Field(type => Int, { nullable: true })
|
|
70
|
+
endNo?: number
|
|
71
|
+
|
|
72
|
+
@Field(type => Int, { nullable: true })
|
|
73
|
+
currentNo?: number
|
|
74
|
+
|
|
75
|
+
@Field({ nullable:true })
|
|
76
|
+
prefix?: string
|
|
77
|
+
|
|
78
|
+
@Field({ nullable:true })
|
|
79
|
+
suffix?: string
|
|
80
|
+
|
|
81
|
+
@Field({ nullable: true })
|
|
82
|
+
updateInterval?: string
|
|
83
|
+
|
|
84
|
+
@Field({ nullable: true })
|
|
85
|
+
useDbSeqFlag?: boolean
|
|
86
|
+
|
|
87
|
+
@Field({ nullable: true })
|
|
88
|
+
seqName?: string
|
|
89
|
+
|
|
90
|
+
@Field(type => Int, { nullable: true })
|
|
91
|
+
seqDigitNum?: number
|
|
92
|
+
|
|
93
|
+
@Field({ nullable: true })
|
|
94
|
+
separator?: string
|
|
95
|
+
|
|
96
|
+
@Field({ nullable: true })
|
|
97
|
+
expression?: string
|
|
98
|
+
|
|
99
|
+
@Field({ nullable: true })
|
|
100
|
+
lastDocNumber?: string
|
|
101
|
+
|
|
102
|
+
@Field({ nullable: true })
|
|
103
|
+
activeFlag?: boolean
|
|
104
|
+
|
|
105
|
+
@Field()
|
|
106
|
+
cuFlag: string
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@ObjectType()
|
|
110
|
+
export class DocNumberList {
|
|
111
|
+
@Field(type => [DocNumber])
|
|
112
|
+
items: DocNumber[]
|
|
113
|
+
|
|
114
|
+
@Field(type => Int)
|
|
115
|
+
total: number
|
|
116
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
|
|
2
|
+
import {
|
|
3
|
+
CreateDateColumn,
|
|
4
|
+
UpdateDateColumn,
|
|
5
|
+
DeleteDateColumn,
|
|
6
|
+
Entity,
|
|
7
|
+
Index,
|
|
8
|
+
Column,
|
|
9
|
+
RelationId,
|
|
10
|
+
ManyToOne,
|
|
11
|
+
PrimaryGeneratedColumn,
|
|
12
|
+
VersionColumn,
|
|
13
|
+
BeforeInsert
|
|
14
|
+
} from 'typeorm'
|
|
15
|
+
import { ObjectType, Field, Int, ID, Float, registerEnumType } from 'type-graphql'
|
|
16
|
+
|
|
17
|
+
import { User } from '@things-factory/auth-base'
|
|
18
|
+
import { Domain } from '@things-factory/shell'
|
|
19
|
+
|
|
20
|
+
@Entity('doc_numbers')
|
|
21
|
+
@Index('ix_doc_number_0', (docNumber: DocNumber) => [docNumber.domain,docNumber.code], { unique: true })
|
|
22
|
+
@ObjectType({ description: 'Entity for DocNumber' })
|
|
23
|
+
export class DocNumber {
|
|
24
|
+
|
|
25
|
+
@PrimaryGeneratedColumn('uuid')
|
|
26
|
+
@Field(type => ID)
|
|
27
|
+
readonly id: string
|
|
28
|
+
|
|
29
|
+
@Column({ name:'code', type:'character varying', nullable:false , length:30 })
|
|
30
|
+
@Field( { nullable:false })
|
|
31
|
+
code: string
|
|
32
|
+
|
|
33
|
+
@Column({ name:'description', type:'character varying', nullable:false , length:100 })
|
|
34
|
+
@Field( { nullable:false })
|
|
35
|
+
description: string
|
|
36
|
+
|
|
37
|
+
@Column({ name:'prefix', type:'character varying', nullable:true , length:10 })
|
|
38
|
+
@Field( { nullable:true })
|
|
39
|
+
prefix?: string
|
|
40
|
+
|
|
41
|
+
@Column({ name:'suffix', type:'character varying', nullable:true , length:10 })
|
|
42
|
+
@Field( { nullable:true })
|
|
43
|
+
suffix?: string
|
|
44
|
+
|
|
45
|
+
@Column({ name:'start_no', type:'integer', nullable:true })
|
|
46
|
+
@Field(type =>Int, { nullable:true })
|
|
47
|
+
startNo?: number
|
|
48
|
+
|
|
49
|
+
@Column({ name:'end_no', type:'integer', nullable:true })
|
|
50
|
+
@Field(type =>Int, { nullable:true })
|
|
51
|
+
endNo?: number
|
|
52
|
+
|
|
53
|
+
@Column({ name:'current_no', type:'integer', nullable:true })
|
|
54
|
+
@Field(type =>Int, { nullable:true })
|
|
55
|
+
currentNo?: number
|
|
56
|
+
|
|
57
|
+
@Column({ name:'update_interval', type:'character varying', nullable:true , length:30 })
|
|
58
|
+
@Field( { nullable:true })
|
|
59
|
+
updateInterval?: string
|
|
60
|
+
|
|
61
|
+
@Column({ name:'use_db_seq_flag', type:'boolean', nullable:true, default: false})
|
|
62
|
+
@Field( { nullable:true })
|
|
63
|
+
useDbSeqFlag?: boolean
|
|
64
|
+
|
|
65
|
+
@Column({ name:'seq_name', type:'character varying', nullable:true , length:100 })
|
|
66
|
+
@Field( { nullable:true })
|
|
67
|
+
seqName?: string
|
|
68
|
+
|
|
69
|
+
@Column({ name:'seq_digit_num', type:'integer', nullable:false })
|
|
70
|
+
@Field(type =>Int, { nullable:false })
|
|
71
|
+
seqDigitNum: number
|
|
72
|
+
|
|
73
|
+
@Column({ name:'separator', type:'character varying', nullable:true , length:10 })
|
|
74
|
+
@Field( { nullable:true })
|
|
75
|
+
separator?: string
|
|
76
|
+
|
|
77
|
+
@Column({ name:'expression', type:'character varying', nullable:true , length:100 })
|
|
78
|
+
@Field( { nullable:true })
|
|
79
|
+
expression?: string
|
|
80
|
+
|
|
81
|
+
@Column({ name:'last_doc_number', type:'character varying', nullable:true , length:100 })
|
|
82
|
+
@Field( { nullable:true })
|
|
83
|
+
lastDocNumber?: string
|
|
84
|
+
|
|
85
|
+
@Column({ name:'active_flag', type:'boolean', nullable:true ,default:false})
|
|
86
|
+
@Field( { nullable:true })
|
|
87
|
+
activeFlag?: boolean
|
|
88
|
+
|
|
89
|
+
@ManyToOne(type => Domain, {createForeignKeyConstraints: false, nullable: false})
|
|
90
|
+
@Field({ nullable: false })
|
|
91
|
+
domain: Domain
|
|
92
|
+
|
|
93
|
+
@RelationId((docNumber: DocNumber) => docNumber.domain)
|
|
94
|
+
domainId: string
|
|
95
|
+
|
|
96
|
+
@ManyToOne(type => User, {createForeignKeyConstraints: false, nullable: true})
|
|
97
|
+
@Field({ nullable: true })
|
|
98
|
+
creator?: User
|
|
99
|
+
|
|
100
|
+
@RelationId((docNumber: DocNumber) => docNumber.creator)
|
|
101
|
+
creatorId?: string
|
|
102
|
+
|
|
103
|
+
@ManyToOne(type => User, {createForeignKeyConstraints: false, nullable: true})
|
|
104
|
+
@Field({ nullable: true })
|
|
105
|
+
updater?: User
|
|
106
|
+
|
|
107
|
+
@RelationId((docNumber: DocNumber) => docNumber.updater)
|
|
108
|
+
updaterId?: string
|
|
109
|
+
|
|
110
|
+
@CreateDateColumn()
|
|
111
|
+
@Field({ nullable: true })
|
|
112
|
+
createdAt?: Date
|
|
113
|
+
|
|
114
|
+
@UpdateDateColumn()
|
|
115
|
+
@Field({ nullable: true })
|
|
116
|
+
updatedAt?: Date
|
|
117
|
+
|
|
118
|
+
@BeforeInsert()
|
|
119
|
+
updateExpression() {
|
|
120
|
+
if(!this.expression || this.expression.length == 0) {
|
|
121
|
+
if(!this.startNo || this.startNo < 1) {
|
|
122
|
+
this.startNo = 1
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if(!this.endNo || this.endNo <= 1) {
|
|
126
|
+
let maxNo = ''
|
|
127
|
+
for(let i = 0 ; i < this.seqDigitNum ; i++) {
|
|
128
|
+
maxNo = maxNo + '9'
|
|
129
|
+
}
|
|
130
|
+
this.endNo = Number(maxNo)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
let expr = ''
|
|
134
|
+
|
|
135
|
+
if(this.prefix) {
|
|
136
|
+
expr = this.prefix
|
|
137
|
+
|
|
138
|
+
if(this.separator) {
|
|
139
|
+
expr += this.separator
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if(this.updateInterval && this.updateInterval != 'NONE') {
|
|
144
|
+
expr += '${' + this.updateInterval + '}'
|
|
145
|
+
|
|
146
|
+
if(this.separator) {
|
|
147
|
+
expr += this.separator
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
expr += '${SEQ}'
|
|
152
|
+
|
|
153
|
+
if(this.suffix) {
|
|
154
|
+
if(this.separator) {
|
|
155
|
+
expr += this.separator
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
expr += this.suffix
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
this.expression = expr
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { Field, InputType } from 'type-graphql'
|
|
2
2
|
|
|
3
|
-
import { IdRuleType } from './id-rule'
|
|
4
3
|
|
|
5
4
|
@InputType()
|
|
6
5
|
export class IdRulePatch {
|
|
7
6
|
@Field({ nullable: true })
|
|
8
|
-
type?:
|
|
7
|
+
type?: string
|
|
9
8
|
|
|
10
9
|
@Field({ nullable: true })
|
|
11
10
|
rule?: string
|
|
@@ -14,7 +13,7 @@ export class IdRulePatch {
|
|
|
14
13
|
@InputType()
|
|
15
14
|
export class NewIdRule {
|
|
16
15
|
@Field()
|
|
17
|
-
type:
|
|
16
|
+
type: string
|
|
18
17
|
|
|
19
18
|
@Field()
|
|
20
19
|
rule: string
|
|
@@ -14,32 +14,10 @@ import {
|
|
|
14
14
|
UpdateDateColumn
|
|
15
15
|
} from 'typeorm'
|
|
16
16
|
|
|
17
|
-
import { config } from '@things-factory/env'
|
|
18
17
|
import { Domain } from '@things-factory/shell'
|
|
19
18
|
|
|
20
|
-
const ORMCONFIG = config.get('ormconfig', {})
|
|
21
|
-
const DATABASE_TYPE = ORMCONFIG.type
|
|
22
|
-
|
|
23
|
-
export enum IdRuleType {
|
|
24
|
-
PALLET_ID = 'pallet_id',
|
|
25
|
-
ADJUSTMENT_PALLET_ID = 'adjustment_pallet_id',
|
|
26
|
-
ADJUSTMENT_CARTON_ID = 'adjustment_carton_id',
|
|
27
|
-
INBOUND_PALLET_ID = 'inbound_pallet_id',
|
|
28
|
-
INBOUND_CARTON_ID = 'inbound_carton_id',
|
|
29
|
-
VAS_PALLET_ID = 'vas_pallet_id',
|
|
30
|
-
DO_NUMBER = 'do_number',
|
|
31
|
-
TASK_NO = 'task_number',
|
|
32
|
-
GAN_NUMBER = 'gan_number',
|
|
33
|
-
GRN_NUMBER = 'grn_number',
|
|
34
|
-
RO_NUMBER = 'ro_number',
|
|
35
|
-
PO_NUMBER = 'po_number',
|
|
36
|
-
LOT_NO = 'lot_no'
|
|
37
|
-
}
|
|
38
|
-
|
|
39
19
|
@Entity()
|
|
40
|
-
@Index('ix_id_rule_0', (idRule: IdRule) => [idRule.domain, idRule.type], { unique: true })
|
|
41
20
|
@Index('ix_id_rule_1', (idRule: IdRule) => [idRule.domain])
|
|
42
|
-
@Index('ix_id_rule_2', (idRule: IdRule) => [idRule.type])
|
|
43
21
|
@ObjectType()
|
|
44
22
|
export class IdRule {
|
|
45
23
|
@PrimaryGeneratedColumn('uuid')
|
|
@@ -53,19 +31,9 @@ export class IdRule {
|
|
|
53
31
|
@RelationId((idRule: IdRule) => idRule.domain)
|
|
54
32
|
domainId: string
|
|
55
33
|
|
|
56
|
-
@Column(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
|
|
60
|
-
? 'enum'
|
|
61
|
-
: DATABASE_TYPE == 'oracle'
|
|
62
|
-
? 'varchar2'
|
|
63
|
-
: 'smallint',
|
|
64
|
-
enum: IdRuleType,
|
|
65
|
-
default: IdRuleType.PALLET_ID
|
|
66
|
-
})
|
|
67
|
-
@Field()
|
|
68
|
-
type: IdRuleType
|
|
34
|
+
@Column()
|
|
35
|
+
@Field({ nullable: true })
|
|
36
|
+
type: string
|
|
69
37
|
|
|
70
38
|
@Column()
|
|
71
39
|
@Field()
|
package/server/service/index.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { entities as IdRuleEntities, resolvers as IdRuleResolvers } from './id-rule'
|
|
2
2
|
import { entities as SequenceEntities, resolvers as SequenceResolvers } from './sequence'
|
|
3
|
+
import { entities as DocNumberEntities, resolvers as DocNumberResolvers } from './doc-number'
|
|
3
4
|
|
|
4
5
|
/* EXPORT ENTITY TYPES */
|
|
5
6
|
export * from './id-rule/id-rule'
|
|
6
7
|
/* EXPORT TYPES */
|
|
7
8
|
export * from './id-rule/id-rule-types'
|
|
8
9
|
export * from './sequence/sequence'
|
|
10
|
+
export * from './doc-number/doc-number'
|
|
9
11
|
|
|
10
|
-
export const entities = [...IdRuleEntities, ...SequenceEntities]
|
|
12
|
+
export const entities = [...IdRuleEntities, ...SequenceEntities, ...DocNumberEntities]
|
|
11
13
|
|
|
12
14
|
export const schema = {
|
|
13
|
-
resolverClasses: [...IdRuleResolvers, ...SequenceResolvers]
|
|
15
|
+
resolverClasses: [...IdRuleResolvers, ...SequenceResolvers, ...DocNumberResolvers]
|
|
14
16
|
}
|
package/translations/en.json
CHANGED
|
@@ -1,7 +1,22 @@
|
|
|
1
1
|
{
|
|
2
|
+
"menu.doc-number": "Document Number",
|
|
3
|
+
"title.doc-number": "Document Number",
|
|
2
4
|
"title.ID Rule Editor": "ID Rule Editor",
|
|
3
5
|
"label.arguments": "arguments",
|
|
4
6
|
"label.argument domain description": "domain ID",
|
|
5
7
|
"label.argument seed description": "data for ID combination",
|
|
8
|
+
"label.prefix": "Prefix",
|
|
9
|
+
"label.update_interval": "Update Interval",
|
|
10
|
+
"label.use_db_seq_flag": "Use DB Sequence",
|
|
11
|
+
"label.seq_name": "Sequence Name",
|
|
12
|
+
"label.seq_digit_num": "Sequence Digit Number",
|
|
13
|
+
"label.start_no": "Start No.",
|
|
14
|
+
"label.end_no": "End No.",
|
|
15
|
+
"label.current_no": "Current No.",
|
|
16
|
+
"label.suffix": "Suffix",
|
|
17
|
+
"label.separator": "Separator",
|
|
18
|
+
"label.expression": "Expression",
|
|
19
|
+
"label.last_doc_number": "Last Document Number",
|
|
20
|
+
"label.active_flag": "Active",
|
|
6
21
|
"text.please_save_your_modifications_first": "please save your modifications first"
|
|
7
22
|
}
|