1
0
Fork 0

feat: 가동 비가동 활성화 비활성화

This commit is contained in:
sychoi 2024-04-30 18:08:03 +09:00
parent 366cef22cd
commit 7314c3994d
9 changed files with 359 additions and 116 deletions

View File

@ -128,16 +128,16 @@ button {
// }
// }
.disabled-btn {
background-color: rgba(255, 255, 255, 0.973);
color: #dddddd;
border-color: #e9e9e9;
cursor: default;
.disabled-btn, button[disabled] {
background-color: rgba(255, 255, 255, 0.973) !important;
color: #dddddd !important;
border-color: #e9e9e9 !important;
cursor: default !important;
&:hover {
background-color: rgba(255, 255, 255, 0.973);
color: #dddddd;
border-color: #e9e9e9;
background-color: rgba(255, 255, 255, 0.973) !important;
color: #dddddd !important;
border-color: #e9e9e9 !important;
}
}

View File

@ -102,16 +102,16 @@ button {
color: #cf5b5b;
}
.disabled-btn {
background-color: rgba(255, 255, 255, 0.973);
color: #dddddd;
border-color: #e9e9e9;
cursor: default;
.disabled-btn, button[disabled] {
background-color: rgba(255, 255, 255, 0.973) !important;
color: #dddddd !important;
border-color: #e9e9e9 !important;
cursor: default !important;
}
.disabled-btn:hover {
background-color: rgba(255, 255, 255, 0.973);
color: #dddddd;
border-color: #e9e9e9;
.disabled-btn:hover, button[disabled]:hover {
background-color: rgba(255, 255, 255, 0.973) !important;
color: #dddddd !important;
border-color: #e9e9e9 !important;
}
.tab-btn {

File diff suppressed because one or more lines are too long

View File

@ -4,9 +4,10 @@
class Tb_main_class {
constructor(container) {
let _this = this;
this.ajaxUrl = "./reg_plan.ajax.php";
this.tbList = "";
this.lastGroupId = 1;
_this.lastGroupId = 0;
this.container = document.querySelector(container);
this.table = this.container.querySelector(".hy-table");
// this.upBtn = this.container.querySelector(".up-btn") || "";
@ -16,14 +17,14 @@ class Tb_main_class {
}
/*
* @Overview 생산계획등록
* @Parameter DATABASE로부터 받은 데이터
* @function DB 데이터 가공하여 바인딩.
*/
manageData(data) {
// console.log(data);
let _this = this;
let arr = new Array();
const result = Object.groupBy(data.data, ({ SEQ_NO }) => SEQ_NO)
@ -43,6 +44,7 @@ class Tb_main_class {
tempITEM[`AM_PLAN_QTY_${date}`] = rst.AMITEM
tempITEM[`PM_PLAN_QTY_${date}`] = rst.PMITEM
tempITEM[`NI_PLAN_QTY_${date}`] = rst.NIITEM
_this.lastGroupId = parseInt(rst.SEQ_NO);
return tempITEM;
})
@ -57,6 +59,7 @@ class Tb_main_class {
tempQTY[`AM_PLAN_QTY_${date}`] = rst.AMQTY
tempQTY[`PM_PLAN_QTY_${date}`] = rst.PMQTY
tempQTY[`NI_PLAN_QTY_${date}`] = rst.NIQTY
_this.lastGroupId = parseInt(rst.SEQ_NO);
return tempQTY;
})
@ -71,6 +74,7 @@ class Tb_main_class {
tempPRD[`AM_PLAN_QTY_${date}`] = rst.AMPRD
tempPRD[`PM_PLAN_QTY_${date}`] = rst.PMPRD
tempPRD[`NI_PLAN_QTY_${date}`] = rst.NIPRD
_this.lastGroupId = parseInt(rst.SEQ_NO);
return tempPRD;
})
@ -164,12 +168,15 @@ class Tb_main_class {
* @Parameter 없음
*/
setFilter() {
this.tbList ="";
this.init();
this.getMainList(
"getPlanList",
"team_pop",
"product_pop",
"sub_product_pop"
"sub_product_pop",
"plan_date"
);
}
@ -179,27 +186,31 @@ class Tb_main_class {
* @function 기본키, _STATUS_:I 값을 넣은 추가
*/
addRow() {
console.log("test");
this.lastGroupId += 1;
// Tabulator 인스턴스에 데이터 추가
this.tbList.addRow({
groupId: this.lastGroupId + 1,
SEQ_NO: this.lastGroupId,
SEPER: "그룹",
_STATUS_: "I",
SEPER_ID: "GRP",
});
this.tbList.addRow({
groupId: this.lastGroupId + 1,
SEQ_NO: this.lastGroupId,
SEPER: "계획",
_STATUS_: "I",
SEPER_ID: "PLAN",
});
this.tbList.addRow({
groupId: this.lastGroupId + 1,
SEQ_NO: this.lastGroupId,
SEPER: "실적",
_STATUS_: "I",
SEPER_ID: "RST",
});
this.lastGroupId += 1;
}
/*
@ -288,9 +299,78 @@ class Tb_main_class {
* @function _STATUS_ 값이 있는 데이터만 추려서 없으면 생성, 있으면 수정하기
*/
putData() {
// let _this = this;
console.log(this.tbList.getData().filter((row) => row._STATUS_));
// 저장 시 상태 변화 없는 row 요청 X
if (this.tbList.getData().filter((row) => row._STATUS_).length == 0) {
this.getMainList();
return false;
}
// 기본키 중복 확인 및 방지
// _STATUS_ 있는 데이터만 들고와서 PUT하기
const blankObj = [];
const reqData = [];
this.tbList.getRows().forEach((row) => {
// console.log(row.getData('_STATUS_'))
if (row.getData()["_STATUS_"]) {
if (
Object.keys(row._row.data)
.filter((key) => key !== "_STATUS_" && key !== "USE_FLG")
.every((key) => {
const value = row._row.data[key];
return value === undefined || value === "";
})
) {
blankObj.push(row);
} else {
reqData.push(row.getData());
}
}
});
let postdata = {
mode: "getOrderList",
reqdata: JSON.stringify(
this.tbList.getData().filter((row) => row._STATUS_)
),
};
if (blankObj.length !== 0) {
kuls_confirm(
"비어있는 행을 무시하고 진행하시겠습니까?",
"",
() => {
ajax_json({
url: this.ajaxUrl,
data: postdata,
success: function (data) {
if (data.code) {
kuls_success("저장되었습니다.");
this.getMainList();
Tb_insp_list.getMainList();
} else {
this.tbList.getRows().forEach((row) => {
//일부 적용된 열 update 처리
if (data.data.includes(row.getData()["PLANT_CD"])) {
row.update({ _STATUS_: "U" });
}
});
kuls_alert(data.mesg);
}
},
error: function (request, status, error) {
kuls_alert(error.message);
},
complete: function () {},
});
},
() => {
blankObj.forEach((row) => {
row.getElement().classList.add("blank-row");
});
console.log(blankObj);
}
);
}
}
/*
@ -357,17 +437,18 @@ class Tb_main_class {
* @Parameter 없음
*/
init() {
let fields = "";
// field 정의
const fields = [
{ field: "id", title: "id", width: 100, visible: false },
fields = [
{ field: "SEQ_NO", title: "id", width: 100, visible: false },
{ field: "WRK_TEAM", title: "팀", width: 100, editor: "input" },
{ field: "PLAN_FACLT_CD", title: "설비", width: 100, editor: "input" },
{ field: "SEPER", title: "구분", width: 100 },
// 날짜 필드 동적으로 넣을것 오늘부터 7일까지
...this.getDate(),
];
const commonFieldData = {
let commonFieldData = "";
commonFieldData = {
headerSort: false,
vertAlign: "middle",
hozAlign: "center",
@ -375,7 +456,7 @@ class Tb_main_class {
headerHozAlign: "center", //헤더 정렬
headerSortTristate: true, //데이터 정렬 => 정/역/초기화
};
this.tbList ="";
this.tbList = new Tabulator(this.table, {
layout: "fitColumns",
// data: [
@ -415,7 +496,8 @@ class Tb_main_class {
// 추가
["click", "keypress"].forEach((evt) => {
this.addBtn.addEventListener(evt, () => {
this.addRow();
console.log("test");
this.addRow && this.addRow();
});
});
// 삭제
@ -430,6 +512,7 @@ class Tb_main_class {
const filterBtn = document.querySelector("#filter_btn");
filterBtn.addEventListener(evt, () => {
// setFilter 또는 setData
this.getDate();
this.setFilter();
// this.getMainList("getPlanList","team_pop","product_pop","sub_product_pop");
});

View File

@ -11,8 +11,8 @@
<div class="input-container flexcol gap06">
<div class="input-box flexrow flexend flex-1">
<label for="" style="width:80px;">가동시작시간</label>
<input type="text" id="" name="" class="form-control form-control-sm" />
<label for="run-time" style="width:80px;">가동시작시간</label>
<input v-model='dateTime' type="text" id="run-time" name="" class="form-control form-control-sm" />
</div>
</div>

View File

@ -15,10 +15,12 @@ if( !_notAuth("R") ){/************ 권한체크*/
// 설비 고장등록 조회
// 가동 vs 비가동
case "":
$sql = "";
case "getWokerInfo":
$sql = "USP_P_REG_PROD_RESULT_S10";
$params = array(
'WO_NO' => $_REQUEST["WO_NO"] ?: "",
'OP_SEQ' => $_REQUEST["OP_SEQ"] ?: ""
);
$rst = $baseObj->DB->exec($sql,$params);
@ -38,8 +40,84 @@ if( !_notAuth("R") ){/************ 권한체크*/
break;
case "o":
case "getRunInfo":
$sql = "USP_P_REG_PROD_RUN_S10";
$params = array(
'WO_NO' => $_REQUEST["WO_NO"] ?: "",
'WO_SEQ' => $_REQUEST["WO_SEQ"] ?: "",
'EMP_NO' => $_REQUEST["EMP_NO"] ?: "",
);
$rst = $baseObj->DB->exec($sql, $params);
$rows = array();
if( $rst ){
$retval['code'] = true;
while( $row = $baseObj->DB->fetch_array($rst) ){
$rows[] = $row;
}
$retval['data'] = $rows;
$retval['mesg'] = "정상적으로 작동하였습니다.";
}else{
$retval['code'] = false;
}
break;
case "putRunInfo":
if (_notAuth("W")){ break; }
$_REQUEST["reqdata"] = json_decode($_REQUEST['reqdata']);
foreach ($_REQUEST['reqdata'] as $data) {
$data = (array) $data;
if($data['_STATUS_'] == 'U'){
$sql = 'USP_P_REG_PROD_RUN_U10';
$params = array(
// "FACLT_CD" => $data['DEPT_CD']?:"",
// "WO_NO" => $data['DEPT_NM']?:"",
// "WO_SEQ" => $data['BIZ_AREA_CD'] ?: "",
// "WORK_DT" => $data['PAR_DEPT_CD']?:"",
// "RUNSTOP_GB" => $data['EMP_NO']?:"",
// "STOP_CD" => $data['USE_FLG'] ?: "",
// "OPER_ST_TM" => $data['USE_FLG'] ?: "",
// "EMP_NO" => $data['USE_FLG'] ?: "",
// "MAKE_USER_ID" => $GLOBALS['_Umem']['member_id'],
);
}else{
$sql = 'USP_P_REG_PROD_RUN_I10';
$params = array(
"FACLT_CD" => $data['FACLT_CD']?:"",
"WO_NO" => $data['WO_NO']?:"",
"WO_SEQ" => $data['WO_SEQ'] ?: "",
"WORK_DT" => $data['WORK_DT']?:"",
"RUNSTOP_GB" => $data['RUNSTOP_GB']?:"",
"STOP_CD" => $data['STOP_CD'] ?: "",
"OPER_ST_TM" => $data['OPER_ST_TM'] ?: "",
"EMP_NO" => $data['EMP_NO'] ?: "",
"MAKE_USER_ID" => $GLOBALS['_Umem']['member_id'],
);
}
$rst = $baseObj->DB->exec($sql, $params);
}
if ($rst && !$_REQUEST['RS_CODE']) {
$retval['code'] = true;
} else {
$retval['code'] = false;
$retval['mesg'] = $_REQUEST['RS_MSG'];
}
break;
}
}

View File

@ -1,23 +1,70 @@
class SimpleTable {
constructor(fields, getmode, putmode){
this.field = fields;
constructor(fields, getmode, putmode, formData){
// ajax
this.ajaxUrl = './reg_prod_result.ajax.php';
this.getmode = getmode?getmode:'';
this.putmode = putmode?putmode:'';
this.getMode = getmode?getmode:'';
this.putMode = putmode?putmode:'';
// data
this.field = fields;
this.formData = formData;
// element
this.container = document.querySelector(".detail-contents");
this.table = this.container?.querySelector(".hy-table");
this.addBtn = this.container?.querySelector(".add-btn");
}
getMainList(){
// ajax_json({
return ajax_json({
url: this.ajaxUrl,
data: {
mode: this.getMode,
...this.formData
},
success:( data ) => {
if( data.code ){
this.tbList.setData(data.data);
}else{
console.log(data)
}
},
error: (request, status, error)=>{
kuls_alert(error.message);
// })
},
})
}
addRow(){}
putData(){
// ajax_json({})
// addRow(data){
// this.tbList.addRow({...data})
// }
putData(addData, updateData){
const postData = {
mode : this.putMode,
reqdata : JSON.stringify([{...this.formData, ...addData}])
};
ajax_json({
url: this.ajaxUrl,
data: postData,
success: (data)=>{
if (data.code) {
kuls_success("저장되었습니다.");
this.getMainList();
}else{
kuls_alert(data.mesg);
}
init(){
},
error: function (request, status, error) {
kuls_alert(error.message);
},
complete: function () {
pop
}
})
}
init(addData, updateData){
const commonFieldData = {
headerSort: false,
vertAlign: "middle",
@ -62,7 +109,18 @@ class SimpleTable {
})
this.tbList.on("tableBuilt", () => {
this.getMainList();
this.getMainList().then(()=>{
if(addData){
this.tbList.addRow({...addData});
};
if(updateData){
this.tbList.update(updateData);
};
})
})
this.addBtn?.addEventListener('click', ()=>{
this.putData(addData,false);
})
// 행선택
@ -115,10 +173,32 @@ class FieldPop {
tabs1: [ '작업표준서 조회', '도면 조회' ], //popup 띄우기
tabs2: [{ isDefHst : '과거불량이력 조회' }, { isFacltBreak : '설비 고장등록' }, {isRun : '가동'}, {isNoRun : '비가동'} ],
tabs2: [
{
id : 'isDefHst',
name : '과거불량이력 조회'
},
{ id : 'isFacltBreak',
name : '설비 고장등록'
},
{ id : 'isRun',
name : '가동'
},
{ id : 'isNoRun',
name : '비가동'
}
],
activeTab : '',
isDisabled : [false, false, false, true],
dateTime : '00:00',
getMode : '',
putMode : '',
tableField : {
isDefHst : [
{ field: "DEF_NO", formatter:"rownum", title: "순번", width: 50},
@ -161,12 +241,12 @@ class FieldPop {
{ field: "", title: "작업자", minWidth: 100, width:'20%'}
],
isRun : [
{ field: "", formatter:"rownum", title: "순번", width: 50},
{ field: "", title: "생산 오더", minWidth: 100, width:'18%',},
{ field: "", title: "구분", minWidth: 80, width:'15%',},
{ field: "", title: "비가동 사유", minWidth: 100, width:'18%',},
{ field: "", title: "시작시간", minWidth: 120, width:'20%',},
{ field: "", title: "종료시간", minWidth: 120, width:'20%',}
{ field:"FACLT_OPER_NO", formatter:"rownum", title: "순번", width: 50},
{ field: "WO_NO", title: "생산 오더", minWidth: 100, width:'18%',},
{ field: "RUNSTOP_GB", title: "구분", minWidth: 80, width:'15%',},
{ field: "STOP_CD", title: "비가동 사유", minWidth: 100, width:'18%',},
{ field: "OPER_ST_TM", title: "시작시간", minWidth: 120, width:'20%',},
{ field: "OPER_ED_TM", title: "종료시간", minWidth: 120, width:'20%',}
],
isNoRun : [
{ field: "", formatter:"rownum", title: "순번", width: 50},
@ -244,16 +324,16 @@ class FieldPop {
modal.delete();
},
callTable(com){
callTable(com, addData=false, updateData=false ){
this.$nextTick(()=>{
// 여기서 mode 명 동적으로 정의할것 (com을 사용)
const getmode = '';
const putmode = '';
const table = new SimpleTable(this.tableField[com], getmode, putmode);
table.init();
const table = new SimpleTable(this.tableField[com], this.getMode, this.putMode, this.formData);
table.init(addData, updateData);
})
},
@ -266,13 +346,45 @@ class FieldPop {
this.isComponent[key] = com == key ? true : false;
});
if(com=='isInsp'){
switch(com){
case 'isWorker':
this.getMode = 'getWokerInfo';
this.putMode = '';
this.callTable(com);
break;
case 'isInsp':
this.isTab = {
isInsp: true,
isFile: false
}
};
this.callTable(com);
break;
case 'isRun':
const now = new Date();
this.dateTime = now.getHours() + ":"
+ ( now.getMinutes()<10 ? '0' + now.getMinutes() : now.getMinutes() ) + ":"
+ ( now.getSeconds()<10 ? '0' + now.getSeconds() : now.getSeconds() );
this.getMode = 'getRunInfo';
this.putMode = 'putRunInfo';
this.callTable(com,{
WO_NO: this.formData.WO_NO,
RUNSTOP_GB: 'R',
OPER_ST_TM : this.dateTime,
_STATUS_ : 'I'
});
break;
default:
this.callTable(com);
break;
}
},

View File

@ -24,7 +24,7 @@ include_once "{$_SERVER['DOCUMENT_ROOT']}/common.inc.php";
<button type="button" v-for="(tab, idx) in tabs1" :key="idx" :class="{ on : activeTab === tab}" @click="activeTab === tab" >{{ tab }}</button>
</div>
<div class="form-button-box flexrow gap06 flex-5 flexend">
<button type="button" v-for="(tab, idx) in tabs2" :key="idx" :class="{ on : activeTab === tab[Object.keys(tab)[0]] }" @click="showComponent(Object.keys(tab)[0], tab[Object.keys(tab)[0]])" >{{ tab[Object.keys(tab)[0]] }}</button>
<button type="button" v-for="(tab, idx) in tabs2" :key="idx" :disabled="isDisabled[idx]" :class="{ on : activeTab === tab.name }" @click="showComponent(tab.id, tab.name)" >{{ tab.name }}</button>
</div>
</div>

View File

@ -236,42 +236,6 @@ const VueOperStatusCode = createApp({
// }
// },
methods:{
initData(group){
for(let i = 0; i < group.length; i++){
finalDataList = []
for(let j=0;j<10;j++){
const operData = group[i][j];
// console.log(operData)
if(operData){
finalDataList.push(
{
OP_CD: operData.OP_CD ,
PLAN_QTY: operData.PLAN_QTY,
PRD_QTY : operData.PRD_QTY,
ST_TM:operData.ST_TM,
ED_TM : operData.ED_TM,
예상종료시간 : operData.예상종료시간 ,
FACLT_CD: operData.FACLT_CD,
EMP_NM: operData.EMP_NM
}
)
}else{
finalDataList.push({})
}
}
group[i][0].공정 = finalDataList
this.codeList.push(group[i][0]);
for(let i=0; i<this.codeList.length; i++){
this.isHover[i] = []
}
}
},
// tableBuild 되었을때 getManList
getMainList(mode,...test) {
@ -332,10 +296,12 @@ const VueOperStatusCode = createApp({
group[i][0].OP_CD = group[i].map(function (element) {
return {
OP_CD: element?.OP_CD,
OP_SEQ: element?.OP_SEQ,
계획수량: element?.계획수량,
PRD_QTY: element?.PRD_QTY,
ST_TM: element?.ST_TM,
ED_TM: element?.ED_TM,
EMP_NO: element?.WRK_EMP_NO,
예상종료시간: element?.예상종료시간,
FACLT_CD: element?.FACLT_CD,
EMP_NM: element?.EMP_NM
@ -374,10 +340,12 @@ const VueOperStatusCode = createApp({
this.codeList = realTemp
this.codeList = realTemp;
this.initData(group);
for(let i=0; i<this.codeList.length; i++){
this.isHover[i] = []
}
// 실제 데이터 입력함수
// ajax_json({
@ -401,9 +369,11 @@ const VueOperStatusCode = createApp({
const process = data['OP_CD'][idx]
const bindingData = {
WO_NO: data['WO_NO'],
WO_SEQ: data['WO_SEQ'],
// 상태: data[상태],
DRAW_NO: data['DRAW_NO'],
ITEM_CD: data['ITEM_CD'],
OP_SEQ: process['OP_SEQ'],
OP_CD: process['OP_CD'],
EMP_NO: process['EMP_NO'],
FACLT_CD: process['FACLT_CD'],