'웹 싱니 > Construction Report (23.02 ~ )' 카테고리의 다른 글

nde by welder  (0) 2023.02.27
nde by iso  (0) 2023.02.27
welding month  (0) 2023.02.27
welding day  (0) 2023.02.27

'웹 싱니 > Construction Report (23.02 ~ )' 카테고리의 다른 글

pkg list  (0) 2023.02.27
nde by iso  (0) 2023.02.27
welding month  (0) 2023.02.27
welding day  (0) 2023.02.27

'웹 싱니 > Construction Report (23.02 ~ )' 카테고리의 다른 글

pkg list  (0) 2023.02.27
nde by welder  (0) 2023.02.27
welding month  (0) 2023.02.27
welding day  (0) 2023.02.27

'웹 싱니 > Construction Report (23.02 ~ )' 카테고리의 다른 글

pkg list  (0) 2023.02.27
nde by welder  (0) 2023.02.27
nde by iso  (0) 2023.02.27
welding day  (0) 2023.02.27

'웹 싱니 > Construction Report (23.02 ~ )' 카테고리의 다른 글

pkg list  (0) 2023.02.27
nde by welder  (0) 2023.02.27
nde by iso  (0) 2023.02.27
welding month  (0) 2023.02.27

개발일정
메인화면
조직도 모달
Mozilla의 PDF.JS를 이용한 pdfViewer

 

* 메인페이지 code

<div id="app" style="margin-bottom:30px">
<form id="mainForm" name="mainForm">
<div class="row mb-1">
    <div class="col-md-1">
        <i class="fa-solid fa-magnifying-glass"></i> <b style="font-size:large">Search</b>
    </div>
    <div class="col-md text-right">
        <span v-show="jno">
            <button type="button" class="btn btn-outline-primary btn-sm text-left mr-2 text-center" style="width:130px;" @click="selDocDownload" :disabled="selectList.length == 0" title="선택 다운로드">
                <i class="fa-solid fa-check" style="font-size:large"></i> 선택 다운로드
            </button>
            <button type="button" class="btn btn-outline-primary btn-sm text-left mr-2 text-center" style="width:130px;" @click="allDocDownload" :disabled="latestList.length == 0" title="전체 다운로드">
                <i class="fa-solid fa-floppy-disk" style="font-size:large"></i> 전체 다운로드
            </button>
            <button type="button" class="btn btn-outline-primary btn-sm text-left mr-2 text-center" style="width:130px;" @click="exportLatestExcel" :disabled="latestList.length == 0" title="목록 내보내기">
                <i class="fa-solid fa-file-export" style="font-size:large"></i> 목록 내보내기
            </button>
        </span>
        <button type="button" class="btn btn-outline-dark btn-sm" v-html="icon" @click="collapseChange"></button>
    </div>
</div>
<div class="row">
    <div class="container-fluid mb-1 p-1 mx-3 border collapse show" style="border-radius:10px;" id="tools">
        <div class="row mt-2">
            <div class="col-md row">
                <div class="col-md-1">
                    <label class="ml-2" style="padding-top:0.2rem;color:#A0A0A0">검색조건</label>
                </div>
                <div class="col-md-4">
                    <div class="input-group-prepend">
                        <label for="" style="padding-top:0.2rem">기간</label>
                        <select class="form-control ml-2" style="width:min-content" v-model="sdOption">
                            <option value="0">선택</option>
                            <option value="distribute">배포일</option>
                            <option value="reply">회신일</option>
                        </select>
                        <input type="date" class="form-control mx-2 text-center" v-model="sd_start_date"/>~ 
                        <input type="date" class="form-control ml-2 text-center" v-model="sd_end_date"/>
                    </div>
                </div>
                <div class="col-md-2" style="padding-left:0 !important">
                    <div class="row" style="float:right">
                        <select class="form-control mr-2" style="width:min-content" v-model="so_dc" @click="btnSearchClick">
                            <option value="">공종(Disc.)</option>
                            <option value="STAT">STAT(고정기기)</option>
                            <option value="ROTA">ROTA(회전기계)</option>
                            <option value="INST">INST(계기)</option>
                            <option value="ELEC">ELEC(전기)</option>
                        </select>
                        <select class="form-control" style="width:min-content" v-model="so_rc" @click="btnSearchClick">
                            <option value="">Result#</option>
                            <option value="A">A</option>
                            <option value="N">N</option>
                            <option value="RFC">RFC</option>
                            <option value="R">R</option>
                            <option value="NN">NN</option>
                            <option value="F">F</option>
                            <option value="UN">UN</option>
                            <option value="NULL">(NULL)</option>
                        </select>
                    </div>
                </div>
                <div class="col-md-4">
                    <div class="input-group mb-2">
                        <div class="input-group-prepend">
                            <select class="form-control ml-2" v-model="researchOption">
                                <option value="so_all">전체</option>
                                <option value="so_doc_no">문서번호</option>
                                <option value="so_doc_ti">문서제목</option>
                                <option value="so_vn">Vendor</option>
                                <option value="so_tr">TR No.</option>
                                <option value="so_rt">RFQ. No. / Title</option>
                                <option value="so_ti">Item / Tag No.</option>
                                <!-- <option value="so_dc">공종</option> -->
                                <!-- <option value="so_rc">Result #</option> -->
                            </select>
                        </div>
                        <input type="text" class="form-control" v-model="researchText" @keydown.enter.prevent="btnSearchClick"/>
                        <div class="input-group-append">
                            <button type="button" class="btn btn-info" id="btnSearch" @click="btnSearchClick" :disabled="!jno" title="검색"><i class="fa-solid fa-magnifying-glass"></i></button>
                        </div>
                    </div>
                </div>
                <div class="col-md-1 text-right" style="padding:0 !important; padding-top:0.2rem !important">
                    <div class="custom-control custom-switch" style="padding:0 !important" title="결과 내 재검색">
                        <input type="checkbox" class="custom-control-input" id="rebrowsing" v-model="isRebrowsing" @click="isUseRebrowsing">
                        <label class="custom-control-label" for="rebrowsing">결과 내 재검색</label>
                    </div>
                </div>
            </div>
        </div>
        <div class="ml-3" v-html="searchHtml" v-show="isRebrowsing" @click="deleteWord($event)"></div>
    </div>
</div>
<div v-show="jno">
    <!-- pc화면 -->
    <div class="d-none d-xl-block">
        <div class="row">
            <div class="col-3" style="padding-right:0 !important">
                <table class="table table-bordered table-sm tblLatestList" style="height:min-content;">
                    <thead class="thead-light">
                        <tr>
                            <th><input type="checkbox" v-model="allSelected"/></th>
                            <th>공종</th>
                            <th title="Doc. No.">문서번호</th>
                            <th>Rev.</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr :key="doc.ms_no" v-for="doc in latestList" :class="{'rowActive' : (doc.ms_no == selectDoc), 'resultFinal' : (doc.doc_status_nick == 'F'), 'resultNull' : (doc.doc_status_nick == '')}">
                            <td class="text-center"><input type="checkbox" v-model="selectList" :value="doc.doc_no"/></td>
                            <td class="text-center" @click="docRowClick(doc.ms_no)">{{ doc.tr_func_cd }}</td>
                            <td @click="docRowClick(doc.ms_no)" style="width:230px" :title="doc.doc_num"><div class="text-ellipsis so_doc_no">{{ doc.doc_num }}</div></td>
                            <td class="text-center" @click="docRowClick(doc.ms_no)">{{ doc.doc_rev_num }}</td>
                        </tr>
                    </tbody>
                </table>
                <div id="pageInfo" style="display:none;padding-left:25px" v-show="!noData">Pages : <span style="color:red">{{ pageNo }}</span> - {{ totalPage }} / Rows : {{ totalCntString }}</div>
            </div>
            <div class="col-8" style="padding:0 !important;">
                <div class="table-responsive tblLatestList">
                    <table class="table table-bordered table-sm">
                        <thead class="thead-light">
                            <tr>
                                <th class="responsiveTblRow" title="Doc. Title">문서제목</th>
                                <th class="responsiveTblRow" title="Vendor Name">Vendor</th>
                                <th class="responsiveTblRow">TR No.</th>
                                <th class="responsiveTblRow" title="Distribute Date">배포일</th>
                                <th class="responsiveTblRow" title="Reply Date">회신일</th>
                                <th class="responsiveTblRow">RFQ. No.</th>
                                <th class="responsiveTblRow">RFQ. Title</th>
                                <th class="responsiveTblRow">Item / Tag No.</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr :key="doc.ms_no" v-for="doc in latestList" :class="{'rowActive' : (doc.ms_no == selectDoc), 'resultFinal' : (doc.doc_status_nick == 'F'), 'resultNull' : (doc.doc_status_nick == '')}">
                                <td class="responsiveTblRow so_doc_ti" @click="docRowClick(doc.ms_no)">{{ doc.doc_title }}</td>
                                <td class="text-center responsiveTblRow so_vn" @click="docRowClick(doc.ms_no)">{{ doc.from_comp_name }}</td>
                                <td class="responsiveTblRow so_tr" @click="docRowClick(doc.ms_no)">{{ doc.tr_doc_num }}</td>
                                <td class="text-center responsiveTblRow" @click="docRowClick(doc.ms_no)">{{ doc.doc_distribute_date_str }}</td>
                                <td class="text-center responsiveTblRow" @click="docRowClick(doc.ms_no)">{{ doc.doc_reply_date_str }}</td>
                                <td class="responsiveTblRow so_rt" @click="docRowClick(doc.ms_no)">{{ doc.doc_rfq_num }}</td>
                                <td class="responsiveTblRow so_rt" @click="docRowClick(doc.ms_no)">{{ doc.doc_rfq_title }}</td>
                                <td class="responsiveTblRow so_ti" @click="docRowClick(doc.ms_no)">{{ doc.doc_tag_item }}</td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
            <div class="col" style="padding-left:0 !important">
                <table class="table table-bordered table-sm tblLatestList" style="height:min-content">
                    <thead class="thead-light">
                        <tr>
                            <th>Cnt</th>
                            <th title="Result Code">
                                Rslt #
                                <div class="tooltipBox"><i class="fa-solid fa-circle-question"></i>
                                    <span class="tooltiptext"><img class="img-thumbnail" src="../../../images/result_code_tooltip.png" /></span>
                                </div>
                            </th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr :key="doc.ms_no" v-for="doc in latestList" :class="{'rowActive' : (doc.ms_no == selectDoc), 'resultFinal' : (doc.doc_status_nick == 'F'), 'resultNull' : (doc.doc_status_nick == '')}">
                            <td class="text-center" @click="docRowClick(doc.ms_no)">{{ doc.doc_cnt }}</td>
                            <td class="text-center" @click="docRowClick(doc.ms_no)">{{ doc.doc_status_nick }}</td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
    
    <!-- 모바일 화면 -->
    <div class="table-responsive d-xl-none d-lg-block">
        <table class="table table-bordered table-sm tblLatestList">
            <thead class="thead-light">
                <tr> 
                    <th style="white-space: nowrap;min-width: 1rem"><input type="checkbox" v-model="allSelected"/></th>
                    <th class="responsiveTblRow" title="VP Discipline Code">Disc.</th>
                    <th class="responsiveTblRow">Doc. No.</th>
                    <th class="responsiveTblRow">Rev.</th>
                    <th class="responsiveTblRow">Doc. Title</th>
                    <th class="responsiveTblRow" title="Vendor Name">Vendor</th>
                    <th class="responsiveTblRow">TR No.</th>
                    <th class="responsiveTblRow">Dist. Date</th>
                    <th class="responsiveTblRow">Reply Date</th>
                    <th class="responsiveTblRow">RFQ. No.</th>
                    <th class="responsiveTblRow">RFQ. Title</th>
                    <th class="responsiveTblRow">Item/Tag No.</th>
                    <th class="responsiveTblRow">Cnt</th>
                    <th class="responsiveTblRow" title="Result Code">
                        Rslt #
                        <div class="tooltipBox"><i class="fa-solid fa-circle-question"></i>
                            <span class="tooltiptext"><img class="img-thumbnail" src="../../../images/result_code_tooltip.png" /></span>
                        </div>
                    </th>
                </tr>
            </thead>
            <tbody>
                <tr :key="doc.ms_no" v-for="doc in latestList" :class="{'rowActive' : (doc.ms_no == selectDoc), 'resultFinal' : (doc.doc_status_nick == 'F'), 'resultNull' : (doc.doc_status_nick == '')}">
                    <td class="text-center" style="white-space: nowrap;min-width: 1rem"><input type="checkbox" v-model="selectList" :value="doc.doc_no"/></td>
                    <td class="responsiveTblRow text-center" @click="docRowClick(doc.ms_no)">{{ doc.tr_func_cd }}</td>
                    <td class="responsiveTblRow" @click="docRowClick(doc.ms_no)">{{ doc.doc_num }}</td>
                    <td class="responsiveTblRow text-center" @click="docRowClick(doc.ms_no)">{{ doc.doc_rev_num }}</td>
                    <td class="responsiveTblRow" @click="docRowClick(doc.ms_no)">{{ doc.doc_title }}</td>
                    <td class="responsiveTblRow text-center" @click="docRowClick(doc.ms_no)">{{ doc.from_comp_name }}</td>
                    <td class="responsiveTblRow" @click="docRowClick(doc.ms_no)">{{ doc.tr_doc_num }}</td>
                    <td class="responsiveTblRow text-center" @click="docRowClick(doc.ms_no)">{{ doc.doc_distribute_date_str }}</td>
                    <td class="responsiveTblRow text-center" @click="docRowClick(doc.ms_no)">{{ doc.doc_reply_date_str }}</td>
                    <td class="responsiveTblRow" @click="docRowClick(doc.ms_no)">{{ doc.doc_rfq_num }}</td>
                    <td class="responsiveTblRow" @click="docRowClick(doc.ms_no)">{{ doc.doc_rfq_title }}</td>
                    <td class="responsiveTblRow" @click="docRowClick(doc.ms_no)">{{ doc.doc_tag_item }}</td>
                    <td class="responsiveTblRow text-center" @click="docRowClick(doc.ms_no)">{{ doc.doc_cnt }}</td>
                    <td class="responsiveTblRow text-center" @click="docRowClick(doc.ms_no)">{{ doc.doc_status_nick }}</td>
                </tr>
            </tbody>
        </table>
    </div>
        <div class="alert alert-warning" v-show="noData">
        <strong>조건에 맞는 결과가 없습니다.</strong>
    </div>
    <ul class="pagination pagination-sm justify-content-center" v-html="pageList" @click="onPageNoClick($event)"></ul>
    <div class="row">
        <div class="col-md-8">
            <table class="table table-bordered table-sm" id="tblDocHistory" v-show="showHistory">
                <thead class="thead-light">
                    <tr>
                        <!-- <th><input type="checkbox" /></th> -->
                        <th>No</th>
                        <th>Rev.</th>
                        <th title="VP Discipline Code">공종</th>
                        <th>문서번호</th>
                        <th>TR No.</th>
                        <th>접수일</th>
                        <th>배포일</th>
                        <th>회신일</th>
                        <th title="Result Code">Rslt #</th>
                        <th title="Distribute">Dist.</th>
                        <th>Reply</th>
                    </tr>
                </thead>
                <tbody>
                    <tr :key="history.doc_no" v-for="history in docHistory" :class="{'rowActive' : (history.doc_no == selectHistory), 'resultFinal' : (history.doc_status_nick == 'F'), 'resultNull' : (history.doc_status_nick == '')}">
                        <!-- <td><input type="checkbox" /></td> -->
                        <td class="text-center" @click="historyRowClick(history.doc_no)">{{ history.rowno }}</td>
                        <td class="text-center" @click="historyRowClick(history.doc_no)">{{ history.doc_rev_num }}</td>
                        <td class="text-center" @click="historyRowClick(history.doc_no)">{{ history.func_cd }}</td>
                        <td @click="historyRowClick(history.doc_no)">{{ history.doc_num }}</td>
                        <td @click="historyRowClick(history.doc_no)">{{ history.tr_doc_num }}</td>
                        <td class="text-center" @click="historyRowClick(history.doc_no)">{{ history.hist_receive_date_str }}</td>
                        <td class="text-center" @click="historyRowClick(history.doc_no)">{{ history.hist_distribute_date_str }}</td>
                        <td class="text-center" @click="historyRowClick(history.doc_no)">{{ history.hist_reply_date_str }}</td>
                        <td class="text-center" @click="historyRowClick(history.doc_no)">{{ history.doc_status_nick }}</td>
                        <td class="text-center"><span class="downloadImg" @click="distributeDownload(history.doc_no)" title="배포문서 다운로드"><img src="../../../images/preview.png" /></span></td>
                        <td class="text-center"><span class="downloadImg" v-show="history.doc_status && history.doc_status_nick != 'F'" @click="IssueDownload(history.doc_no)" title="회신문서 다운로드"><img src="../../../images/outlook.png"/></span></td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div class="col-md-4 text-center" v-show="showHistory">
            <div class="container-fluid p-1 mb-1 border" id="previewPdf"></div>
        </div>
    </div>
</div>
<div class="alert alert-success text-center" v-show="!jno">
  <strong>PROJECT을 선택하세요.</strong>
</div>
<div id="modalLoading" class="modal modal-loading" data-backdrop="static" data-keyboard="false">
    <div class="modal-dialog modal-sm">
        <div class="modal-content">
            <i class="fa fa-spinner fa-pulse fa-3x text-primary"></i>
        </div>
    </div>
</div>
</form>
</div>
<script>
var vm = new Vue({
    el: '#app',
    data: {
        icon: '<i class="fa-solid fa-caret-up"></i>',
        collapse : false,
        latestList : [],
        docHistory : [],
        jno : sessionStorage.getItem("jno"),
        jobName : sessionStorage.getItem("jobName"),
        selectDoc : null,
        showHistory : false,
        pageNo : 1,
        totalCnt : null,
        totalCntString : null, 
        totalPage : null,
        naviOffset : 15,
        pageList : null,
        isRebrowsing : false,
        researchOption : 'so_all',
        researchText : '',
        searchList : {},
        selectHistory : null,
        searchHtml : '',
        selectList : [],
        checkList : [''],
        sd_start_date : '',
        sd_end_date : '',
        sdOption : '0',
        so_dc : '',
        so_rc : '',
        noData : false,
        researchSave : ''
    },
    created() {
        // 최신문서 데이터 불러오기
        this.getLatestData();

        // 날짜 min/max값 넣기
        dateMinMaxAppend();
    },
    computed: {
        allSelected: {
            get: function() {
                return this.checkList.length === this.selectList.length;
            },
            set: function(e) {
                this.selectList = e ? this.checkList : [];
            }
        }
    },
    methods: {
        //Tools 열고 닫기
        collapseChange() {
            if(this.collapse === false) {
                this.collapse = true;
                this.icon = '<i class="fa-solid fa-caret-down"></i>';
                $("#tools").collapse("hide");
            } else {
                this.collapse = false;
                this.icon = '<i class="fa-solid fa-caret-up"></i>';
                $("#tools").collapse("show");
            }
        },
        // 데이터 가져오기
        getLatestData() {
        var data = this;
            var jno = data.jno;
            var searchCondition = '';

            if(this.isRebrowsing) {
                $.each(this.searchList, function(i, condition) {
                    searchCondition += "&" + i + "=" + condition;
                });
            } else {
                searchCondition = "&" + this.researchOption + "=" + this.researchSave;
            }
            searchCondition += "&sd_type=" + this.sdOption + "&sd_start_date=" + this.sd_start_date + "&sd_end_date=" + this.sd_end_date;
            searchCondition += "&so_dc=" + this.so_dc + "&so_rc=" + this.so_rc;

            var url = '/api/vdcs/?api_key=&api_pass=BQRUQAMXBVY=&mode=latest&jno='+ jno + '&navi_page='+ this.pageNo +'&navi_offset=' + this.naviOffset + searchCondition;
            axios.get(url).then(
                function(response) {
                    var latest = response["data"];
                    if(latest["Message"] == "Success") {
                        var latestList = latest["Value"];
                        data.latestList = latestList;
                        
                        data.checkList = [];
                        // 체크박스 리스트
                        $.each(latestList, function(i, info) {
                            data.checkList.push(info["doc_no"]);
                        });
                        
                        // 페이지 요소 data에 저장
                        data.totalPage = latest["Navigator"]["TotalPage"];
                        data.totalCnt = latest["Navigator"]["TotalRow"];
                        data.totalCntString = numberToCommas(latest["Navigator"]["TotalRow"].toString());

                        // 페이지 정보
                        $("#pageInfo").show();

                        data.noData = false;
                    } else if(latest["Value"] == null) {
                        data.latestList = [];

                        data.pageNo = 1;
                        data.totalPage = 1;
                        data.totalCnt = 0;
                        data.totalCntString = 0;

                        // history 목록, pdf 숨기기
                        data.showHistory = false;
                        data.selectDoc = null;
                        data.noData = true;
                    }
                    // 페이징 바 가져오기
                    data.getPagination();
                    // 선택 박스 초기화
                    data.selectList = [];
            })
            .finally(function () {
                // 검색 배경
                // if(data.researchOption == "so_all" && data.researchSave) {
                //     $(".tblLatestList td").each(function() {
                //         if($(this).text().match(data.researchSave)) {
                //             const redRegExp = new RegExp(data.researchSave);

                //             var ans = $(this).text().replace(redRegExp, "<span style='background-color:pink'>" + data.researchSave + "</span>")
                //             $(this).html(ans);
                //         }
                //     });
                // } else if (data.researchOption != "so_all" && data.researchSave) {
                //     $("." + data.researchOption).each(function() {
                //         if($(this).text().match(data.researchSave)) {
                //             const redRegExp = new RegExp(data.researchSave);

                //             var ans = $(this).text().replace(redRegExp, "<span style='background-color:pink'>" + data.researchSave + "</span>")
                //             $(this).html(ans);
                //         }
                //     });
                // }
            });
        },
        // 행 클릭
        docRowClick(docNum) {
            // Latest 행 active
            this.selectDoc = docNum;
            // docHistory Table 활성화
            this.showHistory = true;

            var data = this;
            var jno = data.jno;

            axios.get('/api/vdcs/?api_key=&api_pass=BQRUQAMXBVY=&mode=doc_history&jno='+ jno + '&ms_no=' + docNum ).then(
                function(response) {
                    var docHistory = response["data"];
                    if(docHistory["Message"] == "Success") {
                        var docHistory = docHistory["Value"];
                        data.docHistory = docHistory
                        data.selectHistory = docHistory[0]["doc_no"];
                        data.historyRowClick(data.selectHistory);
                    };
                }
            );
        },
        // 페이징바 가져오기
        getPagination() {
            var property = this;

            var url = '../../../common/pagination.php';
            var data = {
                pageNo : this.pageNo,
                totalCnt : this.totalCnt,
                customPageUnit : this.naviOffset
            }
            axios.post(url, data)
            .then(function(response) {
                property.pageList = response["data"]["pageList"];
            })
            .catch(function(error){
                console.log(error);
            });
        },
        // 페이지 이동하기
        onPageNoClick(event) {
            var obj = event.target.tagName;
            
            if(obj == "A") {
                var pageId = event.target.id;
                if(pageId) {
                    pageNo = pageId.split('_');
                    if(this.pageNo != pageNo[1]) {
                        this.pageNo = pageNo[1];
                        this.getLatestData();
                        this.showHistory = false;
                        this.selectDoc = null;
                        this.selectList = [];
                    }
                }
            } else if (obj == "I") {
                pageId = $(event.target).closest("a").attr("id");
                pageNo = pageId.split('_');
                if(this.pageNo != pageNo[1]) {
                    this.pageNo = pageNo[1];
                    this.getLatestData();
                    this.showHistory = false;
                    this.selectDoc = null;
                    this.selectList = [];
                }
            }
        },
        // 검색 버튼
        btnSearchClick() {
            // 결과 내 재검색 on
            if(this.isRebrowsing == true) {
                var extOption = Object.keys(this.searchList).includes(this.researchOption);

                if(extOption) {
                    var element = this.searchList[this.researchOption].split("♡");

                    var overlap = 0
                    var data = this;
                    $.each(element, function(i, text) {
                        if(text == data.researchText) {
                            overlap++;
                        }
                    });

                    if(overlap == 0) {
                        if(this.researchText) {
                            this.searchList[this.researchOption] = this.searchList[this.researchOption] + '♡' + this.researchText
                        }
                    }
                } else {
                    if(this.researchText) {
                        this.searchList[this.researchOption] = this.researchText;
                    }
                }
                this.updateWord();

                this.pageNo = 1;
                this.getLatestData();

                // 검색창 초기화
                this.researchText = '';
            } else {
                this.pageNo = 1;
                this.researchSave = this.researchText;
                this.getLatestData();
            }
        },
        // Distribute File 다운로드
        distributeDownload(doc_no) {
            location.href = '/api/vdcs/?api_key=&api_pass=BQRUQAMXBVY=&model=DOC_DE_DOWNLOAD&jno='+ this.jno +'&doc_no='+ doc_no;
        },
        // Issue File 다운로드
        IssueDownload(doc_no) {
            location.href = '/api/vdcs/?api_key=&api_pass=BQRUQAMXBVY=&model=DOC_RE_DOWNLOAD&jno='+ this.jno +'&doc_no='+ doc_no;
        },
        // History 행 클릭
        historyRowClick(doc_no) {
            // Histroy 행 active
            this.selectHistory = doc_no;

            // Pdf 미리보기
            $("#previewPdf").load('../../../pdfjs-3.0.279-dist/web/pdfSmViewer.php?jno=' + this.jno + '&doc_no=' + this.selectHistory);
        },
        // 검색어 삭제
        deleteWord(event) {
            var obj = event.target;
            // 검색옵션 삭제
            if($(obj).hasClass("deleteOption")) {
                var optionNm = $(obj).siblings("span").attr("class");
                delete this.searchList[optionNm];
                this.updateWord();
            }
            // 검색어 삭제 
            else if($(obj).hasClass("deleteWord")) {
                var optionNm = $(obj).siblings("span").attr("class");
                var wordNm = $(obj).siblings("span").text();

                var searchElement = this.searchList[optionNm].split("♡");

                searchElement = searchElement.filter(function(data) {
                    return data != wordNm
                });

                if(searchElement.length == 0) {
                    delete this.searchList[optionNm];
                } else {
                    this.searchList[optionNm] = searchElement.join('♡');
                }

                this.updateWord();
            }

            this.btnSearchClick();
        },
        // 검색어 업데이트
        updateWord() {
            var data = this;
            data.searchHtml = '';
            $.each(data.searchList, function(i, text) {
                var optionNm = $('option[value="'+ i +'"]').text();
                data.searchHtml += '<span class="badge badge-info mr-2" style="font-size:small">';
                data.searchHtml += '<span class="'+ i +'">' + optionNm + '</span>';
                data.searchHtml += ' <span class="deleteOption" style="color:black;cursor:pointer">X</span></span>';

                var searchElement = text.split("♡");
                $.each(searchElement, function(j, element) {
                    data.searchHtml += '<span class="mr-2" style="background-color:#CCE5FF">';
                    data.searchHtml += '<span class="'+ i +'">' + element + '</span>';
                    data.searchHtml += ' ' + '<span class="deleteWord" style="color:black;cursor:pointer;">X</span></span>';
                });
            });
            if(data.so_dc != '') {
                data.searchHtml += '<span class="badge badge-info mr-2" style="font-size:small">';
                data.searchHtml += '<span class="공종(Disc.)">공종(Disc.)</span>';
                data.searchHtml += '</span>';
                data.searchHtml += '<span class="mr-2" style="background-color:#CCE5FF">';
                data.searchHtml += '<span class="'+ data.so_dc +'">' + data.so_dc + '</span>';
                data.searchHtml += '</span>';
            }
            if(data.so_rc != '') {
                data.searchHtml += '<span class="badge badge-info mr-2" style="font-size:small">';
                data.searchHtml += '<span class="Result#">Result#</span>';
                data.searchHtml += '</span>';
                data.searchHtml += '<span class="mr-2" style="background-color:#CCE5FF">';
                data.searchHtml += '<span class="'+ data.so_rc +'">' + data.so_rc + '</span>';
                data.searchHtml += '</span>';
            }
        },
        // 결과 내 검색 사용여부
        isUseRebrowsing() {
            if(this.isRebrowsing) {
                this.searchList = {}
                this.searchHtml = ''
                this.getLatestData();
            } else {
                if(this.researchText) {
                    this.searchList[this.researchOption] = this.researchText;
                    this.researchText = '';
                }
                this.updateWord();
            }
        },
        // 선택 다운로드
        selDocDownload() {
            var selDoc = this.selectList.join(",")

            location.href = '/api/vdcs/?api_key=&api_pass=BQRUQAMXBVY=&model=DOC_LE_DOWNLOAD&jno='+ this.jno +'&doc_no=' + selDoc;
        },
        // 최신목록 내보내기
        exportLatestExcel() {
            var url = '/vdcs/document/latest/latest_list_download_excel.php?jno=' + this.jno + "&jobName=" + this.jobName;
            location.href = url;
            var data = this;

            $("#modalLoading").modal("show");

            var loadingBar = setInterval(function() {
                var name = "fileDownload";
                var value = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
                if(value) {
                    if(value[2] == 1) {
                        $("#modalLoading").modal("hide");
                        data.deleteCookie(name);
                        clearInterval(loadingBar);
                    }
                }
            }, 1000)
        },
        // 전체 다운로드
        allDocDownload() {
            var data = this;
            // 다운로드 파일 정보 가져오기
            var url = "/api/vdcs/?api_key=&api_pass=BQRUQAMXBVY=&model=LATEST_ZIP_INFO&jno=" + data.jno;
            axios.post(url)
            .then(function(response) {
                if((response["data"]["Message"]) == "Success") {
                    var value = response["data"]["Value"];
                    $("#confirmModal .modal-body").html(`전체 다운로드는 대용량인 관계로 전일 22시를 기준으로 생성됩니다.<br />
                                                        이점 감안하시기 바랍니다.<br /><br />
                                                        - 파일 생성일자 : ${value["file_date_str"]}<br />
                                                        - 파일 크기 : ${value["file_size_str"]}`);
                    $("#confirmModal").modal("show");
                }
            })
            .catch(function(error){
                console.log(error);
            });

            $("#btnConfirm").on("click", async function() {
                $("#modalLoading").modal("show");

                axios({
                    url: "/api/vdcs/?api_key=&api_pass=BQRUQAMXBVY=&model=LATEST_ZIP_DOWNLOAD&jno=" + data.jno,
                    method: "GET", // 혹은 'POST'
                    responseType: "blob", // 응답 데이터 타입 정의
                }).then((response) => {
                    // 다운로드 파일 이름을 추출하는 함수
                    const extractDownloadFilename = (response) => {
                        const disposition = response.headers["content-disposition"];
                        const fileName = decodeURI(
                        disposition
                            .match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/)[1]
                            .replace(/['"]/g, "")
                        );
                        return fileName;
                    };
                    const blob = new Blob([response.data]);
                    const fileObjectUrl = window.URL.createObjectURL(blob);

                    const link = document.createElement("a");
                    link.href = fileObjectUrl;
                    link.style.display = "none";
                    link.download = extractDownloadFilename(response);

                    // 다운로드 파일의 이름은 직접 지정 할 수 있습니다.
                    // link.download = "sample-file.xlsx";

                    // 링크를 body에 추가하고 강제로 click 이벤트를 발생시켜 파일 다운로드를 실행시킵니다.
                    document.body.appendChild(link);
                    link.click();
                    link.remove();

                    // 다운로드가 끝난 리소스(객체 URL)를 해제합니다.
                    window.URL.revokeObjectURL(fileObjectUrl);
                }).finally(function() {
                    $("#modalLoading").modal("hide");
                })
            });
        },
        // 쿠키 삭제
        deleteCookie(name) {
            document.cookie = name + '=; expires=Thu, 01 Jan 1999 00:00:10 GMT;';
        }
    }
})
</script>
<style>
.tblLatestList td {
    cursor:pointer;
}
/* #tblLatestList tbody tr:hover {
    background-color:#FFE5CC;
} */
.rowActive {
    background-color:#FFE5CC;
}
.downloadImg{
    cursor:pointer;
}
.resultFinal {
    color:blue;
}
.resultNull {
    font-style: italic;
}
</style>

'웹 싱니 > VDCS WEB (22.10 ~ 23.02)' 카테고리의 다른 글

분석 및 설계  (0) 2022.12.21

유스케이스 다이어그램
관계 위주 ERD

'웹 싱니 > VDCS WEB (22.10 ~ 23.02)' 카테고리의 다른 글

Latest 페이지  (0) 2023.01.13

+ Recent posts