Compare commits

..

No commits in common. "main" and "real_wonki" have entirely different histories.

35 changed files with 558 additions and 467 deletions

132
.gitignore vendored
View File

@ -1,132 +0,0 @@
# ---> Node
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

8
.idea/.gitignore vendored
View File

@ -1,8 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

View File

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" autoUpload="Always" promptOnRemoteOverwrite="CHECK_CONTENT" serverName="base.kuls.co.kr" createEmptyFolders="true" autoUploadExternalChanges="true" notifyRemoteChanges="true">
<serverData>
<paths name="base.kuls.co.kr">
<serverdata>
<mappings>
<mapping deploy="/" local="$PROJECT_DIR$" web="/" />
</mappings>
<excludedPaths>
<excludedPath path="/upload_files" />
<excludedPath local="true" path="$PROJECT_DIR$/.idea" />
<excludedPath local="true" path="$PROJECT_DIR$/base.kuls.co.kr.iml" />
<excludedPath local="true" path="$PROJECT_DIR$/.git" />
</excludedPaths>
</serverdata>
</paths>
</serverData>
<option name="myAutoUpload" value="ALWAYS" />
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/base.kuls.co.kr.iml" filepath="$PROJECT_DIR$/base.kuls.co.kr.iml" />
</modules>
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PhpProjectSharedConfiguration" php_language_level="7.1">
<option name="suggestChangeDefaultLanguageLevel" value="false" />
</component>
</project>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SshConfigs">
<configs>
<sshConfig authType="PASSWORD" connectionConfig="{&quot;serverAliveInterval&quot;:300}" host="192.168.100.11" id="1011c259-f6b6-4eb2-a776-15625b951cd2" port="990" nameFormat="DESCRIPTIVE" username="base.kuls.co.kr" useOpenSSHConfig="true" />
</configs>
</component>
</project>

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="WebServers">
<option name="servers">
<webServer id="e04232aa-fbc5-4ef7-80b5-aa17747ce7b7" name="base.kuls.co.kr" url="http://base.kuls.co.kr">
<fileTransfer rootFolder="/home_dir" accessType="SFTP" host="192.168.100.11" port="990" sshConfigId="1011c259-f6b6-4eb2-a776-15625b951cd2" sshConfig="base.kuls.co.kr@192.168.100.11:990 password">
<advancedOptions>
<advancedOptions dataProtectionLevel="Private" passiveMode="true" shareSSLContext="true" />
</advancedOptions>
</fileTransfer>
</webServer>
</option>
</component>
</project>

View File

@ -1,2 +0,0 @@
# HANYANG_REACT

1
lib/db/mysql.class.php Normal file
View File

@ -0,0 +1 @@
<?php

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -1 +0,0 @@
_CSRF_check_memberLogin|a:1:{i:0;s:24:"memberLogin6699c4f595aed";}visit_sess|s:32:"6fe762ebbbb3632ea2b5a1f0bb5a4750";visit_last_urls|s:1:"/";visit_last_time|i:1721353461;

View File

@ -1 +0,0 @@
_CSRF_check_memberLogin|a:1:{i:0;s:24:"memberLogin6699c61471bcf";}visit_sess|s:32:"0a08962ae6cbd42dbd0e8cc696bc4e1f";visit_last_urls|s:1:"/";visit_last_time|i:1721353748;

View File

@ -1 +0,0 @@
_CSRF_check_memberLogin|a:1:{i:0;s:24:"memberLogin6699c6845cf65";}visit_sess|s:32:"14cf5f4efe7acfe4f305265c1314a824";visit_last_urls|s:1:"/";visit_last_time|i:1721353860;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
_CSRF_check_memberLogin|a:1:{i:0;s:24:"memberLogin6699c5002f5e9";}visit_sess|s:32:"0b52167eed09ac6cbaa9bb542aa637f7";visit_last_urls|s:1:"/";visit_last_time|i:1721353472;

View File

@ -1,6 +1,7 @@
/* /*
* @Overview 기초 코드 관리 * @Overview 기초 코드 관리
*/ */
console.log("asdf");
const VueBaseCode = createApp({ const VueBaseCode = createApp({
data() { data() {
return { return {

View File

@ -23,6 +23,7 @@ if (!_notAuth("R")) {
*/ */
case "getBizareaList": case "getBizareaList":
$sql = "USP_B_BIZ_AREA_S10"; $sql = "USP_B_BIZ_AREA_S10";
$params = Array( $params = Array(
@ -59,9 +60,12 @@ if (!_notAuth("R")) {
*/ */
case "putBizarea": case "putBizarea":
if( _notAuth("W") ) break; /************ 권한체크*/ if( _notAuth("W") ) break; /************ 권한체크*/
$_REQUEST['RS_CODE'] = ""; $_REQUEST['RS_CODE'] = "";
$_REQUEST['RS_MSG'] = ""; $_REQUEST['RS_MSG'] = "";
$stmt = true;
$_REQUEST['reqdata'] = json_decode($_REQUEST['reqdata']); $_REQUEST['reqdata'] = json_decode($_REQUEST['reqdata']);
$rst = true; $rst = true;
$ok_cd = array(); $ok_cd = array();
@ -112,18 +116,39 @@ if (!_notAuth("R")) {
"RS_MSG" => array(&$_REQUEST['RS_MSG'], SQLSRV_PARAM_OUT) "RS_MSG" => array(&$_REQUEST['RS_MSG'], SQLSRV_PARAM_OUT)
)); ));
} }
// $stmt = sqlsrv_query( $__dbconn__, $sql, $params );
// print_r($__dbconn__ .$sql . $params);
$baseObj->DB->callTransaction();
$rst = $baseObj->DB->exec($sql, $params); $rst = $baseObj->DB->exec($sql, $params);
if ($rst === false) {
throw new Exception(print_r(sqlsrv_errors(), true));
} }
}
$retval['data'] = $ok_cd; if($rst){
$baseObj->DB->callCommit();
if($rst && !$_REQUEST['RS_CODE']){
$retval['code'] = true; $retval['code'] = true;
}else{ }else{
$baseObj->DB->callRollBack();
$retval['code'] = false; $retval['code'] = false;
$retval['mesg'] = $_REQUEST['RS_MSG']; $retval['mesg'] = $_REQUEST['RS_MSG'];
} }
$retval['data'] = $ok_cd;
// if( $stmt ) {
// sqlsrv_commit( $__dbconn__ );
// $retval['code'] = true;
// echo "Transaction committed.<br />";
// } else {
// sqlsrv_rollback( $__dbconn__ );
// echo "Transaction rolled back.<br />";
// $retval['code'] = false;
// }
// if($rst && !$_REQUEST['RS_CODE']){
// $retval['code'] = true;
// }else{
// $retval['code'] = false;
// $retval['mesg'] = $_REQUEST['RS_MSG'];
// }
break; break;

View File

@ -6,7 +6,6 @@ class Tb_dept_class {
constructor(container) { constructor(container) {
this.ajaxUrl = "./dept.ajax.php"; this.ajaxUrl = "./dept.ajax.php";
this.isEdited = false; this.isEdited = false;
this.container = document.querySelector(container); this.container = document.querySelector(container);
this.table = this.container.querySelector(".hy-table#dept_table"); this.table = this.container.querySelector(".hy-table#dept_table");
this.widthBtn = this.container.querySelector(".width-btn"); this.widthBtn = this.container.querySelector(".width-btn");

View File

@ -58,61 +58,65 @@ include_once _SVC_INC_PATH_ . "/header.php";
</div> </div>
</div> </div>
<!-- 검색 조회 저장 종료 // --> <!-- 검색 조회 저장 종료 // -->
<div>
<div id="reactTest">
</div>
<!-- 컨텐츠 컨테이너 --> <!-- 컨텐츠 컨테이너 -->
<div class="contents-container"> <!-- <div class="contents-container"> -->
<!-- 테이블 컨테이너 --> <!-- 테이블 컨테이너 -->
<div class="table-container"> <!-- <div class="table-container">
<div class="inner-container"> <div class="inner-container">
<div class="table-box" id="main_container"> <div class="table-box" id="main_container"> -->
<!-- 테이블 헤더 (제목, 추가, 삭제, 저장) --> <!-- 테이블 헤더 (제목, 추가, 삭제, 저장) -->
<div class="table-title"> <!-- <div class="table-title">
<p class="title">부서정보</p> <p class="title">부서정보</p> -->
<!-- 버튼 --> <!-- 버튼 -->
<div class="button-box"> <!-- <div class="button-box">/
<button class="add-btn reverse-btn" id="add_facility"> <button class="add-btn reverse-btn" id="add_facility">
<?php include _SVC_INC_PATH_ . '/img/add.php' ?> <?php// include _SVC_INC_PATH_ . '/img/add.php' ?>
추가 추가
</button> </button>
<button class="remove-btn reverse-btn" id="remove_facility"> <button class="remove-btn reverse-btn" id="remove_facility">
<?php include _SVC_INC_PATH_ . '/img/delete.php' ?> <?php //include _SVC_INC_PATH_ . '/img/delete.php' ?>
삭제 삭제
</button> </button>
<button class="width-btn reverse-btn" id="width-btn">테이블 컬럼 너비</button> <button class="width-btn reverse-btn" id="width-btn">테이블 컬럼 너비</button>
</div> </div> -->
<!-- 버튼 종료 // --> <!-- 버튼 종료 // -->
</div> <!-- </div> -->
<!-- 테이블 헤더 종료 // --> <!-- 테이블 헤더 종료 // -->
<!-- 테이블 --> <!-- 테이블 -->
<div class="tb-height-full"> <!-- <div class="tb-height-full">
<div class="hy-table" id="dept_table"></div> <div class="hy-table" id="dept_table"></div>
</div> </div> -->
<!-- 테이블 종료 // --> <!-- 테이블 종료 // -->
</div> <!-- </div> -->
</div> <!-- </div>
</div> </div> -->
<!-- 테이블 컨테이너 종료 // --> <!-- 테이블 컨테이너 종료 // -->
</div> <!-- </div> -->
<!-- 컨텐츠 컨테이너 종료 // --> <!-- 컨텐츠 컨테이너 종료 // -->
</div> <!-- </div> -->
<!-- 메인 섹션 종료 // --> <!-- 메인 섹션 종료 // -->
</div> <!-- </div> -->
<?php include_once _SVC_INC_PATH_ . "/footer_common.php"; ?> <?php include_once _SVC_INC_PATH_ . "/footer_common.php"; ?>
<script src="./dept.js"></script> <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel"src="./dept2.js"></script>
<?php <?php
include_once _SVC_INC_PATH_ . "/footer.php"; include_once _SVC_INC_PATH_ . "/footer.php";
include_once _SVC_INC_PATH_ . "/menualBtn.php"; include_once _SVC_INC_PATH_ . "/menualBtn.php";

View File

@ -0,0 +1,12 @@
function App() {
return (
<div>
<h6>Hello, React 18!</h6>
</div>
);
}
// Create a root and render the React component into the root div
const root = ReactDOM.createRoot(document.getElementById('reactTest'));
root.render(<App />);

View File

@ -14,9 +14,6 @@
<script src="https://fastly.jsdelivr.net/npm/sortable-tree@0.7.2/dist/sortable-tree.js"></script> <script src="https://fastly.jsdelivr.net/npm/sortable-tree@0.7.2/dist/sortable-tree.js"></script>
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script> <script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script src="https://fastly.jsdelivr.net/npm/exceljs@4.3.0/dist/exceljs.min.js"></script> <script src="https://fastly.jsdelivr.net/npm/exceljs@4.3.0/dist/exceljs.min.js"></script>
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/quill@2.0.2/dist/quill.js"></script> <script src="https://fastly.jsdelivr.net/npm/quill@2.0.2/dist/quill.js"></script>
@ -31,7 +28,6 @@
<script src="<?=_SVC_INC_URL_?>/js/common.js"></script> <script src="<?=_SVC_INC_URL_?>/js/common.js"></script>
<script src="<?=_SVC_INC_URL_?>/js/dashboard.js"></script> <script src="<?=_SVC_INC_URL_?>/js/dashboard.js"></script>
<script src="<?=_SVC_INC_URL_?>/js/popup.js"></script> <script src="<?=_SVC_INC_URL_?>/js/popup.js"></script>
<script src="<?=_SVC_INC_URL_?>/js/TabulatorClass.js"></script>
<script src="<?=_SVC_INC_URL_?>/js/tabulator.js"></script> <script src="<?=_SVC_INC_URL_?>/js/tabulator.js"></script>
<script src="<?=_SVC_INC_URL_?>/js/customTb.js"></script> <script src="<?=_SVC_INC_URL_?>/js/customTb.js"></script>
<script src="<?=_SVC_INC_URL_?>/js/popPasswords.js"></script> <script src="<?=_SVC_INC_URL_?>/js/popPasswords.js"></script>

View File

@ -1,109 +0,0 @@
/*
* 2024-07-19 최승연 최초작성
* 조회 테이블, 저장테이블 클래스 단위로 만든다면
* 상속 클래스
* 테스트 사용처 검사실적조회(insp/mng_insp_oper)
*/
// tb basic class
class BasicClass {
constructor(container) {
this.container = document.querySelector(container);
this.table = this.container.querySelector(".table");
this.tbList = null;
// 테이블 생성 옵션
this.fields = [];
this.commonFields = {
headerSort: true,
vertAlign: "middle",
hozAlign: "center",
resizable: "header", //Resize 는 헤더에서만 가능
headerHozAlign: "center", //헤더 정렬
headerSortTristate: true, //데이터 정렬 => 정/역/초기화
};
this.tbOption = {
layout: "fitcolumns",
columns: this.fields,
columnDefaults: this.commonFields,
headerSortElement: "<i class='bi'></i>",
};
// ajax get에 들어가는 옵션(객체)
this.getOption = {};
}
// 초기화: 데이터 전처리 및 테이블 생성
init() {
this.fitData();
this.tbList = new Tabulator(this.table, this.tbOption);
}
// 이벤트 세팅
setEvent(){}
// 데이터 전처리
preprocess(){}
// 전처리 데이터 ajax에
fitData(){
const data = this.preprocess();
this.getOption['data'] = {
...this.getOption['data'],
...data
}
}
}
// 조회만 되는 테이블
class R_TbClass extends BasicClass {
constructor(container){
super(container);
// 조회버튼 추가
this.filterBtn = document.querySelector("#filter_btn");
}
// 데이터 세팅
getMainList(){
let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);
ajax_json({
...this.getOption,
success: (res) => {
if(res.code) {
this.tbList.setData(res.data);
}else{
kuls_alert(res.mesg);
}
},
error: (req, status, err) => {
kuls_alert(err.message);
},
complete: () => {
window.clearTimeout(talert);
this.tbList.clearAlert();
},
});
}
// 이벤트 세팅
setEvent(){
this.tbList.on("tableBuilt", () => {
this.getMainList();
});
// 조회
["click", "keypress"].forEach((evt) => {
this.filterBtn.addEventListener(evt, () => {
this.fitData();
this.getMainList();
});
});
}
}

View File

@ -1,6 +0,0 @@
import * as crudUtil from './TbLib/crudUtil.js';
import * as tbExcel from './TbLib/tbExcel.js';
import * as tbFormat from './TbLib/tbFormat.js';
import * as tbModal from './TbLib/tbModal.js';
export { crudUtil, tbExcel, tbFormat, tbModal };

View File

@ -1,15 +1,284 @@
class Tb_insp_detail_class extends R_TbClass{ /*
* @Overview 검사 실적 관리
*/
/*
* @Overview 검사 실적 조회
*/
class Tb_insp_detail_class {
constructor(container) { constructor(container) {
super(container); this.ajaxUrl = "./mng_insp_oper.ajax.php";
this.getOption = {
url: "./mng_insp_oper.ajax.php", this.container = document.querySelector(container);
this.table = this.container.querySelector(".hy-table#sub_table_2");
}
/*
* @Overview 데이터 세팅 함수
* @Parameter 없음
*/
getMainList() {
let talert = window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000);
ajax_json({
url: this.ajaxUrl,
data: { data: {
mode: "getInsp" mode : "getInsp",
WO_NO : document.getElementById('WO_NO').value,
date_st: document.getElementById('date_st').value ,
date_ed: document.getElementById('date_ed').value,
ITEM_CD: document.getElementById('ITEM_CD').value,
INSP_FLG: document.getElementById('INSP_FLG').value
},
success: (data) => {
if(data.code) {
this.tbList.setData(data.data);
// this.inspSeq = data.data.INSP_SEQ;
}else{
kuls_alert(data.mesg);
}
},
error: (req, status, err) => {
kuls_alert(err.message);
},
complete: () => {
window.clearTimeout(talert);
this.tbList.clearAlert();
},
});
return true;
}
/*
* @Overview 데이터 추가/수정/삭제
* @Parameter 없음. 테이블 작업장 코드 식별
* @function _STATUS_ : I, D, U ROW만 php에서 처리.
*/
putData (){
let pdata = this.tbList.getData();
if(pdata.filter(row=> row._STATUS_).length == 0){
this.getMainList(this.code);
return false;
}
let dupdata = pdata.map( data => data.WC_CD ).filter( data => data );;
if( dupdata.filter( (data,idx) => dupdata.indexOf(data) !== idx ).length > 0 ){
kuls_alert("작업장 코드가 중복됩니다.");
return false;
}
let postdata = {
'mode': 'putData',
'reqdata': JSON.stringify(this.tbList.getData().filter(row=> row._STATUS_)),
};
ajax_json({
url: this.ajaxUrl,
data: postdata,
success: (data)=>{
if (data.code) {
kuls_success("저장되었습니다.");
this.getMainList(this.pc);
Tb_order.getMainList();
}else{
this.tbList.getRows().forEach( row => { //일부 적용된 열 update 처리
if( data.data.includes(row.getData()['WO_NO']) ){
row.update({_STATUS_:'U'});
}
} );
kuls_alert(data.mesg);
}
},
error: (request, status, error)=>{
kuls_alert(error.message);
},
complete: function () {
}
});
return true;
};
/*
* @Overview 데이터 필터 함수
* @Parameter 없음
* @function 필터링 없음.
*/
setFilter() {
}
/*
* @Overview 테이블 추가 함수
* @Parameter 없음
* @function 기본키, _STATUS_:I 값을 넣은 추가
*/
addRow() {
this.tbList.addRow({ _STATUS_: "I", INSP_ITEM: this.code, INSP_SEQ: this.inspSeq });
}
/*
* @Overview 테이블 삭제 함수
* @Parameter 없음
* @function 선택된 모든 STATUS D
*/
removeRow() {
const selectedRows = this.tbList.getRows().filter(row=>{
return row.getData().check ==="Y"
});
if(selectedRows.length > 0 ){
// 선택된 각 행 삭제
selectedRows.forEach((row) => {
// STAUS D로 바꾸기
row.getData()._STATUS_ = row.getData()._STATUS_=="I"?null:"D";
const rowElement = row.getElement();
rowElement.classList.add("remove-row");
});
}else{
kuls_alert("삭제할 행을 선택해주세요.")
} }
} }
this.fields = [ /*
* @Overview 테이블 선택 함수
* @Parameter 없음
* @function 선택된 모든 변경
*/
rowClick(e, tgt) {
if (tgt.isSelected()) {
tgt.deselect();
this.clearRemove(tgt);
} else {
tgt.select();
}
}
/*
* @Overview 삭제 취소 함수
* @Parameter 삭제
* @function 클릭시 삭제 취소 & STATUS를 공란으로 변경
*/
clearRemove(tgt){
if(tgt._row.data._STATUS_ == "D"){
// console.log();
tgt._row.data._STATUS_ = "";
tgt._row.getElement().classList.remove("remove-row")
// const selectedRows = this.tbList.getSelectedRows(); // 선택된 모든 행 가져오기
}
}
/*
* @Overview cell 클릭 함수
* @Parameter 클릭한 cell
* @Function 클릭한 cell의 filed 값에 따라 토글 상태 변경 또는 팝업
*/
cellClick(e, tgt) {
var editor = tgt.getColumn().getDefinition().editor;
switch (tgt.getField()) {
case "INSP_ITEM":
popInsp({
INSP_ITEM: "INSP_ITEM"
},tgt.getRow())
break;
case "check":
tgt.setValue(tgt.getValue() == "Y" ? "" : "Y");
this.clearRemove(tgt.getRow())
break;
default:
if (!editor) {
this.rowClick && this.rowClick(e, tgt.getRow());
}
break;
}
}
/*
* @Overview 테이블 수정 함수
* @Parameter
* @function 편집이 이후 저장될수 있도록 _STATUS_:U로 데이터 업데이트
*/
// cellEdited(cell) {
// cell.getData()._STATUS_ = cell.getData()._STATUS_ || "U";
// }
/*
* @Overview 추가, 수정 삭제 데이터 저장
* @Parameter 없음
* @Function 기본키 중복 확인
* @Function _STATUS_ U, I, D인 데이터베이스 가져와서 처리.
*/
putData() {
// 기본키 중복 확인 및 방지
// _STATUS_ 있는 데이터만 들고와서 PUT하기
}
//팝업 아이콘
popIcon = function(cell, formatterParams, onRendered) { //plain text value
// if(!cell.getRow().getData().FILE_NM){
// // kuls_alert("");
// return "<button class='reverse-btn disabled-btn' diabled>미리보기</button>";
// }
// <i className='fa-solid fa-paperclip'></i>
return "<button class='reverse-btn fa-solid fa-paperclip padding-1-12'></button>";
// <i className="fa-solid fa-paperclip"></i>
};
openModal(cell) {
let clickData = cell.getData();
vnLoad("", "../reg_insp_qc/reg_insp_qc_pop.inc.php", "", (loadHtml) => {
this.putPartnerModal = kuls_modal(loadHtml);
const popFileUpload = new Tb_file_upload_class("#popup_file_upload",clickData);
popFileUpload.init_insp();
});
}
getInspValue() {
const datefields = [];
// const sample = parseInt(Tb_insp_list.tbList.getSelectedData()[0].INSP_SAMPL_QTY);
for (let i = 1; i <= 20; i++) {
// 데이터 형태에 따라서 field값 및 title값 변경가능
datefields.push({
field: `T${i}`,
title: i,
width: 50,
editor:"input",
editable: (cell)=>{
return i<=this.qty
},
formatter:tb_custom_formatter.checkInspValue,
formatterParams:{ checkPoint : 'OKNG_FLG' },
hozAlign:"right"
// validator: "numeric",
});
}
return datefields;
}
/*
* @Overview 최초 실행 함수
* @Parameter 없음
*/
init() {
let _this = this;
// field 정의
const fields = [
{ field:"OKNG_FLG", formatter: "rownum", title: "NO", width: 40 }, { field:"OKNG_FLG", formatter: "rownum", title: "NO", width: 40 },
// { field: "PLN_STATUS", title: "오더 상태", width: 150 },
{ field: "WO_NO", title: "생산오더", width: 70 }, { field: "WO_NO", title: "생산오더", width: 70 },
{ field: "ITEM_CD", title: "품목", width: 70 }, { field: "ITEM_CD", title: "품목", width: 70 },
{ field: "ITEM_NM", title: "품명", width: 100, minWidth: 40 }, { field: "ITEM_NM", title: "품명", width: 100, minWidth: 40 },
@ -56,8 +325,8 @@ class Tb_insp_detail_class extends R_TbClass{
title: "파일관리", title: "파일관리",
width: 70, width: 70,
formatter: this.popIcon, formatter: this.popIcon,
cellClick:(e,cell)=>{ cellClick:function(e,cell){
this.openModal(cell); _this.openModal(cell);
} }
}, },
{ {
@ -67,69 +336,95 @@ class Tb_insp_detail_class extends R_TbClass{
columns: this.getInspValue(), columns: this.getInspValue(),
}, },
]; ];
const commonFieldData = {
this.tbOption.columns = this.fields; headerSort: true,
vertAlign: "middle",
this.init(); hozAlign: "center",
this.setEvent(); resizable: "header", //Resize 는 헤더에서만 가능
} headerHozAlign: "center", //헤더 정렬
headerSortTristate: true, //데이터 정렬 => 정/역/초기화
// 조회시에 필요한 데이터 셀렉
preprocess(){
let arr = ['WO_NO','date_st','date_ed','ITEM_CD','INSP_FLG'];
let data = new Object();
for(let i=0; i < arr.length; i++){
let temp = arr[i];
if(document.getElementById(arr[i]).type == "checkbox"){
data[temp] = document.getElementById(temp).checked?"Y":"N";
}else{
data[temp] = document.getElementById(temp).value
}
}
// this.getOption['data'] = {...this.getOption['data'], ...data};
return data;
}
//팝업 아이콘
popIcon = function(cell, formatterParams, onRendered) { //plain text value
return "<button class='reverse-btn fa-solid fa-paperclip padding-1-12'></button>";
}; };
// 파일 다운로드 모달 /*
openModal(cell) { * @Overview tabulator 객체 생성
* @Parameter 생성 위치(html class값)
let clickData = cell.getData(); */
this.tbList = new Tabulator(this.table, {
vnLoad("", "../reg_insp_qc/reg_insp_qc_pop.inc.php", "", (loadHtml) => { layout: "fitColumns",
this.putPartnerModal = kuls_modal(loadHtml); data: [], //기본 데이터
columns: fields, //컬럼 설정
columnDefaults: commonFieldData,
const popFileUpload = new Tb_file_upload_class("#popup_file_upload",clickData); headerSortElement: "<i class='bi'></i>", //정렬 아이콘
popFileUpload.init_insp(); validationMode: "highlight"
}); });
}
// 측정치 20개 생성
getInspValue() { /*
const datefields = []; * @Overview 테이블 만들어지면 데이터 불러오기
for (let i = 1; i <= 20; i++) { * @Parameter 없음
// 데이터 형태에 따라서 field값 및 title값 변경가능 */
datefields.push({ this.tbList.on("tableBuilt", () => {
field: `T${i}`, _this.getMainList();
title: i, });
width: 50,
editor:"input", /*
editable: (cell)=>{ * @Overview 유효성 검사메세지 띄우기
return i<=this.qty * @Parameter cell, 입력값, validators
}, */
formatter:tb_custom_formatter.checkInspValue, this.tbList.on("validationFailed", (cell, value, validators)=>{
formatterParams:{ checkPoint : 'OKNG_FLG' }, cell.setValue("");
hozAlign:"right" let errMsg = "";
switch(validators[0].type){
case "alphanumeric":
errMsg = " 필드는 특수문자를 입력할 수 없습니다.";
break;
case "numeric":
errMsg = " 필드는 숫자만 입력할 수 있습니다.";
break;
default:
errMsg = " 필드는 "+ validators[0].parameters;
break;
};
kuls_warning(cell.getColumn().getDefinition().title + errMsg );
});
/*
* @Overview cell 클릭시 체크 또는 팝업
* @Parameter 이벤트,
*/
this.tbList.on("cellClick", (e,tgt) => {
this.cellClick && this.cellClick(e,tgt);
});
/*
* @Overview cell 수정 함수
* @Parameter cell
* @Function status u로 바꿀것
*/
this.tbList.on("cellEdited", (cell) => {
this.cellEdited && this.cellEdited(cell);
});
/*
* @Overview 데이터 조회 함수
* @Parameter 없음
* @Function
*/
document.getElementById('filter_btn').addEventListener('click',function(e){
_this.getMainList();
})
/*
* @Overview 엑셀 조회 함수
* @Parameter 엑셀 타이틀 파일 제목, 엑셀에 넣을 데이터
* @Function status u로 바꿀것
*/
document.getElementById('excel_data').addEventListener('click', (e) => {
const selectedRows = this.tbList.getRows().filter(row => row.isSelected()).length === 0 ? this.tbList.getRows() :this.tbList.getRows().filter(row => row.isSelected()) ;
let data = selectedRows.map(row => row.getData());
getExcel('검사실적조회', "검사실적조회", data);
}); });
}
return datefields;
} }
} }

View File

@ -98,7 +98,7 @@ include_once _SVC_INC_PATH_ . "/header.php";
<!-- 테이블 헤더 종료 // --> <!-- 테이블 헤더 종료 // -->
<!-- 테이블 --> <!-- 테이블 -->
<div class="tb-height-full"> <div class="tb-height-full">
<div class="hy-table group-table groupby table" id="sub_table_2"></div> <div class="hy-table group-table groupby" id="sub_table_2"></div>
</div> </div>
<!-- 테이블 종료 // --> <!-- 테이블 종료 // -->
</div> </div>

View File

@ -83,7 +83,7 @@ include_once _SVC_INC_PATH_ . "/header.php";
<div class="tb-height-full"> <div class="tb-height-full">
<!-- 테이블 --> <!-- 테이블 -->
<div class="hy-table groupby table" id="total_table"></div> <div class="hy-table groupby" id="total_table"></div>
</div> </div>
</div> </div>
<!-- 테이블 종료 // --> <!-- 테이블 종료 // -->

View File

@ -689,35 +689,50 @@ class Tb_process_class {
this.lastNum += 10; this.lastNum += 10;
this.tbList.addRow({ OP_SEQ : this.lastNum, WO_NO : Tb_order.tbList.getSelectedData()[0].WO_NO, _STATUS_: "I",ORD_QTY:Tb_order.tbList.getSelectedData()[0].ORD_QTY }); this.tbList.addRow({ OP_SEQ : this.lastNum, WO_NO : Tb_order.tbList.getSelectedData()[0].WO_NO, _STATUS_: "I",ORD_QTY:Tb_order.tbList.getSelectedData()[0].ORD_QTY });
} }
// copyRow(){
// let _this = this;
//
// let clickData = Tb_order.tbList.getSelectedData()[0];
//
// const selectedRows = this.tbList.getData().filter(row=>{
// return row.check ==="Y"
// });
// console.log(this.tbList.getData());
//
// let postdata = {
// 'mode': 'copyList',
// 'reqdata': JSON.stringify(selectedRows),
// };
// // ajax_json({
// //
// // url: "./reg_order.ajax.php",
// // data: postdata,
// // success:( data ) => {
// // if( data.code ){
// //
// // console.log(data.data);
// // kuls_success("재편성이 완료됐습니다");
// // //공정 편성 후에는 조회 값이 모두 초기화 되어야함
// // _this.getMainList("");
// // Tb_check.getMainList("");
// // }else{
// //
// // }
// // },
// // error: (request, status, error)=>{
// // kuls_alert(error.message);
// // },
// // });
// document.getElementById("hidden_item_cd").value = Tb_order.tbList?.getSelectedData()[0]?.ITEM_CD;
// }
sortingRouting(){
let temArr = this.tbList.getData(); // 테이블 전체 데이터
console.log(this.tbList.getData().length);
/* if(this.tbList.getData().length === 1){
* @Overview 테이블 순서 정렬 함수
* @Parameter 없음
* @function
*
* 첫번째 공정에 대하여
* FRIST_OP_FLG : 'Y'
* LAST_OP_FLG : 'N'
* 이전 공정 : ''
* 다음 공정 : 다음 공정 표시
*
* 마지막 공정에 대하여
* FRIST_OP_FLG : N
* LAST_OP_FLG : Y
* 이전 공정 : 이전 공정 표시
* 다음 공정 : ''
*/
sortingRouting(data){
let temArr;
if(!data){
temArr = this.tbList.getData(); // 테이블 전체 데이터
}else{
temArr = data; // 파라미터 받은 데이터
}
if(temArr.length === 1){ // 공정이 하나만 존재하는 경우
temArr[0].OP_SEQ = 10; temArr[0].OP_SEQ = 10;
temArr[0].FRST_OP_FLG = 'Y' temArr[0].FRST_OP_FLG = 'Y' // 첫번째 공정에 대하여 Y
temArr[0].LAST_OP_FLG = 'Y' temArr[0].LAST_OP_FLG = 'Y'
temArr[0].PRV_OP_CD = '' temArr[0].PRV_OP_CD = ''
temArr[0].NXT_OP_CD = '' temArr[0].NXT_OP_CD = ''
@ -727,15 +742,15 @@ class Tb_process_class {
if(parseInt([i]) === 0){ // 0인 경우 => 첫번째 공정 순서의 경우 if(parseInt([i]) === 0){ // 0인 경우 => 첫번째 공정 순서의 경우
temArr[0].FRST_OP_FLG = 'Y' // 첫번째 공정에 대하여 Y temArr[0].FRST_OP_FLG = 'Y' // 첫번째 공정에 대하여 Y
temArr[0].LAST_OP_FLG = 'N' // 마지막 공정에 대하여 N temArr[0].LAST_OP_FLG = 'N' // 마지막 공정에 대하여 N
temArr[0].PRV_OP_CD = '' // 이전의 공정에 대하여 빈값 부여 temArr[i].PRV_OP_CD = '' // 이전의 공정에 대하여 빈값 부여
}else{ // 0이 아닌경우 => 두번째 공정 순서부터 값 부여 }else{ // 0이 아닌경우 => 두번째 공정 순서부터 값 부여
temArr[i].FRST_OP_FLG = 'N' //첫번째 공정이 아닌 경우 temArr[i].FRST_OP_FLG = 'N'
temArr[i].LAST_OP_FLG = 'N' temArr[i].LAST_OP_FLG = 'N'
temArr[i].PRV_OP_CD = temArr[i-1].OP_CD; // 이전의 공정에 대하여 VALUE 바인딩 temArr[i].PRV_OP_CD = temArr[i-1].OP_CD; // 이전의 공정에 대하여 VALUE 바인딩
temArr[i - 1].NXT_OP_CD = temArr[i].OP_CD; // 다음의 공정에 대하여 VALUE 바인딩 temArr[i - 1].NXT_OP_CD = temArr[i].OP_CD; // 다음의 공정에 대하여 VALUE 바인딩
} }
if(parseInt([i]) === temArr.length-1){ // 마지막 공정의 경우 if(parseInt([i]) === temArr.length-1){
temArr[temArr.length-1].FRST_OP_FLG = 'N' temArr[temArr.length-1].FRST_OP_FLG = 'N'
temArr[temArr.length-1].LAST_OP_FLG = 'Y' temArr[temArr.length-1].LAST_OP_FLG = 'Y'
temArr[temArr.length-1].NXT_OP_CD = '' temArr[temArr.length-1].NXT_OP_CD = ''
@ -746,8 +761,57 @@ class Tb_process_class {
}else if(temArr.some(x=>x._STATUS_ === "U")||temArr.some(x=>x)){ }else if(temArr.some(x=>x._STATUS_ === "U")||temArr.some(x=>x)){
temArr[i]._STATUS_ = "U"; temArr[i]._STATUS_ = "U";
} }
}
}
return temArr
}
editSort(data){
let temArr = data;
if(data.length === 1){
temArr[0].OP_SEQ = 10;
temArr[0].FRST_OP_FLG = 'Y' // 첫번째 공정에 대하여 Y
temArr[0].LAST_OP_FLG = 'Y'
temArr[0].PRV_OP_CD = ''
temArr[0].NXT_OP_CD = ''
if (temArr.some(x => x._STATUS_ === "I" || temArr.some(x => x._STATUS_ === "D"))) {
} else if (temArr.some(x => x._STATUS_ === "U") || temArr.some(x => x)) {
temArr[0]._STATUS_ = "U";
}
}else {
for (let i = 0; i < temArr.length; i++) {
temArr[i].OP_SEQ = (parseInt([i]) + 1) * 10 // 공정 순서의 숫자 채번
if (parseInt([i]) === 0) { // 0인 경우 => 첫번째 공정 순서의 경우
temArr[0].FRST_OP_FLG = 'Y' // 첫번째 공정에 대하여 Y
temArr[0].LAST_OP_FLG = 'N' // 마지막 공정에 대하여 N
temArr[i].PRV_OP_CD = '' // 이전의 공정에 대하여 빈값 부여
} else { // 0이 아닌경우 => 두번째 공정 순서부터 값 부여
temArr[i].FRST_OP_FLG = 'N'
temArr[i].LAST_OP_FLG = 'N'
temArr[i].PRV_OP_CD = temArr[i - 1].OP_CD; // 이전의 공정에 대하여 VALUE 바인딩
temArr[i - 1].NXT_OP_CD = temArr[i].OP_CD; // 다음의 공정에 대하여 VALUE 바인딩
}
if (parseInt([i]) === temArr.length - 1) {
temArr[temArr.length - 1].FRST_OP_FLG = 'N'
temArr[temArr.length - 1].LAST_OP_FLG = 'Y'
temArr[temArr.length-1].NXT_OP_CD = ''
}
// some : I나 D 상태가 하나라도 있으면 TRUE 반환
if (temArr.some(x => x._STATUS_ === "I" || temArr.some(x => x._STATUS_ === "D"))) {
} else if (temArr.some(x => x._STATUS_ === "U") || temArr.some(x => x)) {
temArr[i]._STATUS_ = "U";
}
} }
} }
return temArr return temArr
} }
/* /*
@ -903,7 +967,7 @@ class Tb_process_class {
console.log(edit); console.log(edit);
let postdata = { let postdata = {
mode: 'putProcess', mode: 'putProcess',
reqdata: JSON.stringify(_this.sortingRouting(edit).filter( row=> row._STATUS_ )), reqdata: JSON.stringify(_this.editSort(edit).filter( row=> row._STATUS_ )),
}; };
console.log(postdata); console.log(postdata);
ajax_json({ ajax_json({
@ -1082,12 +1146,12 @@ class Tb_check_class {
return false; return false;
} }
this.tbList.addRow( this.tbList.addRow(
{WO_NO : Tb_order.tbList.getSelectedData()[0].WO_NO, {
WO_NO : Tb_order.tbList.getSelectedData()[0].WO_NO,
WO_SEQ: Tb_process.tbList.getSelectedData()[0].WO_SEQ, WO_SEQ: Tb_process.tbList.getSelectedData()[0].WO_SEQ,
OP_CD: Tb_process.tbList.getSelectedData()[0].OP_CD , OP_CD: Tb_process.tbList.getSelectedData()[0].OP_CD ,
OP_SEQ: Tb_process.tbList.getSelectedData()[0].OP_SEQ , OP_SEQ: Tb_process.tbList.getSelectedData()[0].OP_SEQ ,
_STATUS_: "I" } _STATUS_: "I" });
);
} }
/* /*
@ -1206,11 +1270,21 @@ class Tb_check_class {
}); });
}); });
// const blankObj = this.tbList.setFilter((data) => {
// // _STATUS_와 USE_FLG를 제외한 모든 키에 대해 필터링 조건을 적용
// return Object.keys(data).filter(key => key !== '_STATUS_' && key !== 'USE_FLG').every(key => {
// const value = data[key];
// // 비어있는 값 확인
// return (value === undefined || value === '');
// });
// },);
let postdata = { let postdata = {
'mode': 'putCheck', 'mode': 'putCheck',
'reqdata': JSON.stringify(this.tbList.getData().filter(row=> row._STATUS_)), 'reqdata': JSON.stringify(this.tbList.getData().filter(row=> row._STATUS_)),
}; };
// if(blankObj.length !== 0){
// kuls_confirm("비어있는 행을 무시하고 진행하시겠습니까?","",()=>{
ajax_json({ ajax_json({
url: this.ajaxUrl, url: this.ajaxUrl,
data: postdata, data: postdata,
@ -1228,6 +1302,15 @@ class Tb_check_class {
}, },
complete: function () { complete: function () {
} }
// });
// },()=>{
// blankObj.forEach(row=>{
// row.getElement().classList.add("blank-row")
// })
// console.log(blankObj)
// })
}) })
} }