Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

{ "startDate":"20180326 17:56", "observation":"observação da ordem de serviço", "inputs":[ { "sublot":"", "location":"", "task":"0", "serialNumber":"", "destiny":"A", "code":"007", "type":"P", "warehouse":"01", "date":"20180321 17:56", "amount":1, "isDone":true, "unity":"PC", "lot":"", "note":"observação insumo" } ], "plan":"LOCAL", "counter":[ {

Descrição:

Ponto de Entrada para utilização no MNT NG que permite customizações nos processos inclusão, validação e cancelamento das ordens de serviço.

Localização:

SIGAMNT: Atualizações/Controle de Oficina/Ordem de Serviço/Corretiva.

Programa Fonte:

MNTNG.APW

Função:

MNTNG()
Parâmetros:
PosiçãoTipoDescrição
ParamIXB[1]string

ID do local de execução do ponto de entrada.

IDDescrição
CREATED_ORDERApós a inclusão de uma ordem de serviço.
CREATE_VALID_ORDERAntes da inclusão de uma ordem de serviço.
UPDATE_VALID_ORDERAntes da alteração de uma ordem de serviço.
FINISHED_ORDERApós a finalização de uma ordem de serviço.
FINISH_VALID_ORDERValidação antes da finalização de uma ordem de serviço.
CANCEL_VALIDValidação antes do cancelamento de uma ordem de serviço.
CREATED_PLANNED_INPUTApós incluir um insumo previsto.
COUNTER_VALID_FINISHValidação de contador na finalização.
FILTER_PRODUCTFiltro para produtos.

FILTER_EQUIPMENT

Filtro para bens.

FILTER_SERVICE

Filtro para serviços.

FILTER_COSTCENTER

Filtro para centros de custo.

FILTER_FAMILY

Filtro para famílias de bens.

FILTER_TOOL

Filtro para ferramentas.

FILTER_AREA

Filtro para áreas da manutenção.

FILTER_THIRDPART

Filtro para terceiros.

DESCRIPTION_LOCALIZATIONSincronização, ao gerar o arquivo que contém dados dos bens.
FILTER_ORDERFiltro para ordens de serviço.
FILTER_REQUESTFiltro para solicitações de serviço.
ParamIXB[2]obejctObjeto com referência ao webservice.
Retorno:

O ponto de entrada é chamado em vários momentos dentro do fonte, na 2ª posição da estrutura do vetor é passado um ID que identifica qual é este momento. De acordo com o ID o retorno pode ser diferente, como citado na tabela abaixo

Eventos

:

ID
Conteúdo do objeto no 2º parâmetro
TipoDescrição
CREATED_ORDER
/
nullSem retorno.
CREATE_VALID_ORDER
Bloco de código
titleExemplo do conteúdo
linenumberstrue
collapsetrue
stringMotivo quando a validação é negativa. Quando é positivo deve retornar vazio.
UPDATE_VALID_ORDERstringMotivo quando a validação é negativa. Quando é positivo deve retornar vazio.
FINISHED_ORDERnullSem retorno.
FINISH_VALID_ORDERstringMotivo quando a validação é negativa. Quando é positivo deve retornar vazio.
CANCEL_VALIDstringMotivo quando a validação é negativa. Quando é positivo deve retornar vazio.
CREATED_PLANNED_INPUTnullSem retorno.
COUNTER_VALID_FINISHstringMotivo quando a validação é negativa. Quando é positivo deve retornar vazio.
FILTER_PRODUCTstringCondição SQL que será inclusa na cláusula WHERE para tabela Produtos - SB1.
FILTER_EQUIPMENTstringCondição SQL que será inclusa na cláusula WHERE para tabela Bens - ST9.
FILTER_SERVICEstringCondição SQL que será inclusa na cláusula WHERE para tabela Serviços - ST4.
FILTER_COSTCENTERstringCondição SQL que será inclusa na cláusula WHERE para tabela Centro de Custos - CTT.
FILTER_FAMILYstringCondição SQL que será inclusa na cláusula WHERE para tabela Família de Bens - ST6.
FILTER_TOOLstringCondição SQL que será inclusa na cláusula WHERE para tabela Ferramentas - SH4.
FILTER_AREAstringCondição SQL que será inclusa na cláusula WHERE para tabela Área - STD.
FILTER_THIRDPARTstringCondição SQL que será inclusa na cláusula WHERE para tabela Terceiros - SA2.
DESCRIPTION_LOCALIZATIONstringString que será utilizada para localização do bem.
FILTER_ORDERstringCondição SQL que será inclusa na cláusula WHERE para tabela Ordens de Serviço - STJ.
FILTER_REQUESTstringCondição SQL que será inclusa na cláusula WHERE para tabela Solicitações de Serviço - TQB.
Eventos:
IDConteúdo do objeto no 2º parâmetro

CREATED_ORDER / CREATE_VALID_ORDER

Bloco de código
titleExemplo do conteúdo
linenumberstrue
collapsetrue
{  
   "startDate":"20180326 17:56",
   "observation":"observação da ordem de serviço",
   "inputs":[  
      {  
         "sublot":"",
         "location":"",
         "task":"0",
         "serialNumber":"",
         "
datetime
destiny":"
20170128 10:00
A",
         "
value
code":
370
"007",
      
}
   
]
"type":"P",
   
"service
      "warehouse":"
CORG2
01",
   
"endDate
      "date":"
20180326
20180321 17:56",
   
"equipment":"EMPILHADEIRA 002",
      "
code
amount":
"000000"
1,
   
"type":"C",
      "
checklist
isDone":
[
true,
  
      
{
 "unity":"PC",
         "
worker
lot":"
1008
",
         "
isDone
note":
true,
"observação insumo"
      }
   
"task
],
   "plan":"
0
LOCAL",
   "counter":[  
    
"step":"MOTOLE"
  {  
  
}
   
] }

FINISHED_ORDER / FINISH_VALID_ORDER

Bloco de código
titleExemplo do conteúdo
linenumberstrue
collapsetrue
{
  
  
"
startDate
datetime":"
20180326
20170128 
17
10:
56
00",
         "
observation
value":
"observ finaliza"
370
      }
   ],
   "
plan
service":"
000000
CORG2",
   "
order
endDate":"
001008
20180326 17:56",
   "
json
equipment":"
{\"startDate\
EMPILHADEIRA 002",
   "code":
\"20180326 17:56\
"000000",
\"observation\

   "type":
\
"
teste stj\
C",
\"inputs\

   "checklist":[
{\"amount\":1,\"isDone\":true,\"unity\":\"PC\",\"task\":\"0\",\"destiny\":\"A\",\"code\":\"007\",\"type\":\"P\",\"warehouse\":\"01\",\"date\":\"20180321
  
      {  
         "worker":"1008",
         "isDone":true,
         "task":"0",
         "step":"MOTOLE"
      }
   ]
}

FINISHED_ORDER / FINISH_VALID_ORDER


Bloco de código
titleExemplo do conteúdo
linenumberstrue
collapsetrue
{  
   "startDate":"20180326 17:56",
   "observation":"observ finaliza",
   "plan":"000000",
   "order":"001008",
   "json":"{\"startDate\":\"20180326 17:56\",\"
note
observation\":\"teste 
observação insumo
stj\"
}]
,\"
plan\":\"000000\",\"counter
inputs\":[{\"
datetime
amount\":
\"20170128 10:00\"
1,\"
value
isDone\":
370}]
true,\"
service
unity\":\"
CORG2
PC\",\"
endDate
task\":\"
20180326 17:56
0\",\"
equipment
destiny\":\"
EMPILHADEIRA 002
A\",\"code\":\"
001008
007\",\"type\":\"
C
P\",\"
checklist
warehouse\":
[{
\"
worker
01\"
:
,\"
1008
date\"
,
:\"
isDone
20180321 17:56\"
:true
,\"
task
note\":\"
0
teste observação insumo\"}],\"
step
plan\":\"
MOTOLE
000000\
"}]}
",
\"counter\":[
{ "value":370, "datetime":"20180326 18:03" } ], "hourCounter":"18:03", "endDate":"20180326 17:56", "fault":"01" }COUNTER_VALID_FINISH Bloco de código
titleExemplo do conteúdo
collapsetrue
{ "startDate":"20180326 17:55
{\"datetime\":\"20170128 10:00\",\"value\":370}],\"service\":\"CORG2\",\"endDate\":\"20180326 17:56\",\"equipment\":\"EMPILHADEIRA 002\",\"code\":\"001008\",\"type\":\"C\",\"checklist\":[{\"worker\":\"1008\",\"isDone\":true,\"task\":\"0\",\"step\":\"MOTOLE\"}]}",
   "
observation
counter":
"444",
[  
      
"plan":"000000",
{  
   
"order
      "value":
"001007"
370,
    
"json":"{\"startDate\":\
     "datetime":"20180326 
17
18:
55\",\"observation\":\"teste\",\"inputs\":[{\"amount\":1,\"isDone\":true,\"unity\":\"PC\",\"task\":\"0\",\"destiny\":\"A\",\"code\":\"005\",\"type\":\"P\",\"warehouse\":\"01\",\"date\"
03"
      }
   ],
   "hourCounter":"18:03",
   "endDate":"20180326 17:56",
   "fault":"01"
}
COUNTER_VALID_FINISH
Bloco de código
titleExemplo do conteúdo
collapsetrue
{  
   "startDate":"20180326 17:55",
   "observation":"444",
   "plan":"000000",
   "order":"001007",
   "json":"{\"startDate\":\"20180326 17:55\",\"
note
observation\":\"teste\"
}]
,\"
plan
inputs\":[{\"
000000
amount\":1,\"
counter
isDone\":
[{
true,\"
datetime
unity\":\"
20180104 08:05
PC\",\"
value
task\":
1000}]
\"0\",\"
service
destiny\":\"
CORG2
A\",\"
endDate
code\":\"
20180326 17:55
005\",\"
equipment
type\":\"
EMPGEN001
P\",\"
code
warehouse\":\"
001007
01\",\"
type
date\":\"
C
20180326 17:55\",\"
checklist
note\":
[]}", "counter":[ { "value":1001, "datetime":"20180326 18:06" } ], "hourCounter":"18:06", "endDate":
\"teste\"}],\"plan\":\"000000\",\"counter\":[{\"datetime\":\"20180104 08:05\",\"value\":1000}],\"service\":\"CORG2\",\"endDate\":\"20180326 17:55\",
"fault
\"equipment\":\"
01" }CANCEL_VALID
Bloco de código
titleExemplo do conteúdo
collapsetrue
{  
   "message":"observação da ordem de serviço", //observação
   "plan":"000000", //código do plano da ordem
   "order":"001006" //código da ordem de serviço
}
UPDATE_VALID_ORDER Bloco de código
titleExemplo do conteúdo
collapsetrue
{ "plan":"000000", "code":"007822", "counter":[ ], "type":"C", "equipment":"100002", "service":"COR1", "observation":""
EMPGEN001\",\"code\":\"001007\",\"type\":\"C\",\"checklist\":[]}",
   "counter":[  
      {  
         "value":1001,
         "datetime":"20180326 18:06"
      }
   ],
   "
startDate
hourCounter":"
20190708 09
18:
00
06",
   "endDate":"
20190708
20180326 
10
17:
58
55",
   "
checklist
fault":
[ ],
"01"
}
CANCEL_VALID
Bloco de código
titleExemplo do conteúdo
collapsetrue
{  
   "
inputs
message":
[
"observação da ordem de 
{
serviço", //observação
   
"
code
plan":"
S001
000000",
 //código do plano da ordem
   
"
task
order":"
0
001006"
,
 //código da ordem 
de serviço
}
UPDATE_VALID_ORDER
Bloco de código
titleExemplo do conteúdo
collapsetrue
{
   "
amount
plan":
3
"000000",
   
"date
"code":"
20190708 10:00"
007822",
   "
destiny
counter":
"A"
[
],
   
"warehouse
"type":"
01
C",
   
"isDone
"equipment":
true
"100002",
   "
unity
service":"
LT
COR1",
   "
type
observation":"
P
",
   
"note
"startDate":"20190708 09:00",
   
"lot
"endDate":"20190708 10:58",
   
"sublot":"",
"checklist":[

   
"location":""
],
   
"serialNumber":"" },
"inputs":[
      {
         "code":"S001",
         "task":"0",
         "amount":
1.33
3,
         "date":"20190708 
09
10:00",
         "destiny":"A",
         "warehouse":"01",
         "
warehouseRequest
isDone":
""
true,
         "
warehouseItem
unity":"LT",
         "
isDone
type":
false
"P",
         "
unity
note":"
LT
",
         "
type
lot":"
P
",
         "
note
sublot":"",
         "
lot
location":"",
         "
sublot
serialNumber":""
,

      },
     
"location
 {
         "code":"S001",
         "
serialNumber
task":"0",
      
},
   
{
"amount":1.33,
         "
code
date":"
000036
20190708 09:00",
         "
task
destiny":"
0
A",
         "
amount
warehouse":
1.33
"01",
         "
startDate
warehouseRequest":"
20190708 09:38
",
         "
endDate
warehouseItem":"
20190708 10:58
",
         "isDone":false,
         "unity":"
H
LT",
         "type":"
M
P",
         "
percent
note":
0
"",
         "
note
lot":"",
      
}
   
] }

Retorno:

O ponto de entrada é chamado em vários momentos dentro do fonte, na 2ª posição da estrutura do vetor é passado um ID que identifica qual é este momento. De acordo com o ID o retorno pode ser diferente, como citado na tabela abaixo:

IDMOMENTO DE EXECUÇÃO DO PONTO DE ENTRADARETORNOCREATED_ORDERApós a inclusão de uma ordem de serviçoNuloCREATE_VALID_ORDERAntes da inclusão de uma ordem de serviçoString (retorna string com motivo quando a validação é negativa. Quando é positivo deve retornar vazio)UPDATE_VALID_ORDERAntes da alteração de uma ordem de serviçoString (retorna string com motivo quando a validação é negativa. Quando é positivo deve retornar vazio)FINISHED_ORDERApós a finalização de uma ordem de serviçoNuloFINISH_VALID_ORDERValidação antes da finalização de uma ordem de serviçoString (retorna string com motivo quando a validação é negativa. Quando é positivo deve retornar vazio)CANCEL_VALIDValidação antes do cancelamento de uma ordem de serviço

String (retorna string com motivo quando a validação é negativa. Quando é positivo deve retornar vazio)

CREATED_PLANNED_INPUTApós incluir um insumo previstoNuloCOUNTER_VALID_FINISHValidação de contador na finalizaçãoString (retorna string com motivo quando a validação é negativa. Quando é positivo deve retornar vazio)FILTER_PRODUCTFiltro para produtosString que será adicionada à cláusura 'where' para produtos (SB1).

FILTER_EQUIPMENT

Filtro para bensString que será adicionada à cláusura 'where' para bens (ST9).

FILTER_SERVICE

Filtro para serviçosString que será adicionada à cláusura 'where' para serviços (ST4).

FILTER_COSTCENTER

Filtro para centros de custoString que será adicionada à cláusura 'where' para centros de custo (CTT).

FILTER_FAMILY

Filtro para famílias de bens

String que será adicionada à cláusura 'where' para famílias de bens (ST6).

FILTER_TOOL

Filtro para ferramentas

String que será adicionada à cláusura 'where' para ferramentas (SH4).

FILTER_AREA

Filtro para áreas da manutençãoString que será adicionada à cláusura 'where' para área (STD).

FILTER_THIRDPART

Filtro para terceiros

String que será adicionada à cláusura 'where' terceiros (SA2).

DESCRIPTION_LOCALIZATIONSincronização, ao gerar o arquivo que contém dados dos bensString que será utilizada para localização do bem.
"sublot":"",
         "location":"",
         "serialNumber":""
      },
      {
         "code":"000036",
         "task":"0",
         "amount":1.33,
         "startDate":"20190708 09:38",
         "endDate":"20190708 10:58",
         "isDone":false,
         "unity":"H",
         "type":"M",
         "percent":0,
         "note":""
      }
   ]
}
Bloco de código
languagesql
titleExemplo de ponto de entrada mntng.prw
linenumberstrue
collapsetrue
#include "PROTHEUS.ch"
User Function MNTNG()
  
    Local cId := PARAMIXB[1] //Indica o momento da chamada do PE
    Local oWS := PARAMIXB[2] //Objeto com referência ao webservice
    Local oParser
    Local aArea
    Local aAreaSTJ
    Local nInput := 0
    Local aDate
    Local cType
    Local lIsDone
    Local cTask
    Local cCode
    Local nAmount
    Local cOrder
    Local cPlan
    Local aDate
    Local lOk
	Local cAddress := ""
	Local cCodBem  := ""

    If cId == "CREATE_VALID_ORDER" .OR. cId == "UPDATE_VALID_ORDER" //valida inclusão e alteração da ordem
        //Bloco a seguir realiza validações dos insumos
        If FWJsonDeserialize(oWS:GetContent(),@oParser) //Parse da string no formato Json
            If AttIsMemberOf( oParser, "inputs" ) .And. Len( oParser:inputs ) > 0

                cOrder  := IIf( AttIsMemberOf( oParser, 'code' ), oParser:code, '' )
                cPlan   := IIf( AttIsMemberOf( oParser, 'plan'  ), oParser:plan, '000000' )
                //Bloco abaixo realiza validações nos insumos
                For nInput := 1 To Len( oParser:inputs )

                    oInput := oParser:inputs[ nInput ]

                    cType   := IIf( AttIsMemberOf( oInput , 'type'  ), oInput:type, '' )
                    lIsDone := IIf( AttIsMemberOf( oInput , 'isDone'), oInput:isDone, .F. )
                    
                    //Neste exemplo haverá validações somente para produtos realizados
                    If cType != "P" .Or. !lIsDone 
                        Loop
                    EndIf

                    aDate   := { dDatabase, '08:00' }
                    lOk     := .T.

                    If AttIsMemberOf( oInput, "startDate" )
                        aDate := StrTokArr( oInput:startDate, " " )
                    ElseIf AttIsMemberOf( oInput, "date" )
                        aDate := StrTokArr( oInput:date, " " )
                    EndIf
                    aDate := { STOD( aDate[1] ), aDate[2] }
                    
                    //Neste exemplo haverá validações somente quando informar data anterior a data atual
                    If aDate[1] >= dDatabase
                        Loop
                    EndIf

                    cTask   := IIf( AttIsMemberOf( oInput , 'task'), oInput:task, '' )
                    cCode   := IIf( AttIsMemberOf( oInput , 'code'), oInput:code, '' )
                    nAmount := IIf( AttIsMemberOf( oInput , 'amount'), oInput:amount, 0 )

                    If cId == "CREATE_VALID_ORDER"
                        lOk := .F.
                    Else
                        
                        /*Trecho abaixo verifica se o insumo já está gravado no banco
                            caso exista não há necessidade de validação*/

                        dbSelectArea("STL")
                        dbSetOrder( 1 )
                        If !dbSeek( xFilial('STL') + PADR( cOrder, Len( STL->TL_ORDEM ) )+ ;
                                    PADR( cPlan, Len( STL->TL_PLANO ) ) + PADR( cTask, Len( STL->TL_TAREFA ) ) + ;
                                    cType + PADR( cCode, Len( STL->TL_CODIGO ) ) )
                            lOk := .F.
                        Else
                            lOk := .F.
                            //Verificação abaixo para garantir que o insumo não existe no banco
                            While !STL->( Eof() ) .AND. STL->TL_FILIAL + STL->TL_ORDEM + STL->TL_PLANO +;
                                STL->TL_TAREFA + STL->TL_TIPOREG + STL->TL_CODIGO == xFilial('STL') + PADR( cOrder, Len( STL->TL_ORDEM ) )+ ;
                                    PADR( cPlan, Len( STL->TL_PLANO ) ) + PADR( cTask, Len( STL->TL_TAREFA ) ) + ;
                                    cType + PADR( cCode, Len( STL->TL_CODIGO ) )

                                If Val( STL->TL_SEQRELA ) > 0 ; //verifica se é insumo realizado
                                    .And. nAmount == STL->TL_QUANTID //comparação de quantidade
                                    lOk := .T. //já está gravado e não há necessidade de validar
                                    Exit
                                EndIf
                                dbSelectArea("STL")
                                dbSkip()
                            EndDo
                        EndIf
                    EndIf

                    If !lOk
                        Return 'Não é permitido realizar insumos do tipo produto com a data retroativa. ' + ;
                                    'Verifique o insumo/produto ' + cCode + ' data ' + Dtoc( aDate[1] )
                    EndIf

                Next nInput
            EndIf
        EndIf
    ElseIf cId == "CANCEL_VALID" //valida cancelamento da ordem
        If FWJsonDeserialize(oWS:GetContent(),@oParser) //Parse da string no formato Json
            If Empty( oParser:message )//verifica campo observação foi passado vazio
                Return "A observação do cancelamento é obrigatória."
            EndIf
        EndIf
     
	ElseIf cId == "FINISH_VALID_ORDER"
	
		If FWJsonDeserialize(oWS:GetContent(), @oParser)
			If Empty( oParser:observation ) //verifica campo observação foi passado vazio
                Return "Campo observação deve ser informado."
            EndIf
		EndIf
	
    ElseIf cId == "FINISHED_ORDER"       
        If FWJsonDeserialize(oWS:GetContent(), @oParser)
             
            aArea := GetArea()
            aAreaSTJ := STJ->(GetArea())
 
 
            dbSelectArea("STJ")
            dbSetOrder(1)
            If dbSeek(xFilial("STJ") + oParser:order + oParser:plan)
                Reclock("STJ", .F.)
                STJ->TJ_DTPRINI := STJ->TJ_DTMRINI
                STJ->TJ_HOPRINI := STJ->TJ_HOMRINI
                STJ->TJ_DTPRFIM := STJ->TJ_DTMRFIM
                STJ->TJ_HOPRFIM := STJ->TJ_HOMRFIM
                MsUnlock()
            Endif
 
            RestArea(aAreaSTJ)
            RestArea(aArea)
        Endif
         
    ElseIf cId == "FILTER_PRODUCT" //adiciona filtro para busca de produtos
       Return " AND B1_GRUPO = '97'"

	ElseIf cId == "DESCRIPTION_LOCALIZATION" // Altera descrição de localização do bem
    	cCodBem := PARAMIXB[3]

        dbSelectArea("ST9")
        dbSetOrder(1)
        If dbSeek( xFilial("ST9") + cCodBem ) .And. !Empty( ST9->T9_CLIENTE + ST9->T9_LOJACLI )
            cAddress := Posicione("SA1",1,xFilial("SA1") + ST9->T9_CLIENTE + ST9->T9_LOJACLI,"SA1->A1_END")
        EndIf

        Return Alltrim( cAddress )
	EndIf
 
Return

...