|
|
@@ -0,0 +1,936 @@
|
|
|
+<% layout('/layouts/default.html', {title: '来料检与入库', libs: []}){ %>
|
|
|
+
|
|
|
+<div class="main-content">
|
|
|
+
|
|
|
+ <div class="box box-main">
|
|
|
+
|
|
|
+ <div class="box-header">
|
|
|
+
|
|
|
+ <div class="box-title">
|
|
|
+
|
|
|
+ <i class="fa fa-check-square-o"></i> ${text('增加采购入库 - 来料检')}:${billNo!}
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="box-tools pull-right">
|
|
|
+
|
|
|
+ <a href="javascript:void(0)" class="btn btn-primary" id="btnSubmitInStock"><i class="fa fa-check"></i> ${text('检验OK并入库')}</a>
|
|
|
+
|
|
|
+ <a href="${ctx}/mes/erpInStock/selectDetail?billNo=${billNo!}" class="btn btn-default addTabPage" title="${text('返回')}"><i class="fa fa-mail-reply"></i> ${text('返回')}</a>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="box-body">
|
|
|
+
|
|
|
+ <% if (isNotBlank(message!)) { %>
|
|
|
+
|
|
|
+ <div class="alert alert-warning">${message}</div>
|
|
|
+
|
|
|
+ <% } %>
|
|
|
+
|
|
|
+ <div class="alert alert-info">
|
|
|
+
|
|
|
+ <i class="fa fa-info-circle"></i>
|
|
|
+
|
|
|
+ ${text('多行合并一张入库单,请先选择入库仓库;启用仓位的仓库请选择入库仓位。批号管理物料请从 ERP 批号档案选择,也可手工录入到货批号。')}
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="row" style="margin-bottom:12px;">
|
|
|
+
|
|
|
+ <div class="col-xs-12 col-sm-6">
|
|
|
+
|
|
|
+ <label class="control-label">${text('采购订单')}:</label>
|
|
|
+
|
|
|
+ <a href="${ctx}/mes/erpPurchaseOrder/detail?billNo=${billNo!}" class="addTabPage">${billNo!}</a>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-xs-12 col-sm-6">
|
|
|
+ <label class="control-label">${text('入库行数')}:</label>
|
|
|
+ <span id="lineCount">${detailList.~size}</span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="row" style="margin-bottom:12px;">
|
|
|
+
|
|
|
+ <div class="col-xs-12 col-sm-6">
|
|
|
+
|
|
|
+ <label class="control-label"><span class="required">*</span> ${text('入库仓库')}:</label>
|
|
|
+
|
|
|
+ <% if(stockList.~size == 0){ %>
|
|
|
+
|
|
|
+ <div class="alert alert-warning" style="margin-top:6px;padding:8px 12px;">${text('未能从 ERP 加载仓库列表,请检查组织与 ERP 连接')}</div>
|
|
|
+
|
|
|
+ <% }else{ %>
|
|
|
+
|
|
|
+ <select id="stockNumber" class="form-control" style="max-width:420px;">
|
|
|
+
|
|
|
+ <% for(stock in stockList){ %>
|
|
|
+
|
|
|
+ <option value="${stock.stockNumber!}" <% if(stock.stockNumber == defaultStockNumber){ %>selected<% } %>>${stock.displayLabel!}</option>
|
|
|
+
|
|
|
+ <% } %>
|
|
|
+
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <% } %>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-xs-12 col-sm-6" id="stockLocWrap">
|
|
|
+
|
|
|
+ <label class="control-label"><span class="required" id="stockLocRequiredMark" style="display:none;">*</span> ${text('入库仓位')}:</label>
|
|
|
+
|
|
|
+ <div class="stock-loc-row">
|
|
|
+ <input type="hidden" id="stockLocNumber" value=""/>
|
|
|
+ <input type="text" id="stockLocDisplay" class="form-control" readonly="readonly"
|
|
|
+ placeholder="${text('请点击右侧按钮选择仓位')}"/>
|
|
|
+ <a href="javascript:void(0)" class="btn btn-primary" id="btnStockLocSearch" style="display:none;">
|
|
|
+ <i class="fa fa-search"></i> ${text('选仓位')}
|
|
|
+ </a>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <small id="stockLocHint" class="text-muted"></small>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="inspect-table-wrap">
|
|
|
+ <table class="table table-bordered table-hover inspect-table" id="inspectTable">
|
|
|
+ <thead>
|
|
|
+ <tr>
|
|
|
+ <th class="col-seq">${text('行号')}</th>
|
|
|
+ <th class="col-material-no">${text('物料编码')}</th>
|
|
|
+ <th class="col-material-name">${text('物料名称')}</th>
|
|
|
+ <th class="col-qty">${text('剩余可入')}</th>
|
|
|
+ <th class="col-qty">${text('本次检验数量')}</th>
|
|
|
+ <th class="col-lot">${text('批号')}</th>
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <tbody>
|
|
|
+ <% for(detail in detailList){ %>
|
|
|
+ <% var lotVal = detail.lotNumber!''; if (isBlank(lotVal)) { lotVal = detail.suggestedLotNumber!''; } %>
|
|
|
+ <% var remainText = @com.jeesite.modules.mes.erp.ErpKingdeeParseUtils.formatDisplayQty(detail.remainQty); %>
|
|
|
+ <tr class="inspect-row"
|
|
|
+ data-entry-id="${detail.entryId!}"
|
|
|
+ data-seq="${detail.seq!}"
|
|
|
+ data-remain="${remainText}"
|
|
|
+ data-batch-manage="${detail.batchManage ? '1' : '0'}"
|
|
|
+ data-material="${detail.materialNumber!}"
|
|
|
+ data-material-name="${detail.materialName!}">
|
|
|
+ <td class="text-center">${detail.seq!}</td>
|
|
|
+ <td>${detail.materialNumber!}</td>
|
|
|
+ <td>${detail.materialName!}</td>
|
|
|
+ <td class="text-right">${remainText} ${detail.unitName!}</td>
|
|
|
+ <td>
|
|
|
+ <input type="number" class="form-control input-sm inspect-qty" value="${remainText}" min="0" step="any"/>
|
|
|
+ </td>
|
|
|
+ <td class="lot-cell">
|
|
|
+ <% if(!detail.batchManage){ %>
|
|
|
+ <span class="text-muted">${text('无需批号')}</span>
|
|
|
+ <% }else{ %>
|
|
|
+ <div class="instock-lot-wrap">
|
|
|
+ <input type="hidden" class="instock-lot-value" value="${lotVal}"/>
|
|
|
+ <div class="instock-lot-row">
|
|
|
+ <a href="javascript:void(0)" class="btn btn-xs btn-primary instock-lot-open"
|
|
|
+ data-entry-id="${detail.entryId!}"
|
|
|
+ data-material="${detail.materialNumber!}"
|
|
|
+ data-material-name="${detail.materialName!}">
|
|
|
+ <i class="fa fa-search"></i> ${text('选批号')}
|
|
|
+ </a>
|
|
|
+ <input type="text" class="form-control input-sm instock-lot-input"
|
|
|
+ value="${lotVal}"
|
|
|
+ placeholder="${text('手工录入新批号')}" maxlength="100"/>
|
|
|
+ </div>
|
|
|
+ <% if(isNotBlank(detail.lotHint!)) { %>
|
|
|
+ <small class="instock-lot-hint" title="${detail.lotHint!}">${detail.lotHint!}</small>
|
|
|
+ <% } %>
|
|
|
+ </div>
|
|
|
+ <% } %>
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ <% } %>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+</div>
|
|
|
+
|
|
|
+<% } %>
|
|
|
+
|
|
|
+<style>
|
|
|
+.inspect-table-wrap {
|
|
|
+ overflow-x: auto;
|
|
|
+ overflow-y: visible;
|
|
|
+ -webkit-overflow-scrolling: touch;
|
|
|
+ margin-bottom: 0;
|
|
|
+}
|
|
|
+.inspect-table {
|
|
|
+ min-width: 1120px;
|
|
|
+ margin-bottom: 0;
|
|
|
+}
|
|
|
+.inspect-table .col-seq { width: 60px; min-width: 60px; }
|
|
|
+.inspect-table .col-material-no { min-width: 160px; }
|
|
|
+.inspect-table .col-material-name { min-width: 140px; white-space: normal; }
|
|
|
+.inspect-table .col-qty { width: 110px; min-width: 110px; white-space: nowrap; }
|
|
|
+.inspect-table .col-lot { min-width: 360px; white-space: normal; }
|
|
|
+.inspect-table .inspect-qty { width: 100%; min-width: 90px; max-width: 110px; }
|
|
|
+.instock-lot-wrap { min-width: 340px; }
|
|
|
+.instock-lot-row { display: flex; align-items: center; gap: 8px; flex-wrap: nowrap; }
|
|
|
+.instock-lot-row .instock-lot-open { flex: 0 0 auto; white-space: nowrap; }
|
|
|
+.instock-lot-row .instock-lot-input { flex: 1 1 auto; min-width: 160px; max-width: 240px; }
|
|
|
+.instock-lot-hint {
|
|
|
+ display: block;
|
|
|
+ margin-top: 6px;
|
|
|
+ line-height: 1.4;
|
|
|
+ font-size: 11px;
|
|
|
+ color: #888;
|
|
|
+ max-width: 420px;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+}
|
|
|
+.lot-search-table-wrap { overflow: auto; max-height: 340px; }
|
|
|
+.stock-loc-search-table-wrap { overflow: auto; max-height: 360px; min-height: 240px; -webkit-overflow-scrolling: touch; }
|
|
|
+.stock-loc-row { display: flex; align-items: center; gap: 8px; max-width: 420px; flex-wrap: nowrap; }
|
|
|
+.stock-loc-row #stockLocDisplay { flex: 1 1 auto; min-width: 0; background: #fff; cursor: default; }
|
|
|
+.stock-loc-row #btnStockLocSearch { flex: 0 0 auto; white-space: nowrap; }
|
|
|
+</style>
|
|
|
+
|
|
|
+<script id="lotSearchTpl" type="text/template">//<!--
|
|
|
+
|
|
|
+<div class="form-horizontal" style="padding:12px;">
|
|
|
+
|
|
|
+ <div class="form-group" style="margin-bottom:8px;">
|
|
|
+
|
|
|
+ <label class="control-label col-sm-3">${text('物料编码')}</label>
|
|
|
+
|
|
|
+ <div class="col-sm-9"><p class="form-control-static">{{d.materialNumber}}</p></div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="form-group" style="margin-bottom:8px;">
|
|
|
+
|
|
|
+ <label class="control-label col-sm-3">${text('物料名称')}</label>
|
|
|
+
|
|
|
+ <div class="col-sm-9"><p class="form-control-static">{{d.materialName}}</p></div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="form-group" style="margin-bottom:8px;">
|
|
|
+
|
|
|
+ <label class="control-label col-sm-3">${text('批号')}</label>
|
|
|
+
|
|
|
+ <div class="col-sm-6"><input type="text" id="lotKeyword" class="form-control input-sm" placeholder="${text('批号关键字')}"/></div>
|
|
|
+
|
|
|
+ <div class="col-sm-3"><button type="button" id="btnLotSearch" class="btn btn-primary btn-sm btn-block"><i class="fa fa-search"></i> ${text('查询')}</button></div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div id="lotSearchHint" class="text-muted" style="margin-bottom:6px;"></div>
|
|
|
+
|
|
|
+ <div id="lotSearchResult"></div>
|
|
|
+
|
|
|
+</div>
|
|
|
+
|
|
|
+//--></script>
|
|
|
+
|
|
|
+<script id="stockLocSearchTpl" type="text/template">//<!--
|
|
|
+
|
|
|
+<div class="form-horizontal" style="padding:12px;">
|
|
|
+
|
|
|
+ <div class="form-group" style="margin-bottom:8px;">
|
|
|
+
|
|
|
+ <label class="control-label col-sm-3">${text('仓位编码')}</label>
|
|
|
+
|
|
|
+ <div class="col-sm-6"><input type="text" id="stockLocKeyword" class="form-control input-sm" placeholder="${text('编码或名称关键字')}"/></div>
|
|
|
+
|
|
|
+ <div class="col-sm-3"><button type="button" id="btnStockLocFilter" class="btn btn-primary btn-sm btn-block"><i class="fa fa-search"></i> ${text('搜索')}</button></div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div id="stockLocSearchHint" class="text-muted" style="margin-bottom:6px;"></div>
|
|
|
+
|
|
|
+ <div id="stockLocSearchResult"></div>
|
|
|
+
|
|
|
+</div>
|
|
|
+
|
|
|
+//--></script>
|
|
|
+
|
|
|
+<script>
|
|
|
+
|
|
|
+var lotSearchUrl = '${ctx}/mes/erpInStock/lotSearch';
|
|
|
+
|
|
|
+var stockLocOptionsUrl = '${ctx}/mes/erpInStock/stockLocOptions';
|
|
|
+
|
|
|
+var stockLocRequired = false;
|
|
|
+
|
|
|
+var stockLocOptions = [];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function formatStockLocLabel(loc) {
|
|
|
+
|
|
|
+ if (!loc) return '';
|
|
|
+
|
|
|
+ var locNo = loc.locNumber || '';
|
|
|
+
|
|
|
+ var locName = loc.locName || '';
|
|
|
+
|
|
|
+ if (loc.displayLabel) {
|
|
|
+
|
|
|
+ return loc.displayLabel;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!locName || locName === locNo) {
|
|
|
+
|
|
|
+ return locNo;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return locNo + ' ' + locName;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function applyStockLocSelection(loc) {
|
|
|
+
|
|
|
+ if (!loc || !loc.locNumber) return;
|
|
|
+
|
|
|
+ $('#stockLocNumber').val(loc.locNumber);
|
|
|
+
|
|
|
+ $('#stockLocDisplay').val(formatStockLocLabel(loc));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function clearStockLocSelection() {
|
|
|
+
|
|
|
+ $('#stockLocNumber').val('');
|
|
|
+
|
|
|
+ $('#stockLocDisplay').val('');
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function filterStockLocOptions(keyword) {
|
|
|
+
|
|
|
+ var kw = $.trim(keyword || '').toLowerCase();
|
|
|
+
|
|
|
+ if (kw === '') {
|
|
|
+
|
|
|
+ return stockLocOptions.slice(0);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var matched = [];
|
|
|
+
|
|
|
+ for (var i = 0; i < stockLocOptions.length; i++) {
|
|
|
+
|
|
|
+ var loc = stockLocOptions[i];
|
|
|
+
|
|
|
+ var locNo = (loc.locNumber || '').toLowerCase();
|
|
|
+
|
|
|
+ var locName = (loc.locName || '').toLowerCase();
|
|
|
+
|
|
|
+ var label = formatStockLocLabel(loc).toLowerCase();
|
|
|
+
|
|
|
+ if (locNo.indexOf(kw) >= 0 || locName.indexOf(kw) >= 0 || label.indexOf(kw) >= 0) {
|
|
|
+
|
|
|
+ matched.push(loc);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return matched;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function renderStockLocSearchTable(locations) {
|
|
|
+
|
|
|
+ if (!locations || locations.length === 0) {
|
|
|
+
|
|
|
+ return '<div class="text-muted" style="padding:10px;">${text("未查到符合条件的仓位")}</div>';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var html = '<div class="stock-loc-search-table-wrap"><table class="table table-bordered table-hover table-condensed"><thead><tr>'+
|
|
|
+
|
|
|
+ '<th style="width:220px;">${text("仓位编码")}</th><th>${text("名称")}</th><th style="width:80px;">${text("操作")}</th></tr></thead><tbody>';
|
|
|
+
|
|
|
+ for (var i = 0; i < locations.length; i++) {
|
|
|
+
|
|
|
+ var loc = locations[i];
|
|
|
+
|
|
|
+ var locNo = loc.locNumber || '';
|
|
|
+
|
|
|
+ var locName = loc.locName || '';
|
|
|
+
|
|
|
+ if (locName === locNo) locName = '';
|
|
|
+
|
|
|
+ html += '<tr><td>'+escapeHtml(locNo)+'</td><td>'+escapeHtml(locName)+'</td><td align="center">'+
|
|
|
+
|
|
|
+ '<button type="button" class="btn btn-xs btn-primary stock-loc-pick" data-loc-number="'+escapeHtml(locNo)+'">${text("选择")}</button></td></tr>';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ html += '</tbody></table></div>';
|
|
|
+
|
|
|
+ return html;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function openStockLocSearchPopup() {
|
|
|
+
|
|
|
+ if (!stockLocRequired || stockLocOptions.length === 0) {
|
|
|
+
|
|
|
+ js.showMessage('${text("当前仓库暂无仓位可选")}');
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ js.layer.open({
|
|
|
+
|
|
|
+ type: 1,
|
|
|
+
|
|
|
+ area: ['640px', '480px'],
|
|
|
+
|
|
|
+ title: '${text("ERP 仓位选择")}',
|
|
|
+
|
|
|
+ resize: false,
|
|
|
+
|
|
|
+ scrollbar: true,
|
|
|
+
|
|
|
+ content: js.template('stockLocSearchTpl', {}),
|
|
|
+
|
|
|
+ success: function(layero, index) {
|
|
|
+
|
|
|
+ layero = $(layero);
|
|
|
+
|
|
|
+ var pickLoc = function(loc) {
|
|
|
+
|
|
|
+ applyStockLocSelection(loc);
|
|
|
+
|
|
|
+ js.layer.close(index);
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ var findLocByNumber = function(locNo) {
|
|
|
+
|
|
|
+ if (!locNo) return null;
|
|
|
+
|
|
|
+ for (var i = 0; i < stockLocOptions.length; i++) {
|
|
|
+
|
|
|
+ if (stockLocOptions[i].locNumber === locNo) {
|
|
|
+
|
|
|
+ return stockLocOptions[i];
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ var renderList = function(list) {
|
|
|
+
|
|
|
+ layero.find('#stockLocSearchHint').text('${text("共")} ' + list.length + ' ${text("条,可滚动浏览列表,也可输入关键字搜索")}');
|
|
|
+
|
|
|
+ layero.find('#stockLocSearchResult').html(renderStockLocSearchTable(list));
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ var doSearch = function() {
|
|
|
+
|
|
|
+ renderList(filterStockLocOptions(layero.find('#stockLocKeyword').val()));
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ layero.off('click.stockLocPick').on('click.stockLocPick', '.stock-loc-pick', function(e) {
|
|
|
+
|
|
|
+ e.preventDefault();
|
|
|
+
|
|
|
+ var loc = findLocByNumber($(this).attr('data-loc-number'));
|
|
|
+
|
|
|
+ if (loc) pickLoc(loc);
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ layero.find('#btnStockLocFilter').off('click').on('click', doSearch);
|
|
|
+
|
|
|
+ layero.find('#stockLocKeyword').off('keypress').on('keypress', function(e){ if (e.which === 13) doSearch(); });
|
|
|
+
|
|
|
+ layero.find('#stockLocKeyword').off('input.stockLocFilter').on('input.stockLocFilter', function() {
|
|
|
+
|
|
|
+ doSearch();
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ doSearch();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function loadStockLocOptions() {
|
|
|
+
|
|
|
+ var stockNumber = $.trim($('#stockNumber').val() || '');
|
|
|
+
|
|
|
+ var $wrap = $('#stockLocWrap');
|
|
|
+
|
|
|
+ var $hint = $('#stockLocHint');
|
|
|
+
|
|
|
+ var $requiredMark = $('#stockLocRequiredMark');
|
|
|
+
|
|
|
+ var $searchBtn = $('#btnStockLocSearch');
|
|
|
+
|
|
|
+ if (stockNumber === '') {
|
|
|
+
|
|
|
+ $wrap.hide();
|
|
|
+
|
|
|
+ stockLocRequired = false;
|
|
|
+
|
|
|
+ stockLocOptions = [];
|
|
|
+
|
|
|
+ clearStockLocSelection();
|
|
|
+
|
|
|
+ $hint.text('');
|
|
|
+
|
|
|
+ $requiredMark.hide();
|
|
|
+
|
|
|
+ $searchBtn.hide();
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ $wrap.show();
|
|
|
+
|
|
|
+ clearStockLocSelection();
|
|
|
+
|
|
|
+ $('#stockLocDisplay').attr('placeholder', '${text("加载中...")}');
|
|
|
+
|
|
|
+ $hint.text('');
|
|
|
+
|
|
|
+ $searchBtn.hide();
|
|
|
+
|
|
|
+ $.get(stockLocOptionsUrl, { stockNumber: stockNumber }, function(data){
|
|
|
+
|
|
|
+ stockLocOptions = (data && data.locations) ? data.locations : [];
|
|
|
+
|
|
|
+ stockLocRequired = !!(data && data.required);
|
|
|
+
|
|
|
+ if (stockLocRequired) {
|
|
|
+
|
|
|
+ $requiredMark.show();
|
|
|
+
|
|
|
+ $searchBtn.show();
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ $requiredMark.hide();
|
|
|
+
|
|
|
+ $searchBtn.hide();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var defaultLoc = (data && data.defaultLocNumber) ? data.defaultLocNumber : '';
|
|
|
+
|
|
|
+ if (stockLocOptions.length === 0) {
|
|
|
+
|
|
|
+ $('#stockLocDisplay').val('').attr('placeholder', '--');
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ $('#stockLocDisplay').attr('placeholder', '${text("请点击右侧按钮选择仓位")}');
|
|
|
+
|
|
|
+ if (defaultLoc !== '') {
|
|
|
+
|
|
|
+ for (var i = 0; i < stockLocOptions.length; i++) {
|
|
|
+
|
|
|
+ if (stockLocOptions[i].locNumber === defaultLoc) {
|
|
|
+
|
|
|
+ applyStockLocSelection(stockLocOptions[i]);
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ $hint.text((data && data.locHint) ? data.locHint : '');
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+$(function(){
|
|
|
+
|
|
|
+ loadStockLocOptions();
|
|
|
+
|
|
|
+ $('#stockNumber').on('change', loadStockLocOptions);
|
|
|
+
|
|
|
+ $('#btnStockLocSearch, #stockLocDisplay').on('click', function(e) {
|
|
|
+
|
|
|
+ e.preventDefault();
|
|
|
+
|
|
|
+ openStockLocSearchPopup();
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+});
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function escapeHtml(text) {
|
|
|
+
|
|
|
+ if (text == null) return '';
|
|
|
+
|
|
|
+ return String(text).replace(/&/g,'&').replace(/"/g,'"').replace(/</g,'<').replace(/>/g,'>');
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function readRowLotNumber($row) {
|
|
|
+
|
|
|
+ var hidden = $.trim($row.find('.instock-lot-value').val() || '');
|
|
|
+
|
|
|
+ if (hidden !== '') return hidden;
|
|
|
+
|
|
|
+ return $.trim($row.find('.instock-lot-input').val() || '');
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function applyLotSelection(entryId, lotNumber, hint) {
|
|
|
+
|
|
|
+ var $row = $('tr.inspect-row[data-entry-id="'+entryId+'"]');
|
|
|
+
|
|
|
+ $row.find('.instock-lot-value').val(lotNumber);
|
|
|
+
|
|
|
+ $row.find('.instock-lot-input').val(lotNumber);
|
|
|
+
|
|
|
+ if (hint) {
|
|
|
+
|
|
|
+ var $hint = $row.find('.instock-lot-hint');
|
|
|
+
|
|
|
+ if ($hint.length === 0) {
|
|
|
+
|
|
|
+ $row.find('.instock-lot-wrap').append('<small class="text-success instock-lot-hint"></small>');
|
|
|
+
|
|
|
+ $hint = $row.find('.instock-lot-hint');
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ $hint.removeClass('text-muted text-warning text-danger').addClass('text-success').text(hint);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function renderLotSearchTable(lots) {
|
|
|
+
|
|
|
+ if (!lots || lots.length === 0) {
|
|
|
+
|
|
|
+ return '<div class="text-muted" style="padding:10px;">${text("未查到批号档案")}</div>';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var html = '<div class="lot-search-table-wrap"><table class="table table-bordered table-hover table-condensed"><thead><tr>'+
|
|
|
+
|
|
|
+ '<th style="width:220px;">${text("批号")}</th><th style="width:80px;">${text("操作")}</th></tr></thead><tbody>';
|
|
|
+
|
|
|
+ for (var i = 0; i < lots.length; i++) {
|
|
|
+
|
|
|
+ var lotNo = lots[i].lotNumber || '';
|
|
|
+
|
|
|
+ html += '<tr><td>'+escapeHtml(lotNo)+'</td><td align="center">'+
|
|
|
+
|
|
|
+ '<button type="button" class="btn btn-xs btn-primary lot-search-pick" data-idx="'+i+'">${text("选择")}</button></td></tr>';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ html += '</tbody></table></div>';
|
|
|
+
|
|
|
+ return html;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function openLotSearchPopup($btn) {
|
|
|
+
|
|
|
+ var entryId = String($btn.data('entry-id'));
|
|
|
+
|
|
|
+ var materialNumber = $btn.data('material') || '';
|
|
|
+
|
|
|
+ js.layer.open({
|
|
|
+
|
|
|
+ type: 1,
|
|
|
+
|
|
|
+ area: ['640px', '480px'],
|
|
|
+
|
|
|
+ title: '${text("ERP 批号档案")} - ' + ($btn.data('material-name') || materialNumber),
|
|
|
+
|
|
|
+ resize: false,
|
|
|
+
|
|
|
+ scrollbar: true,
|
|
|
+
|
|
|
+ content: js.template('lotSearchTpl', {
|
|
|
+
|
|
|
+ materialNumber: materialNumber,
|
|
|
+
|
|
|
+ materialName: $btn.data('material-name') || ''
|
|
|
+
|
|
|
+ }),
|
|
|
+
|
|
|
+ success: function(layero, index) {
|
|
|
+
|
|
|
+ layero = $(layero);
|
|
|
+
|
|
|
+ var currentLots = [];
|
|
|
+
|
|
|
+ var pickLot = function(lot) {
|
|
|
+
|
|
|
+ if (!lot || !lot.lotNumber) return;
|
|
|
+
|
|
|
+ applyLotSelection(entryId, lot.lotNumber, '${text("已选批号")} ' + lot.lotNumber);
|
|
|
+
|
|
|
+ js.layer.close(index);
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ var doSearch = function() {
|
|
|
+
|
|
|
+ layero.find('#lotSearchResult').html('<div class="text-muted" style="padding:10px;">${text("查询中...")}</div>');
|
|
|
+
|
|
|
+ $.getJSON(lotSearchUrl, {
|
|
|
+
|
|
|
+ materialNumber: materialNumber,
|
|
|
+
|
|
|
+ lotKeyword: $.trim(layero.find('#lotKeyword').val() || '')
|
|
|
+
|
|
|
+ }, function(data) {
|
|
|
+
|
|
|
+ currentLots = data.lots || [];
|
|
|
+
|
|
|
+ layero.find('#lotSearchHint').text(data.lotHint || '');
|
|
|
+
|
|
|
+ layero.find('#lotSearchResult').html(renderLotSearchTable(currentLots));
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ layero.off('click.lotPick').on('click.lotPick', '.lot-search-pick', function(e) {
|
|
|
+
|
|
|
+ e.preventDefault();
|
|
|
+
|
|
|
+ var idx = parseInt($(this).attr('data-idx'), 10);
|
|
|
+
|
|
|
+ if (isNaN(idx)) return;
|
|
|
+
|
|
|
+ pickLot(currentLots[idx]);
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ layero.find('#btnLotSearch').off('click').on('click', doSearch);
|
|
|
+
|
|
|
+ layero.find('#lotKeyword').off('keypress').on('keypress', function(e){ if (e.which === 13) doSearch(); });
|
|
|
+
|
|
|
+ doSearch();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+$(document).on('click', '.instock-lot-open', function(e) {
|
|
|
+
|
|
|
+ e.preventDefault();
|
|
|
+
|
|
|
+ openLotSearchPopup($(this));
|
|
|
+
|
|
|
+});
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+$(document).on('input', '.instock-lot-input', function() {
|
|
|
+
|
|
|
+ var $row = $(this).closest('tr.inspect-row');
|
|
|
+
|
|
|
+ $row.find('.instock-lot-value').val($.trim($(this).val()));
|
|
|
+
|
|
|
+});
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+$('#btnSubmitInStock').on('click', function(){
|
|
|
+
|
|
|
+ var lines = [];
|
|
|
+
|
|
|
+ var hasError = false;
|
|
|
+
|
|
|
+ $('#inspectTable tbody tr.inspect-row').each(function(){
|
|
|
+
|
|
|
+ var $row = $(this);
|
|
|
+
|
|
|
+ var entryId = $row.data('entry-id');
|
|
|
+
|
|
|
+ var seq = $row.data('seq');
|
|
|
+
|
|
|
+ var remainQty = parseFloat($row.data('remain')) || 0;
|
|
|
+
|
|
|
+ var batchManage = String($row.data('batch-manage')) === '1';
|
|
|
+
|
|
|
+ var inspectQty = parseFloat($row.find('.inspect-qty').val());
|
|
|
+
|
|
|
+ if (isNaN(inspectQty) || inspectQty <= 0) {
|
|
|
+
|
|
|
+ js.showMessage('${text("行")} ' + seq + ' ${text("请输入有效的检验数量")}');
|
|
|
+
|
|
|
+ hasError = true;
|
|
|
+
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (inspectQty > remainQty) {
|
|
|
+
|
|
|
+ js.showMessage('${text("行")} ' + seq + ' ${text("检验数量不能超过剩余可入数量")} ' + remainQty);
|
|
|
+
|
|
|
+ hasError = true;
|
|
|
+
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var line = { entryId: String(entryId), inspectQty: inspectQty };
|
|
|
+
|
|
|
+ if (batchManage) {
|
|
|
+
|
|
|
+ var lotNumber = readRowLotNumber($row);
|
|
|
+
|
|
|
+ if (lotNumber === '') {
|
|
|
+
|
|
|
+ js.showMessage('${text("行")} ' + seq + ' ${text("启用批号管理,请从 ERP 选择或手工录入批号")}');
|
|
|
+
|
|
|
+ hasError = true;
|
|
|
+
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ line.lotNumber = lotNumber;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ lines.push(line);
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ if (hasError) return;
|
|
|
+
|
|
|
+ if (lines.length === 0) {
|
|
|
+
|
|
|
+ js.showMessage('${text("没有可提交的入库明细")}');
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var stockNumber = $.trim($('#stockNumber').val() || '');
|
|
|
+
|
|
|
+ if (stockNumber === '') {
|
|
|
+
|
|
|
+ js.showMessage('${text("请选择入库仓库")}');
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var stockLocNumber = '';
|
|
|
+
|
|
|
+ if (stockLocRequired) {
|
|
|
+
|
|
|
+ stockLocNumber = $.trim($('#stockLocNumber').val() || '');
|
|
|
+
|
|
|
+ if (stockLocNumber === '') {
|
|
|
+
|
|
|
+ js.showMessage('${text("请选择入库仓位")}');
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ js.confirm('${text("确认提交")} ' + lines.length + ' ${text("行到 ERP 生成一张采购入库单?")}', function(){
|
|
|
+
|
|
|
+ $.ajax({
|
|
|
+
|
|
|
+ url: '${ctx}/mes/erpInStock/submitInStock',
|
|
|
+
|
|
|
+ type: 'POST',
|
|
|
+
|
|
|
+ contentType: 'application/json;charset=UTF-8',
|
|
|
+
|
|
|
+ data: JSON.stringify({ billNo: '${billNo!}', stockNumber: stockNumber, stockLocNumber: stockLocNumber, lines: lines }),
|
|
|
+
|
|
|
+ success: function(data){
|
|
|
+
|
|
|
+ js.showMessage(data.message);
|
|
|
+
|
|
|
+ if (data.result == Global.TRUE) {
|
|
|
+
|
|
|
+ window.location.href = '${ctx}/mes/erpInStock/list';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+});
|
|
|
+
|
|
|
+</script>
|
|
|
+
|